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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 涂金哲 中级黑马   /  2012-6-18 10:33  /  1420 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

程序介绍:基类BaseClass中有method()方法,下层类SubClass改写了method()方法,创建一个SubClass的对象。 问题描述:1,当创建一个SubClass对象sc,会隐式调用基类的构造器初始化,基类构造器调用了method()方法,从程序的结果显示调用的是SubClass类改写的method方法(基类中也定义了method方法,sc编译类型是SubClass,运行类型也是SubClass,可是sc调用的是基类构造器,为什么不就近原则在本类(基类)中调用method??有点类似多态中的调用)2,SubClass中改写了method方法,method方法访问本类的成员时怎么会为空???  
用手机发的,格式上有点对不起大家哈……
class BaseClass {  
BaseClass()  
{   
method();  
}  
public void method()  {   
System.out.println("BaseClass的方法");  
}
}
class SubClass extends BaseClass {  private String str="SubClass";  public void method()  {   
System.out.println("SubClass改写了method方法");   
System.out.println(str);  
}
}
public class Construtor {  public static void main(String[] args)  {  
SubClass sc=new SubClass();  
}
}

评分

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

查看全部评分

5 个回复

倒序浏览
构造方法的第一行都有隐士的一句代码super();,用来调用父类无参的构造方法

SubClass sc=new SubClass();  :当你执行者一句时,Java虚拟机就会调用SubClass 的无参构造方法
而你的SubClass 类的无参构造方法完整的样子应该是:
public SubClass ()  
{   
   super();
}  

父类不可能知道子类会有什么样的方法,所以在super()中调用的method();是父类的method();方法

评分

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

查看全部评分

回复 使用道具 举报
第一个问题楼上已经回答了,第二个问题:为什么会打印不出值? 我的理解是这个的:method() 是重写父类的方法,在运行之前,其实子类method() 就已经加载还了将要打印的语句了,而由于str是一个私有的字符串变量,在没有该类的对象去调用时,java虚拟机是不会去自动调用的。如果把str定义成静态的字符串变量java虚拟机就会去自动调用的,这个原理就跟main方法一样。楼主可以到网上找一些相关的资料看看。希望对你有所帮助

public class BaseClass {
BaseClass() {
  method();
}
public void method() {
  System.out.println("BaseClass的方法");
}
}
class SubClass extends BaseClass {

public static String str = "SubClass";//-------改成静态的
@Override
public void method() {
//  super.method();
  System.out.println("SubClass改写了method方法");
  System.out.println(str);
}
}

public class Construtor {
public static void main(String[] args) {
  SubClass sc = new SubClass();
}
}

评分

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

查看全部评分

回复 使用道具 举报
伊文龙 发表于 2012-6-18 10:48
构造方法的第一行都有隐士的一句代码super();,用来调用父类无参的构造方法

SubClass sc=new SubClass();  ...

运行结果是:
subclass 改写了method 方法
Null
调用的是下层类的方法,您可以试试,我问的是为什么基类构造器不调用自己的方法?
回复 使用道具 举报
郑传庆 发表于 2012-6-18 11:10
第一个问题楼上已经回答了,第二个问题:为什么会打印不出值? 我的理解是这个的:method() 是重写父类的方 ...

通过sc·method 确实可以访问到str 的值,这个是很正常的。普通方法都可以访问的,我疑惑的是改写后的怎么就不能访问了?这总部能解释为是一种保护,强制规定改写的不能访问本类的成员属性???这太牵强附会了吧……
回复 使用道具 举报
本帖最后由 吴小东 于 2012-6-18 12:46 编辑
  1. //对于楼主的疑问,我想是不是可以用以下的方式来表示一下,大家来探讨下,有什么不对的地方请指出来
  2. class SupClass extends BaseClass
  3. {
  4.         private String str = "supClass";
  5.         public void method()
  6.         {        
  7.                 //super(); 下面代码是用匿名内部类实现对method的重写,也就是用的是父类的方法,但是方法体是子类的
  8.                 new BaseClass()
  9.                         {
  10.                                 public void method()
  11.                                 {
  12.                                         System.out.println("SupClass.method()");
  13.                                         System.out.println(str);//如果这样写的话,这里就有个问题出现了,str是什么时候被初始化成null的,父类是不存在str的引用
  14.                                 }
  15.                         }.method();        
  16.         }
  17. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马