A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
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的运行原理真让我糊涂了,求各位大神帮忙梳理下!!



最佳答案

查看完整内容

子类中继承了父类的成员变量int i=5;(记住是成员变量,和成员方法是不同的实例成员) 这时,如果在给i赋值--相当于: class Test{ int num= 5; num=4;//这里实际是算数运算,但凡代码主体,都必须封装在函数中,这里的赋值运算当然会编译失败咯 //而应该在方法里操作成员,所以第二种情况是对的 }

15 个回复

倒序浏览
子类中继承了父类的成员变量int i=5;(记住是成员变量,和成员方法是不同的实例成员)
这时,如果在给i赋值--相当于:
class Test{
        int num= 5;
        num=4;//这里实际是算数运算,但凡代码主体,都必须封装在函数中,这里的赋值运算当然会编译失败咯
//而应该在方法里操作成员,所以第二种情况是对的
}
回复 使用道具 举报
class Zi extends Super
{
         i = 4;                 
}
这个 改为  class Zi extends Super
{
       int  i = 4;                 
}


下面那个是在函数里面,直接改变父类的值。
上面那个修改后是子类也有一个变量i和父类变量i不一样
回复 使用道具 举报
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肯定编译失败,
回复 使用道具 举报
上面那个  你可以在子类里再定义一个变量i  但肯定要标示类型的  要改成int i = 4  就不会编译出错了 这里的i是成员变量   你调用i的时候 先在父类里初始化 然后在子类里显示初始化 i=4
下面那个 子类里的i写在了函数里 是局部变量 只在show方法里有效  所以不会改变成员变量i的值   成员变量里的i一直是5 i=5
回复 使用道具 举报
李凯666 来自手机 中级黑马 2015-11-9 22:55:18
地板
这个代码也太乱了,Zi zi = new Zi();
  System.out.println(zi.i);就出现了两个i不会编译通过的
回复 使用道具 举报
子类会继承父类的成员变量, 所以第二个程序 在show方法里调用变量i 是可以的 , 相当于调用从super类里继承的成员变量i.   而第一个程序报错的原因是恐怕是因为在  类中方法外   只能有声明变量语句(int i=4; 是可以的,). 而不允许有变量赋值语句(如 i=4).
回复 使用道具 举报
任何一个类中,  方法外,  类似于 int i ; 或者是 int i=4;这样的声明变量(或者一并初始化) 都是可以的, 不允许 有其他以外的操作.
回复 使用道具 举报
chm006 中级黑马 2015-11-10 00:34:32
9#
在new一个类的时候,成员变量就同当前对象申明在堆中了,继承关系的两个类,也是父类对象和子类对象分别加载进堆的,也有自己相应的成员变量,像你下面的i如果是在方法中,当调用方法的时候,i的值也就赋给了最近的当前对象了
回复 使用道具 举报
class Zi extends Super
{
        i = 4;                 
}
这里面对i是赋值操作,对于赋值操作智能放在方法中。、
所以下方类可以通过:
class Zi extends Super
{
        void show()
        {
                 i = 4;
        }                 
}
回复 使用道具 举报
class Zi extends Super
{
        i = 4;                 
}
这样肯定有问题啊,实例化子类的时候,是不是首先通过子类构造函数去实例化父类,这样才可以访问父类的成员。
你现在直接在子类里面直接改变i的值,都没去实例化父类, 编译能通过么??肯定通不过
在方法里面能访问,是因为你调用子类的方法必须实例化子类,实例化子类他就会实例子类的父类,当然就可以访问了父类的成员。。。
回复 使用道具 举报
成员变量必须声明成员类型,所以第一个编译无法通过
第二个,由于子类继承了父类,所以子类有成员变量i,及可以编译通过,并且,值为5
回复 使用道具 举报
虽然zi集成了supper但是你在supper定义的变量还是要声明成员类型的,
回复 使用道具 举报
改进后的代码也会编译失败  show()方法中局部变量都不申明变量吗?      要好好研究java基础的视频啊
回复 使用道具 举报
成员变量必须声明其类型,由于第一个zi类中对i没有声明类型,所以会报错。  第二个,由于zi类继承了super类,所有zi类中有成员变量i。所以在方法show中可以正常调用。最下面这个主函数中调用的是zi类对象中成员变量i。zi类中包含在父类进行过来的i。此处打印的结果为:5
回复 使用道具 举报
class Super{        int i = 5;        
}

class Zi extends Super
{
       int i = 4;        //你这里少了int类型         
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马