第一个程序
class C{
void callme(){System.out.println("abd");}
}
public class q extends C{void metoo(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
}
}
这个程序为什么不能编译
出错提示是 q.java:8 找不到符号
符号: 方法 metoo( )
位置: 类C
其中C c=new q() 是生成了一个类q的实例,并把它的引用返回到C型变量c中 但为什么编译就不能通过 请先看第2个程序 因为这个程序编译不能通过的话我觉得和第2个程序的运行结果相矛盾第2个程序
class C{
void callme(){System.out.println("abd");}
void metoo(){
System.out.println("inside abc");}
}
public class q extends C{void metoo(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
}
}
运行的结果是inside 为什么运行结果不是inside abc呢 这样不是和第1个程序矛盾吗 请哪位高手详细解释一下
class C{
void callme(){System.out.println("abd");}
}
public class q extends C{void metoo(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
}
}
这个程序为什么不能编译
出错提示是 q.java:8 找不到符号
符号: 方法 metoo( )
位置: 类C
其中C c=new q() 是生成了一个类q的实例,并把它的引用返回到C型变量c中 但为什么编译就不能通过 请先看第2个程序 因为这个程序编译不能通过的话我觉得和第2个程序的运行结果相矛盾第2个程序
class C{
void callme(){System.out.println("abd");}
void metoo(){
System.out.println("inside abc");}
}
public class q extends C{void metoo(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
}
}
运行的结果是inside 为什么运行结果不是inside abc呢 这样不是和第1个程序矛盾吗 请哪位高手详细解释一下
void callme(){
System.out.println("abd");
}
void metoo(){
}
}
public class q extends C{
//overriding 父类方法
void metoo(){
System.out.println("inside");
}
public static void main(String arg[]){
C c=new q(); //实际上c还是属于q类的一个实例
c.callme(); //c没有自己的callme()方法,callme()方法是从父类继承的
c.metoo();
}
}
输出结果是
abd
inside
abstract void class C{
abstract void callme();
void metoo(){
System.out.println("inside abc");}
}
public class q extends C{void callme(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
c.callme();
}
}
如果说c被看做是一个C的实例的话 但是abstract类是不能实例化的啊 这怎么解释啊
abstract void class C{
abstract void callme();
void metoo(){
System.out.println("inside abc");}
}
public class q extends C{void callme(){
System.out.println("inside");}
public static void main(String arg[]){
C c=new q();
c.metoo();
c.callme();
}
}
如果说c被看做是一个C的实例的话 但是abstract类是不能实例化的啊 这怎么解释啊还有所说的向上转型,是不是说子类强制转换成父类了
向上转型是指:对于子类的对象可以用父类引用来指向,虽然实际生成的对象是子类的对象,但是通过父类的引用来指向的,所以通过这个父类的引用只能访问父类中定义的方法;同理,实现接口的类与接口的向上转型与此类似;
第一:C c=new q(); 这个不是abstract类实例化.
C c=new C();这个才是C类实例化。你试试看行不行?第二:你在class q里加个
void Display(){
System.out.println("Welcome javaWorld");
}
你看可以不可以调用?
****************************************************
第一个例子,虽然new q()是q的一个实例,但c是一个C类型的变量,因些,你把new q()赋给c的时候,执行了向上转型,c已经被看作是一个C的实例了,这样,C类中没有的接口都被屏蔽了,因此,也就不能调用q类中有的而C类中没有的metoo()方法了。
向上转型是指:对于子类的对象可以用父类引用来指向,虽然实际生成的对象是子类的对象,但是通过父类的引用来指向的,所以通过这个父类的引用只能访问父类中定义的方法;同理,实现接口的类与接口的向上转型与此类似;既然通过这个父类的引用只能访问父类中定义的方法,那么程序2的运行结果是inside,而不是inside abc, 结果是inside的话,那访问的就是子类中的方法而不是父类中的方法
在你第一个程序里面,父类没有定义metoo方法,对于这个类来说就是没有这个指针,所以第一个编译便会出现错误。
而第二个程序里面父类定义了metoo方法,于是就有了个叫metoo的指针定向到一段代码,而子类重写了这个方法,相当于将这个指针的指向转到了另一段代码上面。所以当你调用这个方法的时候执行的是子类定义的逻辑。