继承
方法重写
package com.oop; public class Application{ public static void main(String[] args){ //静态的方法和非静态的方法区别很大 //静态方法: //方法的调用只和左边,定义的数据类型有关 A a = new A; a.text();//A //父类的引用指向子类 B b = new A(); b.text();//B } }
package com.oop.demo01; //继承 public class A extends B{ //override 重写 @Override//注释:有功能的注释 public static void text(){ System.out.println("A=>text()"); } }
package com.oop.demo01; //重写都是方法的重写,和属性无关 public class B { public static void test(){ System.out.println("B=>text()"); } }
注:需要有继承关系,子类重写父类的方法
-
方法名必须相同
-
参数列表 列表必须相同
-
修饰符:范围可以扩大但不能缩小:public>Protected>Default>private
-
抛出的异常:范围,可以被缩小,但不能被扩大:ClassNotFoundException-->Exception(大)
重写,子类的方法和父类必须一致:方法体不同
为什么需要重写:
-
父类的功能,子类不一定需要,或者不一定满足
-
alt+inset;override;
多态
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
多态存在的条件:
-
有继承关系
-
子类重写父类的方法
-
父类引用指向子类对象
注:多态的是方法的多态,属性没有多态性
package com.oop.demo02; public class Student extends Person{ @Override public void run(){ System.out.println("son"); } public void eat(){ System.out.println("ear"); } } /* 多态注意事项: 1.多态是方法的多态,属性没有多态 2.父类和子类,有联系,类型转换异常 ClassCastException! 3.存在条件:继承关系,方法需要重写,父类引用指向子类对象 Father f1 = new Son(); 1.static 方法,属于类,它不属于实例 2.final 常量; 3.private 方法; */
package com.oop.demo02.person; import com.oop.demo02.Student; public class Application{ public static void main(String[] args){ //一个对象的实际类型是确定的 //new Student(); //new Person(); //可以指向的引用类型就不确定了:父类的引用指向子类 //Student 能调用的方法都是自己的或者继承父类的 Student s1 = new Student(); //Person 父类型,可以指向子类,但不能调用子类独有的方法 Person s2 = new Student(); Object s3 = new Student(); //对象能执行哪些方法,主要看对象左边的类型,和右边的关系不大 ((Student) s2).eat();//子类重写父类的方法,执行子类的方法 s1.eat(); } }
instanceof 和类型转换
package com.oop; import java.util.Scanner; public class Application{ public static void main(String[] args){ //Object > String //Object > Person > Teacher //Object > Person > Student Object object = new Studdent(); System.out.println(object imstanceof Student);//true System.out.println(object imstanceof Person);//true System.out.println(object imstanceof Object);//true System.out.println(object imstanceof Teacher);//False System.out.println(object imstanceof String);//False System.out.println("========================"); Person person = new Student(); System.out.println(person imstanceof Student);//true System.out.println(person imstanceof Person);//true System.out.println(person imstanceof Object);//true System.out.println(person imstanceof Teacher);//False System.out.println(person imstanceof String);//编译报错 System.out.println("========================"); Student student = new Student(); System.out.println(studdent instanceof Student);//true System.out.println(studdent instanceof Person);//true System.out.println(studdent instanceof Object);//true //System.out.println(studdent instanceof Teacher);//编译错误 //System.out.println(studdent instanceof String);//编译错误 } }
package com.oop; import com.oop.demo03.Person; import com.oop.demo03.Student; import com.oop.demo03.Teacher; import java.util.Scanner; public class Application{ public static void main(String[] args){ //类型之间的转化: 父 子 //子类转换为父类,可能丢失自己的本来的一些方法 Student student = new Student(); student.go(); Person person = student; } } /* 1.父类引用指向子类的对象 2.把子类转换为父类,向上转型 3.把父类转换为子类,向下转型;强制转换 4.方便方法的调用,减少重复的代码 抽象:封装,继承,多态 */