super在继承树中的用法
/**
* 测试super的用法 在子类中调用父类的内容
* 继承树追溯
*/
public class TestSuper {
int age;
public void set(){
age = 100;
System.out.println("TestSuper的age="+age);
}
}
class T2 extends TestSuper{
int age;
//重写age
public void set(){
age = 200;
super.set();
//调用父类TestSuper的方法set()
System.out.println(super.age);
//调用父类TestSuper的属性age
System.out.println("T2的age="+age);
//子类重写age之后 子类生成的对象.age遮住了父类的属性age 但父类age没有改变依然存在
}
public static void main(String[] args) {
new T2().set();
//new对象并直接使用方法set()
T2 t = new T2();
//在子类以外的地方无法使用super.调用父类
}
}
class T3{
TestSuper t = new TestSuper();
int age;
//组合component TestSuper.age和T3对象名.age不影响 可在子类之外分别调用
public void set(){
System.out.println();
}
public static void main(String[] args) {
T3 tt = new T3();
tt.age = 100;
tt.t.age = 200;
tt.set();
tt.t.set();
}
}
class T4{
T4(){
//构造方法第一行默认 Super();
System.out.println("创建父类");
}
T4(int a){
System.out.println(a);
}
}
class T5 extends T4{
T5(){
//构造方法第一行默认 Super();
System.out.println("创建子类");
}
public static void main(String[] args) {
new T5();
//创建类时从父类往下逐一创建 Object>T4>T5
}
}
class T6 extends T4{
T6(){
super(100);
//手动设定有参构造方法 不会生成默认super()
}
T6(int b){
this();
//调用无参构造方法T6()
System.out.println(b);
}
T6(int b,int c){
this(b);
System.out.println(c);
}
public static void main(String[] args) {
new T6();
//Object>T4(100)>T6 没有用到T4()不打印创建父类
new T6(2,3);
}
}
class T7{
static {
System.out.println("加载父类时会加载静态初始化块,所以只要使用父类就会打印出这句话");
}
T7(){
System.out.println("static随类一起加载,先于构造方法");
}
}
class T8 extends T7{
static {
System.out.println("子类后加载");
}
T8(){
System.out.println("后");
}
}
class T9{
public static void main(String[] args) {
T8 t = new T8();
//顺序T7static静态初始化块>T8static>T7()构造方法>T8()
}
}