1、Father.java
package com.ljb.extend;
public class Father {
public int x = 10;
public int fGet() {
return x;
}
}
2、Son.java
package com.ljb.extend;
public class Son extends Father {
// 不能出现与父类同名属性
public int a = 100;
public int fGet() {
System.out.println(sGet());
return a;
}
public int sGet () {
return x;
}
/**
* @param args
* 好比代理模式
* 父类的引用指向子类的对象(本身是父类,使用父类属性,调用子类覆盖父类的方法,不能直接访问子类方法,通过此方法间接访问)
* 只能调用子类覆盖父类的方法,
* 在此重写方法中可以调用子类的方法
* 通过此重写方法可以访问到子类的所有方法及属性
*/
public static void main(String[] args) {
Father s = new Son();
System.out.println(s.fGet());
// 不能直接调用子类方法
// System.out.println(s.sGet());
}
}
3、Sun.java
package com.ljb.extend;
public class Sun extends Son {
public int s = 200;
public int fGet() {
System.out.println(sGet());
System.out.println(a);
return s;
}
/**
* @param args
*/
public static void main(String[] args) {
Father sun = new Sun();
System.out.println(sun.fGet());
}
}
4、SecondSon.java
package com.ljb.extend;
public class SecondSon extends Father {
private Son son;
// 实现调用第一个子类方法
public int fGet () {
if (son == null) {
son = new Son();
}
return son.a;
}
/**
* @param args
*/
public static void main(String[] args) {
Father f = new SecondSon();
System.out.println(f.fGet());
}
}