Java基础之多态
Posted liualex1109
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础之多态相关的知识,希望对你有一定的参考价值。
多态:父类的引用指向了子类的对象。因此在实现多态时一定要有继承的关系。
比如:
class Fu { } class Zi extends Fu { } Fu obj = new Zi();
使用多态的注意事项:一定要保证父类有此成员,否则编译无法通过。
(1)在访问成员变量时,实际上访问的也是父类的成员变量。
public class Demo { public static void main(String[] args) { Animal cat = new Cat(); System.out.println(cat.weight); // 20.0 } } class Animal { double weight=20; } class Cat extends Animal { double weight=10; }
(2)在访问非静态的成员方法时,实际上访问的是子类的成员方法。
public class Demo { public static void main(String[] args) { Father son = new Son(); son.drive(); //坐公交车 } } class Father { public void drive(){ System.out.println("开小汽车"); } } class Son extends Father { @Override public void drive() { System.out.println("坐公交车"); } }
(3)在访问静态的成员方法和成员属性时,实际上访问的是父类的方法和属性。
public class Demo { public static void main(String[] args) { Father f = new Son(); f.say(); //I‘m father } } class Father { public static void say(){ System.out.println("I‘m father."); } } class Son extends Father { public static void say(){ System.out.println("I‘m son."); } }
(4)多态经常会在方法的参数中使用,即形参是父类,实参是子类对象,这样在运行时会动态绑定,从而节省代码量。
public class Demo { public static void main(String[] args) { Animal cat = new Cat(); Animal dog = new Dog(); cat.say(); dog.say(); } public static void test(Animal animal){ animal.say(); } } class Animal{ public void say(){ System.out.println("I‘m animal"); } } class Cat extends Animal { public void say(){ System.out.println("I‘m cat"); } } class Dog extends Animal { public void say(){ System.out.println("I‘m dog"); } }
(5)关于向上转型和向下转型。
public class Demo { public static void main(String[] args) { Fu obj = new Zi(); //向上转型 Zi z = (Zi) obj; //向下转型,通过强制类型转换 } } class Fu { } class Zi extends Fu { }
但要注意,在向下转型时,一定要确保转换的对象的实际类型和子类相同,否则报错。
public class Demo { public static void main(String[] args) { Fu f = new Fu(); Zi z = (Zi) f; //错误:Fu cannot be cast to Zi } } class Fu { } class Zi extends Fu { }
(6)多态的缺点:在使用多态时,不能访问子类的独有的属性和方法(因为父类没有,无法通过编译)。
以上是关于Java基础之多态的主要内容,如果未能解决你的问题,请参考以下文章