这是一道有关构造方法的程序:
package org.leeing.mem;
abstract class BaseClass{
public BaseClass(){
this.print() ;
}
public abstract void print() ;
}
class SubClass extends BaseClass{
private int x = 100 ;
public SubClass(int x){
this.x = x ;
}
public void print(){
System.out.println("x = " + x) ;
}
}
public class TestJava{
public static void main(String args[]){
BaseClass a = new SubClass(10) ;
}
}
它的输出结果是:x = 0
这是因为子类对象的实例化过程是这样的:首先调用父类的构造方法BaseClass(),而在BaseClass()调用完毕之前,子类的构造方法SubClass()是不能得到调用的,同时SubClass 的所有属性也不能初始化,在这里中 int 类型的 x 默认值为 0。
同时,在开发中应当尽可能遵循的原则是:一个类不要继承一个已经实现好的类,而是最好继承抽象类或者实现接口。
下面一道题,是关于 Java 的引用传递的问题。
package org.leeing.mem;
class StringBean{
String str = "hello";
}
class IntBean{
int intVal = 100;
}
public class RefDemo02 {
public static void main(String[]args){
StringBean strbean = new StringBean();
strbean.str = "world";
IntBean intbean = new IntBean();
intbean.intVal = 33;
String strname = "strname not Changed";
change(strbean);
change(intbean);
change(strname);
System.out.println(strbean.str); // 输出 "strbean changed"
System.out.println(intbean.intVal);// 输出 999
System.out.println(strname); // 输出 "strname not Changed"
}
public static void change(StringBean temp){
temp.str = "strbean changed";
}
public static void change(String str){
str = "leeing";
}
public static void change(IntBean temp){
temp.intVal = 999;
}
}
输出是:
strbean changed
999
strname not Changed
可以看到 String 是不可变对象,而IntBean和StringBean则通过引用改变了内部变量的值,此处对int和String的改变原理是相同的。
评论