楼主可能被误导了。注意T2类中,我新添加的两行代码。public class T2 extends T1 { int i = 2; public void Test2() { System.out.println(i); } public static void main(String[] args) { T1 test = new T2(); test.Test1(); test.Test2(); System.out.println(test.i); test = (T2)test; System.out.println(test.i);
这段代码主要涉及的就是继承层面的上转型对象和下转型对象 上转型对象是将子类的对象赋值给父类的引用.上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.下转型对象是将父类的对象赋值给子类的引用 public class T1 { int i = 0; public void Test1() { System.out.println(i); } public void Test2() {
System.out.println(i); } }T1 test = new T2(); //构造上转型对象test test.Test1(); //调用父类T1的Test1()方法 test.Test2(); // 调用子类重写父类的方法Test2() System.out.println(test.i); // 调用被子类隐藏的父类变量 test = (T2)test; //构造下转型对象test System.out.println(test.i); // 调用父类变量 T2 test2 = new T2(); //构造子类对象test2 test2.Test1(); //调用父类T1的Test1()方法 test2.Test2(); // 调用子类重写父类的方法Test2() System.out.println(test2.i); //调用子类的变量
你可以试试 将T1的属性i 使用private 封装 然后使用getter 方法访问 你就会发现 T1 test = new T2(); test 访问i 的值就是 T2自己的属性 我这样说 你再想想 应该就会明白很多了
int i = 2; public static void m1(){ System.out.println("T2"); }
public void Test2() { System.out.println(this.i); }
public static void main(String[] args) { T1 test = new T2(); test.Test1(); test.Test2(); System.out.println(test.i); test = (T2)test; test.m1(); System.out.println(test.i);
为什么调父类?求详解
字段不具备多态,以静态类型确定。 前面两次的i输出都是0 , 因为它们的静态类型为T1。
System.out.println(i);
} public static void main(String[] args) {
T1 test = new T2();
test.Test1();
test.Test2();
System.out.println(test.i);
test = (T2)test;
System.out.println(test.i);
//新添加的两行代码。
T2 test_1 = (T2)test;
System.out.println(test_1.i);
T2 test2 = new T2();
test2.Test1();
test2.Test2();
System.out.println(test2.i);
}
}
字段不具备多态,以静态类型确定。 前面两次的i输出都是0 , 因为它们的静态类型为T1。
谢谢,很好理解
(1)java不支持多重继承,也就是说子类至多只能有一个父类
(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。
上转型对象是将子类的对象赋值给父类的引用.上转型对象不能使用子类新增成员(包括成员变量,成员方法),只能使用子类重写父类的方法,被子类隐藏的父类变量;子类未重写的父类方法,未被隐藏的父类成员变量.下转型对象是将父类的对象赋值给子类的引用
public class T1 {
int i = 0;
public void Test1() {
System.out.println(i);
}
public void Test2() {
System.out.println(i); }
}T1 test = new T2(); //构造上转型对象test
test.Test1(); //调用父类T1的Test1()方法
test.Test2(); // 调用子类重写父类的方法Test2()
System.out.println(test.i); // 调用被子类隐藏的父类变量
test = (T2)test; //构造下转型对象test
System.out.println(test.i); // 调用父类变量
T2 test2 = new T2(); //构造子类对象test2
test2.Test1(); //调用父类T1的Test1()方法
test2.Test2(); // 调用子类重写父类的方法Test2()
System.out.println(test2.i); //调用子类的变量
1、T1做为父类应该以抽象类的形式出现。
2、T1做为父类,其主要作用应该是复用代码,也就是复用Test1()和Test2(),而不是让什么子类覆盖这些代码。
3、如果想体现多态,T1应该是接口,而不是类。
4、T2的代码如果容易招致程序员错误的理解,那就不是好代码。
(1)java不支持多重继承,也就是说子类至多只能有一个父类
(2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法
(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承
(4)子类中定义的成员方法,并且这个成员方法的名字,返回类型,及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。
int i = 2;
public static void m1(){
System.out.println("T2");
}
public void Test2() {
System.out.println(this.i);
}
public static void main(String[] args) {
T1 test = new T2();
test.Test1();
test.Test2();
System.out.println(test.i);
test = (T2)test;
test.m1();
System.out.println(test.i);
T2 test2 = new T2();
test2.Test1();
test2.Test2();
System.out.println(test2.i);
}
}class T1 {
int i = 0;
public static void m1(){
System.out.println("T1");
}
public void Test1() {
System.out.println(this.i);
}
public void Test2() {
System.out.println(this.i);
}
}
希望对你有帮助.