JAVA基础知识点——多态性、toString (20200104)

一、 多态性的使用

  1. 理解多态性:一个事物的多种形态
  2. 何为多态性:对象的多态性:父类的引用指向子类的对象 Person ps=new Man();
  3. 多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法----虚拟方法调用
  4. 多态的使用前提: ①类的继承关系 ②方法的重写
    注意:对象的多态性只使用于方法,不适用于属性

二、多态使用举例
JAVA基础知识点——多态性、toString (20200104)JAVA基础知识点——多态性、toString (20200104)
三、虚拟方法调用在理解
1.正常的调用方法:
Person p=new Person();
p.getinfo();
Student st=new Student();
St.getinfo();
2. 虚拟方法调用(多态情况)
Person p=new Student();
p.getinfo() //调用student类的getinfo()方法

多态是编译时行为(直接看代码能知道结果)还是运行时行为(运行后才知道结果)?(面试题)
答:运行时行为

四、重载与重写?
1.重载是指允许存在多个同名方法,而这些参数不同,编译器会根据方法的不同参数表对同名的方法的名称修饰,对于编译器而言,这些同名的方法就成了不用得方法,他们的调用地址在编译期就绑定了,称为==“早绑定”“静态绑定”;多态只有等到调用方法,所以称为“晚绑定”“动态绑定”==.
2.重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!

五、子类对象实例化及多态性
1.从结果上看:
*子类继承父类以后,就获取了父类声明的属性或方法。
*创建子类对象,在堆空间中,就会加载所有父类中声明的属性。
2.从过程看:
*当我们通过子类构造器创建子类对象时,我们一定会直接或间接的调用父类的构造器,进而调用父类的父类构造器直到调用java.lang.object类中空参的构造器为止,正因为我们加载过父类的结构,所以我们才可以看到内存中父类的结构,子类对象才可以考虑进行调用。
3.图例
JAVA基础知识点——多态性、toString (20200104)
五、向下转型的使用
1.有了对象的多态性以后,不能调用子类特有的属性和方法;内存实际上是加载了子类特有的属性和方法,由于变量声明的是父类类型,导致编译时,只能调用父类的属性和方法,子类特有的属性和方法不能调用。
2.如何调用子类的属性和方法?
① 向下转型:使用强制转换符 可能会出现ClassCastException异常
Person p=new Man();
Man p1=(Man)p;
② Instanceof使用: a instanceof A :判断对象a是否是类A的实例,如果是返回true,否则返回false.
If(p instanceof woman){
Women m=(women)p
m.shopping();
}
使用情景:为了便面向下转型是出现ClassCateException异常,在转型前进行判断,一旦返回true就执行否则不执行。
如果 a instanceof A 返回true,则 a instanceof B 也返回true,其中类B是类A的父类。

六、Object类的使用
1.Object类是所有java类的父类
2. 如果在类中未使用extends关键字指明父类,则默认父类为java.lang.object类
3.Object类中的功能(属性、方法)具有通用性
4.Object类只声明了一个空参的构造器

七、与 equals() 的区别?(面试题)==

  1. “”==“” 是运算符
    *可以使用在基本数据变量和引用类型变量中
    *如果比较的是基本数据变量,比较两个变量保存的数据是否相等(数据类型不一定形态)
    *如果比较的是引用数据变量,比较两个对象的地址值是否相同即两个引用是否指向同一个对象实体
    2.equals()方法的使用
    *是一个方法,而非运算符
    *只能适用于引用数据类型
    *Object类中equals()的定义:
    public Boolean equals(){
    return (this == obj);
    }

    说明:Object类中的equals()的方法与 “==” 相同
    *像String、Date、File、包装类等都重写了Object类中的equals()方法,重写后比较的不是两个引用的地址是否相同,而是比较两个对象的实体内容是否相同.

八、Object类中toString()的使用
1.当我们输出一个对象的引用时,实际就是调用当前对象的toString()
2.Object类中toString()的定义:
public String toString(){
return getClass().getName()+”@”+Integer.toHexString(hashcode());
}
3.像String、Date、File、包装类都重写了toString()方法,使得在调用对象的toString()时,返回“实体内容”信息.
4.自定义类也可以重写toString()方法,当调用此方法时,返回对象的“实体内容”