黑马程序员技术交流社区

标题: 亲们,帮我读下这段代码 尤其 i 是怎么调用的 [打印本页]

作者: 段兆洋    时间: 2014-4-30 11:15
标题: 亲们,帮我读下这段代码 尤其 i 是怎么调用的
写出程序结果
class Super
{
        int i=0;       
        public Super(String s)
        {
                i=1;       
        }
}
class Demo extends Super
{
        public Demo(String s)
        {
               
                i=2;                       
        }
        public static void main(String[] args)
        {
                Demo d=new Demo("yes");
                System.out.println(d.i);
        }
}
//编译失败,因为父类中缺少空参数的构造函数。
//或者子类应该通过super语句指定要调用的父类中的构造函数。


假设 有super调用父类函数,为什么结果是2?(毕向东基础视频里讲的)
话说 d.i 是什么啊
这东西能直接调用变量?
作者: 雪碧拌米饭    时间: 2014-4-30 12:25
Demo类继承了Super类,也就是继承了Super类的成员变量和方法,所以在Demo类中也存在一个成员变量i,而d是Demo的一个实例对象,所以在d中也存在一个成员变量i因此可以直接用d.i的形式进行调用!
作者: 段兆洋    时间: 2014-4-30 13:00
雪碧拌米饭 发表于 2014-4-30 12:25
Demo类继承了Super类,也就是继承了Super类的成员变量和方法,所以在Demo类中也存在一个成员变量i,而d是De ...

不是,那yes传哪去了?  为什么 编译会失败? 而不是直接打印2呢
作者: lren    时间: 2014-4-30 13:08
  1. package fw.wei.demo;

  2. class Super {
  3.         int i = 0;

  4.         public Super(String s) {
  5.                 i = 1;
  6.         }
  7. }

  8. public class Demo extends Super {
  9.         public Demo(String s) {
  10.                super(s);
  11.                 i = 2;
  12.         }

  13.         public static void main(String[] args) {
  14.                 Demo d = new Demo("yes");
  15.                 System.out.println(d.i);
  16.         }
  17. }
复制代码

子类的构造函数必须显式或隐式的调用父类构造函数






作者: 段兆洋    时间: 2014-4-30 13:10
这个参数到底是怎么传的。。。郁闷啊
作者: 段兆洋    时间: 2014-4-30 15:14
本帖最后由 段兆洋 于 2014-4-30 15:22 编辑
lren 发表于 2014-4-30 13:08
子类的构造函数必须显式或隐式的调用父类构造函数

super 不是可以不写吗  再说 这个相当于是函数的重载吗  为什么不能直接用啊
。。。。好吧 我知道怎么回事了。。。

作者: lzhuas    时间: 2014-4-30 15:21
我来回答吧,编译不通过是因为你父类没有空的构造函数,这样是不行的,因为在子类继承父类后编译是要必须要访问问父类的,你父类没有空参数的构造函数也行,但必须得手动去定义super语句的方式来指定。也就是在
public Demo(String s)
        {
                super("yes");//这就是必须得访问父类的意思,加上这句后就没问题了
                i=2;                        
        }d是你自己创建的Demo类的一个对象,d.i就是d对象中的i的值。要是这样你都不懂,我真没辙了

作者: 段兆洋    时间: 2014-4-30 15:24
lzhuas 发表于 2014-4-30 15:21
我来回答吧,编译不通过是因为你父类没有空的构造函数,这样是不行的,因为在子类继承父类后编译是要必须要 ...

额。。明白了  我忽略参数了。。。多谢~~~:D
作者: 段兆洋    时间: 2014-4-30 15:26
lzhuas 发表于 2014-4-30 15:21
我来回答吧,编译不通过是因为你父类没有空的构造函数,这样是不行的,因为在子类继承父类后编译是要必须要 ...

内部静态类访问外部非静态方法问题!!!
http://bbs.itheima.com/thread-116295-1-1.html
(出处: 黑马程序员IT技术论坛)
帮忙看看我这个问题呗 :lol
作者: lzhuas    时间: 2014-4-30 17:16
段兆洋 发表于 2014-4-30 15:26
内部静态类访问外部非静态方法问题!!!
http://bbs.itheima.com/thread-116295-1-1.html
(出处: 黑马程 ...

看来你还拖家带口的
作者: 段兆洋    时间: 2014-4-30 18:10
lzhuas 发表于 2014-4-30 17:16
看来你还拖家带口的

:lol哇咔咔 必须的啊
作者: luoyilan222    时间: 2014-4-30 18:10
public class Demo extends Super {
        // 代码在执行下面构造函数时 首先需要调用Super父类无参数构造函数,
        // 刚好你在Super中有写一个有参数构造函数,默认无参数构造函数就不会存在,所以就报错
        //你只需要加一个无参数构造函数就好了
        public Demo(String s) {
                i = 2;
        }

        public static void main(String[] args) {
                Demo d = new Demo("yes");
                System.out.println(d.i);
        }
}
作者: 段兆洋    时间: 2014-5-8 15:58
luoyilan222 发表于 2014-4-30 18:10
public class Demo extends Super {
        // 代码在执行下面构造函数时 首先需要调用Super父类无参数构造函数, ...

所以 等于说 子类还是必须访问父类的构造函数对吧
作者: 坤儿    时间: 2014-6-29 09:10
因为Demo类继承自super类 ,在demo类中定义了变量i; d 为demo类的实例对象可以通过 . 的方式调用成员方法或者变量
作者: 坤儿    时间: 2014-6-29 09:13
段兆洋 发表于 2014-4-30 13:00
不是,那yes传哪去了?  为什么 编译会失败? 而不是直接打印2呢

因为父类无默认的无参数构造函数,构造子类对象时会先构造父类对象,系统会默认调用父类无参的构造函数,当父类存在有参数的构造函数时 需要在子类的构造函数中显式调用父类构造函数




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