黑马程序员技术交流社区

标题: 各位大神帮下忙,想了好久的一个问题 [打印本页]

作者: 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类型         
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2