Archive

Archive for January 17th, 2010

Java 的构造方法

January 17th, 2010 leeing No comments

这是一道有关构造方法的程序:

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。

同时,在开发中应当尽可能遵循的原则是:一个类不要继承一个已经实现好的类,而是最好继承抽象类或者实现接口。

Categories: Java Tags:

Java 的引用传递

January 17th, 2010 leeing No comments

下面一道题,是关于 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的改变原理是相同的。

Categories: Java Tags: