其实在你的那一句话中包含了类型转换的一层意思, A c = new B();首先声明了一个A的对象变量,然后构造了一个B的对象赋给c实际是一种隐含的类型转换。 例如: 首先定义 3 个类: class Super {} class Sub_One extends Super {} class Sub_Two extends Super {} 注意:Sub_One 和 Sub_Two 两个类有共同的父类 Super。 然后创建这 3 个类的对象: Super sup = new Super(); Sub_One sub1 = new Sub_One(); Sub_Two sub2 = new Sub_Two(); 在程序中的语句 转换 备注 编译/运行结果 sup = sub1; 子类 —> 父类 编译和运行时都合法 sup = (Super)sub1; 子类 —> 父类 强制类型转换 编译和运行时都合法 sub2 = sub1; 子类 —>子类 编译和运行时都不合法 sub1 = (Sub_One)sub2; 子类 —> 子类 强制类型转换 编译和运行时都不合法 sub1 = sup; 父类 —> 子类 编译和运行时都不合法 sub1 = (Sub_One)sup; 父类 —> 子类 强制类型转换 编译时合法 运行时不合法在 JAVA 中,如果把一个子类的对象赋值给其父类的引用,那么在编译时这个引用具有父类的类型,但在运行时却指向子类的对象。
Java不是C++,不要做这种类推!
to jiangnanyuzi(江南愚子) :嗯,那你能够给我一个合理的解释么?我很是困惑!:((((
的确迷惑,看个例子吧。可能变量和方法的待遇不同吧 class A { int i = 1; public void print() { System.out.println("invoke by A"); } }public class B extends A { int i = 2; public void print() { System.out.println("invoke by B"); } public static void main(String[] args) { A a = new A(); a.print(); //结果为:invoke by A System.out.println(a.i);//结果是1 B b = new B(); b.print(); //结果为:invoke by B System.out.println(b.i);//结果是2 A c = new B(); c.print(); //结果为:invoke by B System.out.println(c.i);//结果是1 } }
你的B是从A继承来的,那么你的A里面包含的属性和方法B里面一定也会包含,你在生成对象实例C的时候用的是B(),既B的构造方法生成的,那么对象C包含了B的所有属性和方法。但是你的实例C的类型是A,这是A的成员方法print()就被重载了,所以最后输出的是invoke by B
to youyue 兄:这里不是多态机制,而只是子类对方法的重载
看下面的例子: class A { int i = 1; public void print() { System.out.println("invoke by A"); } }public class B extends A { int ii = 2; public void print() { System.out.println("invoke by B"); } public static void main(String[] args) { A a = new A(); a.print(); //结果为:invoke by A System.out.println(a.i);//结果是1 B b = new B(); b.print(); //结果为:invoke by B System.out.println(b.ii);//结果是2 A c = new B(); c.print(); //结果为:invoke by B System.out.println(c.ii);//无法编译通过,variable ii 不存在! Class cx = c.getClass(); System.out.println("Class of c = "+cx.getName());//若注释上面两行,得到B } }java不可以多重继承(无虚函数的概念,类似采用interface中的空方法实现)。 java中object的函数优先采用construct此object的类的函数 java中object成员变量使用声明该object的class的成员变量
多台:执行期绑定、后期绑定把thinking in java看完在来做作业
A c = new B();首先声明了一个A的对象变量,然后构造了一个B的对象赋给c实际是一种隐含的类型转换。
例如:
首先定义 3 个类:
class Super {}
class Sub_One extends Super {}
class Sub_Two extends Super {}
注意:Sub_One 和 Sub_Two 两个类有共同的父类 Super。 然后创建这 3 个类的对象: Super sup = new Super();
Sub_One sub1 = new Sub_One();
Sub_Two sub2 = new Sub_Two(); 在程序中的语句 转换 备注 编译/运行结果
sup = sub1; 子类 —> 父类 编译和运行时都合法
sup = (Super)sub1; 子类 —> 父类 强制类型转换 编译和运行时都合法
sub2 = sub1; 子类 —>子类 编译和运行时都不合法
sub1 = (Sub_One)sub2; 子类 —> 子类 强制类型转换 编译和运行时都不合法
sub1 = sup; 父类 —> 子类 编译和运行时都不合法
sub1 = (Sub_One)sup; 父类 —> 子类 强制类型转换 编译时合法 运行时不合法在 JAVA 中,如果把一个子类的对象赋值给其父类的引用,那么在编译时这个引用具有父类的类型,但在运行时却指向子类的对象。
class A {
int i = 1;
public void print() {
System.out.println("invoke by A");
}
}public class B
extends A {
int i = 2;
public void print() {
System.out.println("invoke by B");
} public static void main(String[] args) {
A a = new A();
a.print(); //结果为:invoke by A
System.out.println(a.i);//结果是1
B b = new B();
b.print(); //结果为:invoke by B
System.out.println(b.i);//结果是2
A c = new B();
c.print(); //结果为:invoke by B
System.out.println(c.i);//结果是1
}
}
class A {
int i = 1;
public void print() {
System.out.println("invoke by A");
}
}public class B
extends A {
int ii = 2;
public void print() {
System.out.println("invoke by B");
} public static void main(String[] args) {
A a = new A();
a.print(); //结果为:invoke by A
System.out.println(a.i);//结果是1
B b = new B();
b.print(); //结果为:invoke by B
System.out.println(b.ii);//结果是2
A c = new B();
c.print(); //结果为:invoke by B
System.out.println(c.ii);//无法编译通过,variable ii 不存在!
Class cx = c.getClass();
System.out.println("Class of c = "+cx.getName());//若注释上面两行,得到B
}
}java不可以多重继承(无虚函数的概念,类似采用interface中的空方法实现)。
java中object的函数优先采用construct此object的类的函数
java中object成员变量使用声明该object的class的成员变量
谢谢 大家(尤其是 kongyeeku(李别) )的关注,结帖!
你把i改了名当然不行。不要说i,就是把print方法换个名字,例如printx,那么c.printx(); 这句也会出错。我们讨论的是重载,拜托。