多态的细节.6

一、多态

多态:方法或对象具有多种形态
方法的多态:方法的重载,不同对象调用的方法
对象的多态:编译类型(左)和运行类型(右)不一致
定义对象时编译对象确定,运行类型可以改变。

二、多态的向上和向下转型

向上转型

继承的时候,父类引用指向子类对象(可以调用父类的所有成员,不能调用子类的特有成员)
重写方法调用时,先在子类开始找这个方法

Animal animal = new Cat();

向下转型

子类类型 引用名 = (子类类型) 父类引用;

Cat cat = (Cat) animal;//父类引用必须是指向子类对象的

只能强转父类的引用,不能强转父类的对象。
向下转型后,可以调用子类的所有成员。

三、属性重写

属性看编译类型

public class detail {
    public static void main(String[] args) {
        AAA aaa = new BBB();
        System.out.println(aaa.count);//10
    }
}
class AAA{
    int count = 10;
}
class BBB extends AAA{
    int count = 20;
}

四、方法重写

方法重写看运行类型

public class detail {
    public static void main(String[] args) {
        AAA aaa = new BBB();
        aaa.A();//bbb
    }
}
class AAA{
    public void A(){
        System.out.println("aaa");
    }
}
class BBB extends AAA{
    public void A(){
        System.out.println("bbb");
    }
}

五、instandceof

判断对象的运行类型(后)是否为xx(前)的类型或者子类型

AA  aa = new AA();
Object obj = new Object();
String str = "aa";

 System.out.println(obj instandceof aa);//false
 System.out.println(obj instandceof str);//true

六、Java的动态绑定机制

调用对象方法的时候,该方法会和该对象的内存地址或者运行类型绑定。
调用对象属性的时候,则没有这个机制,哪里声明哪里使用

public class detail {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
        //全部打开输出40.30
        //注销B类的sum方法输出30,30,说明在调用A类的sum方法时调用的getI方法还是运行类型B类的getI方法
        //同时注销B类的sum方法和sum1方法输出30.20,说明调用A类的sum1方法时调用的i是A类的i
    }
}
class A {//父类
    public int i = 10;
    public int sum() {
        return getI() + 10;
    }
    public int getI() {
        return i;
    }
    public int sum1() {
        return i + 10;
    }
}
class B extends A {//子类
    public int i = 20;
    public int sum() {
        return getI() + 10;
    }
    public int getI() {
        return i;
    }
    public int sum1() {
        return i + 20;
    }
}

七、Object的常用方法

==

= =:判断对象的地址是否相同(判断数值时,直接比较大小。两个对象数值大小一样也返回false)

equals

equals:本质和= =相同,在一些子类被重写,可以比较对象(数值,字符串…)是否一致。(不同的子类对象判断类型不一样,尽管是两个不同的对象)

hashCode

hashCode:不同对象的hashCode值不一样,用于提高hash容器的效率

toString

toSring:输出该对象的包名和类名,+@+将hash值转化为十六进制的字符串(一般会重写Alt+ins(重写输出对象的属性))
输出对象时默认输出toString,就像System.out.println(对象)=对象.toString();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值