学自:狂神说
感谢UP主的付出!!
对于描述复杂的事物,为了从宏观上把握,从整体上合理分析,需要使用面向对象的思路分析整个系统。到微观操作时,仍然需要使用面向过程的思路来处理。
类名.方法名();
实例化 这个类 new
对象类型 对象名=对象值
类名 对象名= new 对象名();
对象.方法名();
public class Student {
//静态方法
public static void say() {
System.out.println("静态类创建的学生说话了!");
}
public void say1() {
System.out.println("非静态类创建的学生说话了!");
}
}
public static void main(String[] args) {
int a=1;
System.out.println("原来的值我为:"+a);
Application.change(a);
//分析:如果发生的是引用传递,a的值会变成10
System.out.println("最终的结果:"+a);//结果a=1
}
public static void change(int a) {
a=10;
}
public static void main(String[] args) {
Person person1 = new Person();
System.out.println(person1.name);//null
Application.chang(person1);
System.out.println(person1.name);
//引用传递的本质是值传递
//类只是一个模板,它的属性没有值,只有创建对象后,对象的属性进行操作
Person person2=new Person();
System.out.println(person2.name);
Application.chang(person2);
System.out.println(person2.name);
}
public static void chang(Person person) {
//person是具体的一个人,可以改变属性
person.name="酸梅汤小王子";
}
使用new关键字创建对象
使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点。
一个类即使什么都不写,它也会存在一个方法
显示的定义构造器
1. 使用new关键字,本质是调用构造器
2. 用来初始化值
有参构造:一旦定义了有参构造,无参构造就必须显示定义
构造器:
1. 和类名相同
2. 没有返回值
作用:
1.new 本质在调用构造方法
2.初始化对象的值
注意点:
1.定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
终极秘诀:属性私有,get/set
String name;//null
int age;//0
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age>120 || age<0) {
System.out.println("输入不合理!");
}
else {
this.age = age;
}
}
public static void main(String[] args) {
Student student=new Student();
student.setName("酸梅汤小王子");
System.out.println(student.getName());
student.setAge(666);
System.out.println(student.getAge());//默认是0
}
构造器的分类:①隐式构造器:系统自带的构造器,它是无参数的,给未赋值的成员变量赋予一个合适的初值。原始类型:0 引用类型:null
注意:书写任意一个显示构造器后,隐式构造器无法手动调用。
②显式构造器:程序员自己书写的构造器,一个类可以书写无数个构造器,new对象时根据实际参数来调用相应构造器,当书写显式构造器后,隐式构造器将无法调用。
//构造方法名必须和该类的类名保持一致,大小写都一样
//构造器没有返回值类型
public 构造方法名(无参数/参数){
...
}
重载可以简单理解为:同个方法名,不同的参数列表。
public class X{
//通过new X()调用
public X(){
}
//通过new X("字符串")调用
public X(String name){
}
}
定义父类构造器,由于该构造器自定义了一个带参构造器,覆盖了默认的无参构造器,所以不能直接 new Father() 调用了,除非再定义一个无参构造器。
//父类构造器
public class Father{
//自定义带参构造器
public Father(String name){
System.out.println("父类的带参构造方法!");
}
}
//子类构造器
public class Son extends Father{
//无参构造器
public Son(){
/*
由于Father()没有无参构造器,所以必须在子类型构造器中通过super("字符串")来调用
如果没定义这句,系统会默认调用super();
*/
super("");
}
//带参构造器
public Son(String name){
super(name);
}
}
public class Person {
public void say() {
System.out.println("人说了一句话");
}
}
public class Student extends Person {
}
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.say();
}
}
public class Person {
public void say() {
System.out.println("人说了一句话");
}
String name="爸爸";
}
public class Student extends Person {
String name="student";
public void text1()
{
System.out.println(name);
System.out.println(this.name);
System.out.println(super.name);
}
}
public class Application {
public static void main(String[] args) {
Student student=new Student();
student.text1();
}
}
重写:需要有继承关系,子类重写交类的方法!
一个对象的实际类型是确定的。
可以指向的引用类型就不确定了;父类的引用可以指向子类。
对象能执行那些方法,主要看对象左边的类型,和右边关系不大!
子类没有重写父类的方法,执行父类的方法;子类重写了父类的方法,执行子类的方法。
x instanceof y//x是实例,而y则是Class类
instanceof,相当于判断当前对象能不能装换成为该类型,java里面上转型是安全的,子类对象可以转换成为父类对象,接口实现类对象可以装换成为接口对象。
这个答案是:不知道什么类型,因为null可以转换成为任何类型,所以不属于任何类型,instanceof结果会是false。
方法名 | 详解 |
---|---|
instanceof | 判断对象和类型之间的关系,是关键字,只能用于对象实例,判断左边的对象是不是右边的类(包括父类)或者接口(包括父类)的实例化。【前面是实例对象,后面是类型】 |
isInstance | 判断对象和类型之间的关系,判断o是不是调用这个方法的class(包括父类)或者接口(包括父类)的实例化。【调用者(前面)是类型对象,参数(后面)是实例对象】 |
isAssignableFrom | 判断的是类和类之间的关系,调用者是否可以由参数中的Class对象转换而来。 |
注意:java里面一切皆是对象,所以,class本身也是对象。
父类转化为子类,可以正常使用子类的方法。
子类转化为父类,会丢失子类的方法。