/*
* 关于继承,多态,和抽象的知识点,及其应用源程序说明
* */
//定义父亲为抽象类
abstract class Father {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Father() {
}
public Father(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(this.getName() + " " + this.getAge());
}
public abstract void speak();
}
class Son extends Father {
public Son() {
super();
}
public Son(String name, int age) {
super(name, age);
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void playGame() {
System.out.println("son play game");
}
String gender;
@Override
//speak()方法在son里面的重写
public void speak() {
// TODO Auto-generated method stub
System.out.println("this is son");
}
}
class Daughter extends Father {
public Daughter() {
// TODO Auto-generated constructor stub
super();
}
public Daughter(String name, int age) {
super(name, age);
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void watchTV() {
System.out.println("daughter watch tv");
}
String gender;
@Override
public void speak() {
// TODO Auto-generated method stub
//speak()方法在daughter里面的重写
System.out.println("this is daughter");
}
}
public class oop {
public static void main(String[] args) {
// 创建指向子类对象的父类引用
Father s = new Son("michael",16);
Father d = new Daughter("lucy",12);
//Father f = new Father();//错误:抽象类无法创建实例
System.out.println(s.name);//直接利用s调用name,输出michael
System.out.println(d.name);//直接利用d调用name,输出lucy
s.show();//s调用son的show()输出michael 16
s.speak();//s调用重写方法,输出this is son
d.speak();//d调用重写方法,输出this is daughter
//s.playGame();//错误,父类引用无法调用子类特有方法
//若想调用子类中的特有方法的处理
//向下转化
Son s0=(Son)s;
s0.playGame();//输出son play game
Daughter d0=(Daughter)d;
d0.watchTV();//或者((son)s).watchTV,输出daughter watch tv
//创建子类的实例,但并不建议这样做,耗费内存
Son ss=new Son();
ss.playGame();
}
}