Java学习笔记11(面向对象四:多态)
程序员文章站
2022-03-21 21:10:25
多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态 在使用多态后的父类引用变量调用方法时,会调用子类重写后 ......
多态:
举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person
多态体现为:父类引用变量可以指向子类对象
多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
举例:
public class Fu { public void show(){ System.out.println("父类的show方法"); } }
public class Zi extends Fu{ public void show(){ System.out.println("子类重写父类的show方法"); } }
public class Test { public static void main(String[] args) { //利用多态性 //公式:父类类型(接口类型)变量 = new 子类的对象 Fu f = new Zi(); f.show(); } } //输出:子类重写父类的show方法
抽象类多态:
public abstract class Person { public abstract void work(); }
public class Teacher extends Person { public void work() { System.out.println("Teacher在工作"); } }
public class Test { public static void main(String[] args) { //抽象类多态 Person p = new Teacher(); p.work(); } } //输出:Teacher在工作
接口多态:
public interface Work { public abstract void work(); }
public class Student implements Work{ public void work(){ System.out.println("Student在工作"); } }
public class Test { public static void main(String[] args) { //接口多态 Work w = new Student(); w.work(); } } //输出:Student在工作
多态中成员方法的特点:
public class Fu { int a = 1; }
public class Zi extends Fu{ int a = 2; }
public class Test { public static void main(String[] args) { Fu f = new Zi(); System.out.println(f.a); } } //输出:1
成员变量:
编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败
运行的时候,运行的是父类中的变量值
总结:编译运行全看父类
成员方法:
父类中没有声明或者定义的方法无法调用,
子类如果重写,调用的是子类方法,子类没有重写,调用父类方法
总结:编译看父类,运行看子类
instanceof关键字:
用于比较引用数据类型:
public class Test { public static void main(String[] args) { //Person p = new Student(); Person p = new Teacher(); boolean b = p instanceof Student; System.out.println(b); } } //输出:false
多态转型:
向上转型:
java是一种强制数据类型的语言,参与运算的数据,需要保证类型的统一
如Person p = new Student();
两个数据类型是不同的,但是成功运行
因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的
范围小的,看成是子类,范围大的,看成是父类
这里子类提升到了父类的类型
优点:可以调用子类和父类的共有内容
缺点:无法调用子类的特有内容
如果想调用子类的特有内容:
向下转型(类似以前提到的强制转型):
Student s = (Student)p;
由父类类型强制转回子类的类型
好处:可以调用子类特有的功能
转型的案例:
public abstract class Animal { public abstract void eat(); }
public class Cat extends Animal { public void eat(){ System.out.println("猫在吃"); } public void catchMouse(){ System.out.println("猫在抓老鼠"); } }
public class Dog extends Animal { public void eat(){ System.out.println("狗在吃"); } public void lookHome(){ System.out.println("狗在看家"); } }
public class Test { public static void main(String[] args) { Animal a1 = new Cat(); Animal a2 = new Dog(); a1.eat(); a2.eat(); //向下转型,调用子类的特有方法 //使用if .instanceof. 为了确保安全性 if(a1 instanceof Cat){ Cat c = (Cat)a1; c.catchMouse(); } if(a2 instanceof Dog){ Dog d = (Dog)a2; d.lookHome(); } } } /*输出: * 猫在吃 * 狗在吃 * 猫在抓老鼠 * 狗在看家 */
上一篇: 将网址url转化为JSON格式
下一篇: 动态绑定与静态绑定
推荐阅读