1.多态
P a1=new B();
根据传入子类对象,自主选择重写的方法,没有重写则用父类P。但这并不意味着这个对象是子类B对象,相反它自转为父类PB对象,不能使用子类B的特有方法,属性。
-  
从生活多态概念:同一种操作行为,由于条件环境不同,得到的结果不同
 -  
从Java多态概念:同一种方法,由于面向的子类对象不同,得到不同的子类对象的结果
 -  
从内存理解多态:父类引用指向子类对象 *
 -  
Cut咔声
 -  
导演:暂停
 -  
医生:动手术
 -  
理发师:理发
 -  
CutMan咔声的男人*
 -  
多态的步骤:
 -  
1.先写父类
 -  
2.子类继承父类
 -  
3.重写父类的方法
 -  
4.使用多态语法:父类 对象名 = new 子类(); *
 -  
多态的三种使用:
 -  
1.父类引用指向子类
 -  
2.父类作为返回值
 -  
3.父类作为参数传递 * *
 -  
多态的好处:
 -  
1.提高了重用性和维护性
 -  
2.优化了代码,简化代码
 -  
3.得到不同的子类结果
 -  
多态的缺点:
 -  
1.不能够直接访问子类自己的方法,需要使用向下转型解决
 -  
使用instanceof 关键字判断,这个instanceof是用来判断引用数据类型
 -  
左边父类是否属于右边的子类的真实实例,返回true,否则false
 
2.重写与重载
-  
方法重写:
 -  
当父类的需求不能满足子类的需求的时候,这个时候就需要用到方法重写
 -  
方法重写的特点:
 -  
1.在子类中使用
 -  
2.方法名称相同
 -  
3.方法的参数列表相同(个数、类型、顺序)
 -  
4.方法的返回值相同或者是父类的子类
 -  
5.父类的私有方法是不能够重写
 -  
6.父类的静态方法是不能够被子类覆盖为非静态方法
 -  
7.父类的非静态方法也不能够被子类所重写为静态方法
 -  
8.在定义方法的时候子类不能比父类抛出更大的异常
 -  
9.override重写
 -  
重载overload *
 -  
方法重写和方法重载的区别:
 -  
位置不同:子类(重写),本类(重载)
 -  
返回值不同:返回值相同或者是其子类(重写),返回值无关(重载)
 -  
修饰符不同:修饰符不能比父类的更严格(重写),修饰符无关(重载)
 -  
参数列表不同:(重写参数列表要一致)(重载参数列表不一致)
 -  
方法名称相同点:(重写和重载都方法名称相同)
 
子类问题就是指引用数据类型
私有private不能被直接访问或调用,有可能(父类公共方法有调用时)通过父类公共方法间接调用。
@Override检测重写,非必要 
 
3.instanceof
解决对象所属子类问题,先判断再由父类向子类型强转
-  
引用类型转换:向上转型和向下转换
 -  
基本类型转换:自动类型转换和强制类型转换
 -  
向上转型:(理解自动类型转换)
 -  
语法格式:父类 对象名 = new 子类();
 -  
把右边的子类转换成左边的父类类型
 -  
向下转型:(理解强制类型转换)
 -  
把右边的父类大类型转换成左边的子类小类型
 -  
(小类型)子类 对象名 = (子类类型)父类;
 

public class Test {
    public static void main(String[] args) {
//        Pets pp1=new Penguins();
//        Dogs p1=(Dogs) pp1;
//        p1.getStrain();//Dogs特有的方法
//        //d1.feed();
//        p1.selfSay();
//        p1.feed();
//        p1.specialDo();//编译不报错,这种相对难发现
        //Exception in thread "main" java.lang.ClassCastException: w2day8.demo1.Penguins cannot be cast to w2day8.demo1.Dogs
        //	at w2day8.demo1.Test.main(Test.java:11)
        //cannot be cast
        Pets pp1=new Penguins();
        //Dogs p1=(Dogs) pp1;
        if(pp1 instanceof Dogs){
            Dogs p1=(Dogs) pp1;
            p1.getStrain();
            //d1.feed();
            p1.selfSay();
            p1.feed();
            p1.specialDo();
        }
        if(pp1 instanceof Penguins){
            Penguins p1=(Penguins) pp1;
            //d1.feed();
            p1.selfSay();
            p1.feed();
            p1.specialDo();
        }
    }
}










