Java学习笔记11(面向对象四:多态)
2018-01-08 10:25
459 查看
多态:
举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person
多态体现为:父类引用变量可以指向子类对象
多态的前提:必须有子父类关系或者类实现接口关系,否则无法完成多态
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法
举例:
抽象类多态:
接口多态:
多态中成员方法的特点:
成员变量:
编译的时候,参考父类中有没有这个变量,如果有,编译成功,如果没有,编译失败
运行的时候,运行的是父类中的变量值
总结:编译运行全看父类
成员方法:
父类中没有声明或者定义的方法无法调用,
子类如果重写,调用的是子类方法,子类没有重写,调用父类方法
总结:编译看父类,运行看子类
instanceof关键字:
用于比较引用数据类型:
多态转型:
向上转型:
java是一种强制数据类型的语言,参与运算的数据,需要保证类型的统一
如Person p = new Student();
两个数据类型是不同的,但是成功运行
因为这里出现了自动类型提升,将取值范围小的自动提升为取值范围大的
范围小的,看成是子类,范围大的,看成是父类
这里子类提升到了父类的类型
优点:可以调用子类和父类的共有内容
缺点:无法调用子类的特有内容
如果想调用子类的特有内容:
向下转型(类似以前提到的强制转型):
Student s = (Student)p;
由父类类型强制转回子类的类型
好处:可以调用子类特有的功能
转型的案例:
举例:描述一个事物的多种形态,如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(); } } } /*输出: * 猫在吃 * 狗在吃 * 猫在抓老鼠 * 狗在看家 */
相关文章推荐
- 【学习笔记12】java面向对象-多态
- 【学习笔记11】java面向对象-接口与类、接口与接口之间的关系
- 黑马程序员--Java学习笔记之面向对象思想(多态、内部类、匿名内部类、异常类)
- 面向对象 (多态)+JAVA学习笔记-DAY09
- Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态
- Java菜鸟学习笔记--面向对象篇(十八):对象转型&多态
- Java菜鸟学习笔记--面向对象篇(十六):Object类方法
- 设计模式学习笔记二:面向对象基础三之多态
- (JAVA SE 学习笔记)Java.SE.第010讲.面向对象之封装.续
- 面向对象非常非常重要的一个特性“多态”的学习笔记
- 黑马程序员--Java学习笔记之面向对象思想(单例模式详解、匿名对象、静态、final)
- java语言面向对象笔记,在学习面向对象时应该理解掌握的原理-作者:逝秋
- (JAVA SE 学习笔记)Java.SE.第011讲.面向对象之封装.续二(对一些原理机制进行了详细的解释,适合初学者学习)
- Asp.Net Ajax 学习笔记11 Microsoft AJAX Library中的面向对象类型系统
- Java菜鸟学习笔记--面向对象篇(二):封装与访问修饰符
- 传智播客_张孝祥_Java基础4_面向对象下_学习笔记
- Java面向对象学习笔记(一)
- 黑马程序员_java面向对象学习笔记
- java学习笔记《java面向对象编程》——面向对象开发方法概述
- Java学习笔记——类与对象(封装、继承与多态)