黑马程序员技术交流社区

标题: 求助!!子类中调用父类函数的问题 [打印本页]

作者: 杜佳瑞    时间: 2012-7-30 14:18
标题: 求助!!子类中调用父类函数的问题

作者: 王峰    时间: 2012-7-30 15:00
super(name),使显式调用父类的构造方法,子类继承父类的方法getName(), new Student("lisi").getName()返回值的区别:如果父类和子类中变量唯一,则返回唯一变量的值;如果子类和父类中有相同的变量,则返回父类的值,Student类继承了Person类,子类Student中是为有参构造方法,所以想调用父类的构造方法,必须显式调用super("lisi"),否则,不会调用父类的构造方法!详细介绍如下:
第一种情况为:实际上没有调用父类的构造方法,由于继承Person,所以直接把参数赋给继承的name变量;调用的getName()返回仅有的变量值;
第二种情况为:通过super(name)调用父类的构造方法把参数值赋值给父类中的变量name,由于子类和父类都有相同的变量,所以调用方法getName()返回的是父类中的变量值,
第三种情况为:this。name = name把值赋给子类Student中的变量,而父类中的为空,由于子类和父类都有相同的变量,所以调用方法getName()返回的是父类中变量的null值,
作者: 陈汉维    时间: 2012-7-30 15:07

第三种情况,个人理解。

作者: 芦曦    时间: 2012-7-30 15:25
  1. class Student extends Person
  2. {
  3.         String name;//[color=Red]这是第三种情况。和第一种情况,区别在于这里定义了Student类里的name,默认的值为null.[/color]
  4.         Student (String name)
  5.         {
  6.                
  7.                 this.name=name;[color=Red]this.name指向的是本类的name[/color]
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 System.out.println(new Student("lisi").getName());
  12.         }
  13. }
复制代码

作者: 涂金哲    时间: 2012-7-30 15:38
建议把毕老师的构造器初始化视频再看一遍
子类在初始化的时候会隐式调用父类的默认数构造器
第一种情况:子类构造器指定了参数,调用自身的构造器初始化 结果:lisi
第二种情况:通过super显示调用了父类的有参数的构造器初始化,name属性。
第三种情况:子类的name属性只是被系统默认的初始化为了null,调用父类的

默认构造器完成父类的初始化动作,此时子类还没有来得及调用构造器初始化

。打印出来的就是null了
作者: 刘健    时间: 2012-7-30 17:19
本帖最后由 刘健 于 2012-7-30 17:31 编辑

将你的代码稍稍修改了下,你就能看出执行顺序了
  1. package com.itheima;

  2. public class persion {
  3.         String name = "父类赋值";
  4.        
  5.         public persion() {
  6.                 // TODO Auto-generated constructor stub
  7.         }
  8.        
  9.         public persion(String name){
  10.                 System.out.println("我是父类构造器");
  11.                 this.name = name;
  12.         }
  13.        
  14.         public String getName(){
  15.                 return name;
  16.         }
  17. }
复制代码
  1. package com.itheima;

  2. public class student extends persion{
  3.         String name = "子类赋值";
  4.        
  5.         public student(String name) {
  6.                 //super(name);
  7.                 this.name = name;
  8.                 System.out.println("我是子类构造器");
  9.         }
  10.        
  11.         public student() {
  12.                
  13.         }
  14.        
  15.         public static void main(String[] args) {
  16.                 System.out.println(new student("list").getName());
  17.         }
  18. }
复制代码
按你第一种情况,输出
  1. 我是父类构造器
  2. 我是子类构造器
  3. list
复制代码
按你第二种情况,输出
  1. 我是子类构造器
  2. list
复制代码
按你第三种情况,输出
  1. 我是子类构造器
  2. 父类赋值
复制代码
这样看你应该就明白了
作者: 陈红建    时间: 2012-7-30 17:47
我是java的子类,我继承了java的所有方法。哈哈




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