黑马程序员技术交流社区

标题: 下层类改写基类方法有点不明白? [打印本页]

作者: 涂金哲    时间: 2012-6-18 10:33
标题: 下层类改写基类方法有点不明白?
程序介绍:基类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();  
}
}
作者: 伊文龙    时间: 2012-6-18 10:48
构造方法的第一行都有隐士的一句代码super();,用来调用父类无参的构造方法

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

父类不可能知道子类会有什么样的方法,所以在super()中调用的method();是父类的method();方法
作者: 郑传庆    时间: 2012-6-18 11:10
第一个问题楼上已经回答了,第二个问题:为什么会打印不出值? 我的理解是这个的: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();
}
}


作者: 涂金哲    时间: 2012-6-18 11:27
伊文龙 发表于 2012-6-18 10:48
构造方法的第一行都有隐士的一句代码super();,用来调用父类无参的构造方法

SubClass sc=new SubClass();  ...

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

通过sc·method 确实可以访问到str 的值,这个是很正常的。普通方法都可以访问的,我疑惑的是改写后的怎么就不能访问了?这总部能解释为是一种保护,强制规定改写的不能访问本类的成员属性???这太牵强附会了吧……
作者: 吴小东    时间: 2012-6-18 12:40
本帖最后由 吴小东 于 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. }
复制代码





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