java面向对象第三章
一、 多态【子类就是父类】
1、 为什么使用多态
提高程序可扩展性,可维护性,提高代码可重用性
2、 什么是多态【P71】
具有表现多种形态能力的特征 同一个实现接口,使用不同的实例而执行不同的操作
3、 如何使用多态
l 方法的参数类型是父类
访问修饰符 返回类型 方法名(父类名 对象名){
……………………………………………….
}
调用方法时,可以传递子类的对象
3.1 父(子)类名 对象 = new 子类名();
3.2 方法名(子类对象);
3.3 方法的返回类型是父类
访问修饰符 父类名 方法名([参数列表]){
return 父类对象或子类对象;
}
//子类,圆形 public class Circular extends Graph { private final double X=3.14; //半径 public Circular(double r){ super(r); } public void getArea(){ double m=(super.getLen()*X*X); System.out.println("圆的半径为"+super.getLen()+"\n面积为"+m); }
//子类,长方形 public class Rectangle extends Graph { private double weight; //宽度 public Rectangle(double len,double weight){ super(len); this.weight=weight; } public double getWeight(){ return weight; } public void getArea(){ double m=(super.getLen()*this.getWeight()); System.out.println("长方形的长为"+super.getLen()+",宽为"+this.weight+"\n面积为"+m); }
//父类 public abstract class Graph { private double len; //图形的边长 public Graph(double len){ this.len=len; } //获取长度 public double getLen(){ return len; } //抽象面向方法 public abstract void getArea(); }
4、 多态中子类和父类之间的转换
a) 子类到父类的转换(向上转换)
父类 对象名 = new 子类();//自动进行转换
对象名.方法名([值]);
向上转换的使用规则【P72】:
l 父类引用指向子类对象时称为向上转换或转型(upcasting),自动进行类型转换
l 通过父类引用变量,调用的方法是子类覆盖(重写)或继承父类的方法【选择题1、2】
l 通过父类引用变量,无法调用子类特有的方法【选择题3】
b)父类到子类的转换(向下转换)——强制类型转换,还原对象的真实面目(具体是哪种子类)
父类 对象名 = new 子类();
对象名.子类方法();//编译有错误
应修改为:
父类 对象名 = new 子类();
子类 子类对象 =(子类)对象名;
子类对象.子类方法();
//父类 public abstract class Zhu { private String name; //两者的姓名 private String food; private String nation; /** * @return the name */ public String getName() { return name; } public String getNation(){ return nation; } public Zhu(String name,String food,String nation){ this.name=name; this.food=food; this.nation=nation; } public String getFood(){ return food; } public abstract void print(); } 父类
//子类 public class YueHan extends Zhu{ private String habit; public YueHan(String name,String habit,String food,String nation){ super(name,food,nation); this.habit=habit; } public String gethabit(){ return habit; } public void print(){ System.out.println("我叫"+super.getName()+",来自"+super.getNation()+",喜欢吃"+this.getFood()+",爱好是打"+this.gethabit()); } }