//认识多态 //多态的前提:有继承/实现关系,存在父类引用子类对象,存在方法重写 //1,对象多态 People p1=new Student(); p1.run();//识别技巧:编译看左边,运行看右边 System.out.println(p1.name);//注意:对于变量,编译看左边,运行看左边 People p2=new Teacher(); p2.run();//行为多态 System.out.println(p2.name);
//多态的好处 //好处1:可以实现解耦合,右边的对象可以随时切换, People p1=new Student(); p1.run();//识别技巧:编译看左边,运行看右边 // p1.test();多态下缺点,编译时左边没有test方法,所以无法调用子类的方法(就是子类的独有功能) //强制类型转换:子类 变量=(子类)父类变量 Student s1= (Student) p1; s1.test(); //强制转化存在的问题:编译阶段有继承和实现就可以转换,但是运行时就会报错 // Teacher t1= (Teacher) p1;//运行时会出现错误:ClassCastException if (p1 instanceof Student){//通过用instanceof来判断当前的真实类型 Student s2= (Student) p1; s2.test(); }else { Teacher t2=(Teacher) p1; t2.test(); } System.out.println("-----------------------------"); //好处2:可以通过使用父亲类型的变量作为形参,可以接受一切子对象 Student s=new Student(); go(s); Teacher t=new Teacher(); go(t); } public static void go(People p ){ if (p instanceof Student){ Student s2= (Student) p; s2.test(); }else { Teacher t2=(Teacher) p; t2.test(); } }
//认识final //3,final可以修饰变量的总规则,有且只能改变一次 //变量:局部变量,成员变量;静态变量,实例变量 final int a;//final修饰常量,存储的数据不能改变 a=23; final int m[]={11,22,33};//final修饰的引用类型的变量,变量的地址不能改变,但地址指向的内容可以改变 } public static void buy(final double z){ //z只能赋值一次 } } //final修饰类,类不能被继承 final class A{} //class B extends A{} //2.final修饰方法,方法就不能被重写 class B{ public final void test(){ } }
//认识抽象类 //抽象类中不一定有抽像方法,有抽象方法一定有抽象类 //类该有的成员(成员变量,方法,构造器)抽象类都可以有 //抽象类主要的特点:抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现 // A a=new A(); //a.run();抽象方法中没有内容 //一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义为抽象类 //认识抽象类的好处:抽出这样的抽象类就是为了更好的执行多态
//接口的好处 //1.接口弥补了类单继承的不足,一个类可以同时实现多个接口 Driver s=new A(); s.driver(); //2.程序员可以实现面向接口编程,方便灵活各种切换对象 Driver a=new B();
//默认方法:必须使用default修饰,默认会被public修饰 //实例方法:对象的方法,必须使用实现类的对象来访问 //接口不能用对象调用,只能通过实现类调用 public default void test(){ System.out.println("默认方法"); test2(); } //私有方法:必须使用private修饰,(jdk9)开始支持 // 实例方法:对象的方法 private void test2(){ System.out.println("私有的方法"); } //静态方法:必须使用static修饰,默认会被public修饰 // static void test3(){ System.out.println("静态方法"); }