标题: 各位大神帮下忙,想了好久的一个问题 [打印本页] 作者: yuemingxingxing 时间: 2015-11-9 18:17 标题: 各位大神帮下忙,想了好久的一个问题 class Super{ int i = 5;
}
class Zi extends Super
{
i = 4;
}
public class Question
{
public static void main(String args[])
{
Zi zi = new Zi();
System.out.println(zi.i);
}
}//这个无法编译通过
class Super{ int i = 5;
}
class Zi extends Super
{
void show()
{
i = 4;
}
}
public class Question
{
public static void main(String args[])
{
Zi zi = new Zi();
System.out.println(zi.i);
}
}//这个可以编译通过
这两个程序关于i的运行原理真让我糊涂了,求各位大神帮忙梳理下!!
作者: 萧未然 时间: 2015-11-9 18:17
子类中继承了父类的成员变量int i=5;(记住是成员变量,和成员方法是不同的实例成员)
这时,如果在给i赋值--相当于:
class Test{
int num= 5;
num=4;//这里实际是算数运算,但凡代码主体,都必须封装在函数中,这里的赋值运算当然会编译失败咯
//而应该在方法里操作成员,所以第二种情况是对的
}作者: z_one 时间: 2015-11-9 19:13
class Zi extends Super
{
i = 4;
}
这个 改为 class Zi extends Super
{
int i = 4;
}
下面那个是在函数里面,直接改变父类的值。
上面那个修改后是子类也有一个变量i和父类变量i不一样作者: 18838178213 时间: 2015-11-9 21:18
class Zi extends Super
{
i = 4;
}
public class Question
{
public static void main(String args[])
{
Zi zi = new Zi();
System.out.println(zi.i);
}
这个相当于Zi里有两个I肯定编译失败,作者: 化謇成蝶 时间: 2015-11-9 22:14
上面那个 你可以在子类里再定义一个变量i 但肯定要标示类型的 要改成int i = 4 就不会编译出错了 这里的i是成员变量 你调用i的时候 先在父类里初始化 然后在子类里显示初始化 i=4
下面那个 子类里的i写在了函数里 是局部变量 只在show方法里有效 所以不会改变成员变量i的值 成员变量里的i一直是5 i=5作者: 李凯666 时间: 2015-11-9 22:55
这个代码也太乱了,Zi zi = new Zi();
System.out.println(zi.i);就出现了两个i不会编译通过的作者: flyingwind 时间: 2015-11-9 23:15
子类会继承父类的成员变量, 所以第二个程序 在show方法里调用变量i 是可以的 , 相当于调用从super类里继承的成员变量i. 而第一个程序报错的原因是恐怕是因为在 类中方法外 只能有声明变量语句(int i=4; 是可以的,). 而不允许有变量赋值语句(如 i=4).作者: flyingwind 时间: 2015-11-9 23:37
任何一个类中, 方法外, 类似于 int i ; 或者是 int i=4;这样的声明变量(或者一并初始化) 都是可以的, 不允许 有其他以外的操作.作者: chm006 时间: 2015-11-10 00:34
在new一个类的时候,成员变量就同当前对象申明在堆中了,继承关系的两个类,也是父类对象和子类对象分别加载进堆的,也有自己相应的成员变量,像你下面的i如果是在方法中,当调用方法的时候,i的值也就赋给了最近的当前对象了作者: 吃饭工作睡觉 时间: 2015-11-10 08:47
class Zi extends Super
{
i = 4;
}
这里面对i是赋值操作,对于赋值操作智能放在方法中。、
所以下方类可以通过:
class Zi extends Super
{
void show()
{
i = 4;
}
}作者: daividtu 时间: 2015-11-10 09:01
class Zi extends Super
{
i = 4;
}
这样肯定有问题啊,实例化子类的时候,是不是首先通过子类构造函数去实例化父类,这样才可以访问父类的成员。
你现在直接在子类里面直接改变i的值,都没去实例化父类, 编译能通过么??肯定通不过
在方法里面能访问,是因为你调用子类的方法必须实例化子类,实例化子类他就会实例子类的父类,当然就可以访问了父类的成员。。。作者: jiao731097245 时间: 2015-11-10 11:59
成员变量必须声明成员类型,所以第一个编译无法通过
第二个,由于子类继承了父类,所以子类有成员变量i,及可以编译通过,并且,值为5作者: wx_ao22R6RC 时间: 2015-11-10 12:58
虽然zi集成了supper但是你在supper定义的变量还是要声明成员类型的,作者: 许佳鑫 时间: 2015-11-10 13:02
改进后的代码也会编译失败 show()方法中局部变量都不申明变量吗? 要好好研究java基础的视频啊作者: jiao731097245 时间: 2015-11-10 14:40
成员变量必须声明其类型,由于第一个zi类中对i没有声明类型,所以会报错。 第二个,由于zi类继承了super类,所有zi类中有成员变量i。所以在方法show中可以正常调用。最下面这个主函数中调用的是zi类对象中成员变量i。zi类中包含在父类进行过来的i。此处打印的结果为:5作者: 1191065242 时间: 2016-5-1 18:43
class Super{ int i = 5;
}
class Zi extends Super
{
int i = 4; //你这里少了int类型
}