C#用子类实例化父类

class jk
{int a=1;
public void fun1()
{
System.out.println("父类funl()") ;
}
public void fun2()
{
System.out.println("父类fun2()") ;
}
} // Student类扩展自jk类,也就继承了jk类中的fun1()、fun2()方法 class Student2 extends jk
{int a=4;
char c=45;
// 在这里复写了jk类中的fun1()方法
public void fun1()
{
System.out.println("子类fun1()") ;
}
public void fun3()
{
System.out.println("子类新方法fun3()") ; }
} public class 实验
{
public static void main(String[] args)
{
// 此处,父类对象由子类实例化
jk p = new Student2() ;
// 调用fun1()方法,观察此处调用的是哪个类里的fun1()方法
p.fun1() ;
p.fun2() ;
System.out.println("a="+p.a);
}
}
输出:子类fun1()
父类fun2()
a=1
以上fun1()方法经过复写了所以输出“子类fun1()”,但是属性a也复写成4了啊为什么输出还是原来的1
还有不能调用p.fun3()和p.c,否则编译不让通过,这里的p应该就是个引用吧,就是存储了实例化的地址。
请大家说说其中的实例化过程到低是怎么样的,谢谢!

 

既然你知道对象,和引用
那你应该明白两者的关系
new 什么,就是什么对象
所以,你这里只有子类 Student2 的对象,而没有父类 jk 的对象
你只是让父类引用指向了子类对象
在父类引用指向子类对象时,不能访问子类新加的方法

System.IO.Stream fromFile = new FileStream(srcImgPath, FileMode.Open);

//这是一个数据抽象化的概念 java中把这个叫上转型,比如:
class A,class B,B继承了A,实例化的时候A a= new B(); a就叫上转型对象,
对于实例a(上转型对象),它不能操作B新增的成员变量(失掉了这部分属性),;不能使用B类新增的方法(失掉了一些功能)也就是B类中非重写的方法。

posted on 2013-05-15 09:05  大胡子青松  阅读(3098)  评论(0编辑  收藏  举报

导航