黑马程序员技术交流社区
标题:
继承中的小问题
[打印本页]
作者:
乖睡觉咯
时间:
2013-8-16 22:59
标题:
继承中的小问题
class Fu{
int num = 4;
Fu(){
num = 5;
}
}
class Zi extends Fu{
int num = 6;
public void method(){
int num = 7;
System.out.println(num);
}
}
class demo{
public static void main(String[] args) {
Zi z = new Zi();
z.method();
}
}
复制代码
运行结果一开始是 7;
想输出6的话
System.out.println(num); 改为
System.out.println(this.num);
想输出5的话
System.out.println(num); 改为
System.out.println(super.num);
那要是想输出 4 的话怎么改啊 ?? 求解
作者:
yangxin540
时间:
2013-8-16 23:33
构造函数是给数据初始化的,你定义了一个num等于4,然后然后在程序加载的时候构造函数就改变了num的值为5了,也就是该类的对象中存在的初始化num就是5,所以你要想打印出4,在你现在这个程序是不行的,要打印出4,你可以不在构造函数中初始化num为5.
作者:
焦允
时间:
2013-8-16 23:50
class Fu{
int num = 4;
Fu()
{
num = 5;
}
Fu(int num)
{
this.num = num;
}
}
class Zi extends Fu{
int num = 6;
Zi()
{
super(int num);
}
public void method(){
int num = 7;//与成员变量同名的局部变量
//System.out.println(num); //调用的是method方法内的局部遍历
//System.out.println(this.num);//调用的事Zi类中的成员变量。
System.out.println(super.num);//调用的事Fu类中的成员变量。
}
}
class Demo1{
public static void main(String[] args) {
Zi z = new Zi();
z.method();
}
}
按照上面的修改运行结果就是4,在父类中添加一个有参数的构造方法,并在子类构造方法中显式调用.但这样改的话可能跟楼主的初衷不符。
其实楼主所写的代码中,父类中的num值在创建子类对象时,因为调用了父类构造方法进行了初始化赋值,num变量里面的值已经不再是4了,所以如果仅仅是调用num,而不对num重新赋值,是无法再输出4的结果的。
作者:
昝文萌
时间:
2013-8-17 12:35
创建子类对象时,会先调用父类的构造函数把父类对象里的成员变量num的值由4变为5。我是这样想的,如果要输出4,只能不调用父类的构造函数,只有用static关键字,把成员变量变为静态的,直接由类访问。经过尝试发现下面的代码可以实现输出4:
class Fu
{
static int num = 4;//这里定义静态成员变量
Fu()
{
num = 5;
}
}
class Zi extends Fu
{
int num = 6;
public static void method()//这里定义静态成员函数
{
int num = 7;
System.out.println("num="+Fu.num);//这里调用父类的静态成员变量
}
}
class demo
{
public static void main(String[] args)
{
Zi.method();//直接用类调用静态方法
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2