封装和多态
多态概念
package com.cloud.day3; /* 面向对象的三大特征: 1. 封装 2. 继承。 3. 多态 多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象) 或者是接口的引用类型变量指向了接口实现类的对象) 多态的前提:必须存在继承或者实现关系。 动物 a = new 狗(); 多态要注意的细节: 1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。 2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。 3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。 4. 多态情况下,不能访问子类特有的成员。
总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。 编译看左边,运行不一定看右边。 编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。 */ abstract class Animal{ String name; String color = "动物色"; public Animal(String name){ this.name = name; } public abstract void run(); public static void eat(){ System.out.println("动物在吃..."); } } class Mouse extends Animal{ String color = "黑色"; public Mouse(String name) { super(name); } @Override public void run() { System.out.println(name+"run..."); } public static void eat(){ System.out.println("老鼠在偷吃..."); } public void dig(){ System.out.println("老鼠在打洞..."); } } class Fish extends Animal{ public Fish(String name) { super(name); } @Override public void run() { System.out.println(name+"摇尾巴..."); } } public class Demo1 { public static void main(String[] args) { Animal a = new Mouse("小白鼠"); a.run(); } } |
多态场景
package com.cloud.day3; /* 多态的应用: 1. 多态用于形参类型的时候,可以接收更多类型的数据。 2. 多态用于返回值类型的时候,可以返回更多类型的数据。 多态的好处:提高了代码的拓展性。 需求1:定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。 */ //图形类 abstract class MyShap{ public abstract void getArea(); public abstract void getLength(); } class Circle extends MyShap{ double r; public static final double PI = 3.14; public Circle(double r){ this.r = r; } @Override public void getArea() { System.out.println("面积:"+PI*r*r); } @Override public void getLength() { System.out.println("周长:"+2*PI*r); } } public class Demo2 { public static void main(String[] args) { Circle c = new Circle(3.0); c.getArea(); c.getLength(); } } |
类型转换
package com.cloud.day4; /* 目前多态情况下不能访问子类特有的成员。 如果需要访问子类特有的成员,那么需要进行类型强制转换.
基本数据类型的转换 小数据类型-------->大的数据类型 自动类型转换 大数据类型--------->小数据类型 强制类型转换 小数据类型 变量名 = (小数据类型)大数据类型;
引用数据类型的转换 小数据类型--------->大数据类型 自动类型转换。 大数据类型--------->小数据类型 强制类型转换 类型转换最场景的问题: java.lang.ClassCastException。强制类型转换失败。 */ abstract class Animal{ String name; public Animal(String name){ this.name = name; } public abstract void run(); } class Mouse extends Animal{ public Mouse(String name) { super(name); } @Override public void run() { System.out.println("Mouse.run()"); } public void dig(){ System.out.println("Mouse.dig()"); } } class Fish extends Animal{ public Fish(String name) { super(name); } @Override public void run() { System.out.println("Fish.run()"); } public void bubble(){ System.out.println("Fish.bubble()"); } } public class Demo1 { //定义一个方法接受任意类型对象 public static void print(Animal a){ if(a instanceof Mouse){ //强制类型转换 Mouse m = (Mouse)a; m.run(); }else if(a instanceof Fish){ Fish f = (Fish)a; f.bubble(); } } public static void main(String[] args) { //多态 Animal a = new Mouse("老鼠"); print(a); } } |
实现关系下多态
package com.cloud.day5; /* 多态:父类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类的对象。
实现关系下的多态: 接口 变量 = new 接口实现类的对象。 */ interface Dao{ public void add(); public void delete(); } class UserDao implements Dao{ @Override public void add() { System.out.println("UserDao.add()"); } @Override public void delete() { System.out.println("UserDao.delete()"); } } public class Demo1 { public static void main(String[] args) { //实现关系下的多态 Dao d = new UserDao(); //接口的引用类型变量指向了接口实现类的对象。 d.add(); } } |