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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Moonboy2014 中级黑马   /  2014-6-13 11:23  /  2536 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

子父类中的变量存在覆盖吗?

21 个回复

倒序浏览
不存在。。。。。。。。。。
回复 使用道具 举报
对于继承,类中变量好像不存在覆盖这个说法吧!
回复 使用道具 举报
方法可以,变量不可以。你可以自己写个程序试一下嘛。。
回复 使用道具 举报
class FuTest
{
    int num=5;
               
        }
       
class Zi  extends FuTest
{
       
        public static void main(String []args)
        {
                int num=21;
                System.out.println(num);
                }
       
       
        }

比如这种情况 :
打印结果是 21.
因为num就是栈上的一个变量。 子类在栈内存中改变了它的值21。所以输出结果为21。

class FuTest
{
  int num=5;
               
        }
       
class Zi  extends FuTest
{
       
        public static void main(String []args)
        {
                int num=21;
                System.out.println(new Zi().num);
                }
       
       
        }
打印结果 5.
这里面生成了一个对象,调用的的是父类中的成员变量。
为什么不是子类的呢?
我的理解就是 子类中对象的num还没有加载,因为静态优先于对象存在。而父类的num在子类加载前就已经存在了。


class FuTest
{
//  int num=5;
               
        }
       
class Zi  extends FuTest
{
       
        public static void main(String []args)
        {
                int num=21;
                System.out.println(new Zi().num);
                }
       
       
        }
打印结果:
错误: 找不到符号
    System.out.println(new Zi().num);
也就是num在对象中还不存在。

自己的理解 不对的请更正

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
唐坚 发表于 2014-6-13 14:34
class FuTest
{
    int num=5;

问一下哪里的静态啊
回复 使用道具 举报
HJK 中级黑马 2014-6-13 23:56:16
7#
子类会继承父类的所有非私有的变量!子类也会有自己的变量。
回复 使用道具 举报
变量不可以覆盖,重写父类的方法会覆盖父类的方法!
回复 使用道具 举报
可以继承,没有覆盖,方法可以继承和覆盖。
回复 使用道具 举报
这个没有覆盖的概念
回复 使用道具 举报
Moonboy2014 发表于 2014-6-13 23:30
问一下哪里的静态啊

main方法就是静态的。那为什么要被修饰静态呢?原因就是,如果一个类她定义了main方法的话,那么她的main方法会在这个类的构造函数运行之前被调用。
  由于main方法运行的时候尚未在JVM里生成相应对象(构造函数未被执行),所以要声明为static。

还有我我自己这段代码理解错了 :想了久,终于想到原因了。

打印结果:
错误: 找不到符号
    System.out.println(new Zi().num);
也就是num在对象中还不存在。

这个错误的原因 是因为“   int num=21;这里是定义了一个局部变量而不是成员变量,所以
new Zi().num . 才会不存在的原因。
如果把num的定义成成员变量就没问题了 。呼呼。。
回复 使用道具 举报
ender 中级黑马 2014-6-14 08:34:21
12#
impossible
回复 使用道具 举报
本帖最后由 lzy418 于 2014-6-14 09:00 编辑

子类可以继承父类的protected、default、public变量。而private不能继承。
其中,局部变可以通过覆写方法本身进行更改。
而全局变量继承之后也可以建立同名全局变量并更改数值,这是允许的。

public class fu {
        static char cr='A';
        public void pout(){        
                System.out.println(cr);
        }
}
class zi extends fu{
        char cr='B';//写入自己的cr变量
        public static void main(String[] agrs){
        zi tm=new zi();
        tm.pout();//调用父类方法输出
        System.out.println(tm.cr);//调用子类对象的cr
        }
        //public void pout(){        
        //        System.out.println(cr);
        //}
}

如同例子所示,输出的结果是AB。
使用父类方法时调用父类的cr值,而建立子类对象调用到的cr就是更改过的。
如果想要在父类方法中调用子类值只能进行方法覆写。代码粘贴过来结果就会变成:BB

如果将zi tm=new zi;改为fu tm=new zi;
则结果变为AA,因为tm是个父类对象。

结果是这俩值虽然同名但可以共存,取值看调用,不存在覆盖。看不太懂的话,代码直接可以复制的拿去试。


评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1 赞一个!

查看全部评分

回复 使用道具 举报
唐坚 发表于 2014-6-14 02:21
main方法就是静态的。那为什么要被修饰静态呢?原因就是,如果一个类她定义了main方法的话,那么她的main ...

正解:loveliness:
回复 使用道具 举报
本帖最后由 idency 于 2014-6-14 10:47 编辑

不存在!如果子父类变量存在同名情况!在创建子类对象时会在子类对象中开辟一块区域用于存储父类成员变量;如果在调用该同名成员变量时,根据变量使用的就近原则,先局部变量→子类成员变量→父类成员变量;所一会先
使用子类的成员变量,从直观上好像是被覆盖了!
回复 使用道具 举报 1 0
子类可以继承父类非私有的成员变量,也可以有自己独有的成员变量,但是不存在覆盖这一说,覆盖只是对于成员方法而言的
回复 使用道具 举报
不存在变量覆盖,只有方法覆盖吧
回复 使用道具 举报
只有普通方法才会覆盖,变量和静态方法都不会覆盖,
回复 使用道具 举报
唐坚 发表于 2014-6-14 02:21
main方法就是静态的。那为什么要被修饰静态呢?原因就是,如果一个类她定义了main方法的话,那么她的main ...

恩嗯嗯嗯嫩嗯嗯嗯恩恩呢嫩
回复 使用道具 举报
idency 发表于 2014-6-14 10:44
不存在!如果子父类变量存在同名情况!在创建子类对象时会在子类对象中开辟一块区域用于存储父类成员变量;如 ...

:handshake
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马