您的位置:首页 > 编程语言 > Java开发

Java学习笔记11(面向对象四:多态)

2018-01-08 10:25 459 查看
多态:

举例:描述一个事物的多种形态,如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();
}
}
}
/*输出:
* 猫在吃
* 狗在吃
* 猫在抓老鼠
* 狗在看家
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐