Java编程思想-Class对象(附上课后题)

什么是Class对象?

首先Class对象是用来创建类的所有的“常规”对象,Java使用Class对象来执行RTTI。

每个类都有一个Class对象,该对象由JVM创建和加载。当程序创建第一个(注意是第一个哟)对类的静态成员的引用时,就会加载这个类。这一点说明了构造器也是类的静态方法,即使在构造器之前并没有使用static关键字。

类的加载过程

类加载器首先会检查这个类的Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件。一旦这个类的Class对象被加载仅内存,就会被用来创建这个类的所有对象。

package thinking.java.chapter13;
class Candy{
	static {
		System.out.println("load candy");
	}
}
class Gum{
	static {
		System.out.println("load gum");
	}
}
class Cookie{
	static {
		System.out.println("load cookie");
	}
}
public class SweetShop {

	public static void main(String[] args) {
		System.out.println("inside main");
		new Candy();
		System.out.println("after creating candy");
		try {
			Class.forName("Gum");
		} catch (ClassNotFoundException e) {
			System.out.println("couldn't find gum");
		}
		System.out.println("after Class.forName(\"Gum\")");
		new Cookie();
		System.out.println("after creating cookie");
	}

}

由上面的例子可以得到:Class对象仅在需要的时候才被加载,static初始化在类加载时就进行了。

其中forName()是取得Class对象的引用的一种方法,返回的是一个Class对象的引用。如果在Class.forName()中找不到你要加载的类,那么就会抛出ClassNotFoundException

无论何时如果你想在运行时使用类型信息,就必须首先获得对恰当的Class对象的引用,如使用Class.forName().

练习1

package thinking.java.chapter13;

interface HasBatteries{}
interface WaterProof{}
interface Shoot{}
class Toy{
//	注释掉默认构造器后无法实例化该类
//	因为使用newInstance()来创建的类,必须带有默认的构造器
//	Toy(){}
	Toy(int i){}
}
class FancyToy extends Toy
implements HasBatteries,WaterProof,Shoot{
	FancyToy(){
		super(1);
	}
}
public class ToyTest {
static void printInfo(Class cc) {
	System.out.println("Class name:"+cc.getName()+
			" is interface?["+cc.isInterface()+"]");
	System.out.println("Smple name: "+cc.getSimpleName());
	System.out.println("canonical name: "+cc.getCanonicalName());
}
	public static void main(String[] args) {
		Class x = null;
		try {
			x = Class.forName("thinking.java.chapter13.FancyToy");
		} catch (ClassNotFoundException e) {
			System.out.println("can't find fancytoy");
			System.exit(1);
		}
		printInfo(x);
		for(Class face:x.getInterfaces())
			printInfo(face);
		Class up = x.getSuperclass();
		Object obj = null;
		try {
			obj = up.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		printInfo(obj.getClass());
	}

}

练习2

package thinking.java.chapter13;

interface HasBatteries{}
interface WaterProof{}
interface Shoot{}
interface Files{}
class Toy{
//	注释掉默认构造器后无法实例化该类
//	因为使用newInstance()来创建的类,必须带有默认的构造器
	Toy(){}
	Toy(int i){}
}
class FancyToy extends Toy
implements HasBatteries,WaterProof,Shoot,Files{
	FancyToy(){
		super(1);
	}
}
public class ToyTest {
static void printInfo(Class cc) {
	System.out.println("Class name:"+cc.getName()+
			" is interface?["+cc.isInterface()+"]");
	System.out.println("Smple name: "+cc.getSimpleName());
	System.out.println("canonical name: "+cc.getCanonicalName());
}
	public static void main(String[] args) {
		Class x = null;
		try {
			x = Class.forName("thinking.java.chapter13.FancyToy");
		} catch (ClassNotFoundException e) {
			System.out.println("can't find fancytoy");
			System.exit(1);
		}
		printInfo(x);
		for(Class face:x.getInterfaces())
			printInfo(face);
		Class up = x.getSuperclass();
		Object obj = null;
		try {
			obj = up.newInstance();
		} catch (InstantiationException | IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		printInfo(obj.getClass());
	}

}

练习3:

package thinking.java.chapter13;

import java.util.Arrays;
import java.util.List;

abstract class Shape{
	void draw() {
		System.out.println(this+".draw()");
	}
abstract public String toString();
}
class Circle extends Shape{

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Circle";
	}
	
}
class Square extends Shape{

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Square";
	}
	
}
class Triangle extends Shape{
	public String toString() {
		return "Trangle";
	}
}
class Rhomboid extends Shape{
	public String toString() {
		return "Rhomboid";
	}
}
public class Shape3 {

	public static void main(String[] args) {
		List<Shape> shapeList = Arrays.asList(new Circle(),new Square(),new Triangle(),new Rhomboid());
		for(Shape s:shapeList) {
			s.draw();
		}
		Rhomboid r = new Rhomboid();
		((Shape)r).draw();
//		无法转换的类型
//		((Circle)r).draw();
		
	}

}

练习7

package thinking.java.chapter13;
class Candy{
	static {
		System.out.println("load candy");
	}
}
class Gum{
	static {
		System.out.println("load gum");
	}
}
class Cookie{
	static {
		System.out.println("load cookie");
	}
}
public class SweetShop {

	public static void main(String[] args) {
		if(args.length<1) {
			System.out.println("usage:sweetname");
			System.exit(0);
		}
		Class c = null;
		try {
			c = Class.forName(args[0]);
			System.out.println("enjoy:"+args[0]);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

练习8:

package thinking.java.chapter13;
class A{}
class B extends A{}
class C extends B{}

public class Demo08 {
public static void printSuperClass(Object o) {
	if(o.getClass().getSuperclass()!=null) {
		System.out.println(o.getClass()+" is a subclass of "+o.getClass().getSuperclass());
	}
	try {
		printSuperClass(o.getClass().getSuperclass().newInstance());
	} catch(InstantiationException e) {
		System.out.println("Unable to instantiate obj");
	} catch(IllegalAccessException e) {
		System.out.println("Unable to access");
	}
}
	public static void main(String[] args) {
		printSuperClass(new C());
	}

}

练习10:

package thinking.java.chapter13;

public class Exe10 {

	public static void main(String[] args) {
//char数组是一个对象
		char[] c = new char[10];
		System.out.println("superClass:"+c.getClass().getSuperclass());
		System.out.println("c instaneof object:"+(c instanceof Object));
	}

}

猜你喜欢

转载自blog.csdn.net/wo8vqj68/article/details/84950536