一.匿名内部类:
内部类指的是在一个类的内部定义了另外的类结构,利用内部类可以方便地实现私有属性地互相访问,但是内部类需要明确地使用class定义。而匿名内部类是没有名字地内部类,其必须在抽象类或接口基础上才可以定义。
1.分析匿名内部类的产生动机:
interface Message {
public void print() ;
}
class MessageImpl implements Message {
public void print() {
System.out.println("Hello,World!");
}
}
public class TestDemo {
public static void main(String args[]) {
fun(new MessageImpl()) ;
}
public static void fun(Message msg) {
msg.print();
}
}
本程序首先在主方法中实例化MessageImpl子类,然后将实例化对象传递到fun()方法中,在fun()方法中利用接口对象调用print()方法。
2.采用匿名内部类简化类的定义:
interface Message {
public void print() ;
}
public class TestDemo {
public static void main(String args[]) {
fun(new Message() {
public void print(){
System.out.println("Hello,World!");
}
}) ;
}
public static void fun(Message msg) {
msg.print();
}
}
本程序利用匿名内部类的概念简化了Message接口子类的定义,在主方法中调用fun()方法时,直接实例化了接口对象,但是由于接口中包含抽象方法,所以需要同时覆写接口中的抽象方法才可以正常完成。
二.基本数据类型的包装类:
java在设计中有一个基本原则,即一切皆对象,也就是说一切操作都要求用对象的形式进行描述。但是就会出现一个矛盾:“基本数据类型不是对象”,为了解决这样的矛盾,可以采用基本数据类型包装的形式描述。
1.包装类雏形:
class MyInt {
private int num ;
public MyInt(int num) {
this.num = num ;
}
public int intValue() {
return this.num ;
}
}
public class TestDemo {
public static void main(String args[]) {
MyInt mi = new MyInt(10) ;
int temp = mi.intValue() ;
System.out.println(temp*2);
}
}
本程序为了实现int基本数据类型的包装,专门定义了一个MyInt类,通过这个类的构造就可以将基本数据类型转化为类对象的形式。
2.装箱和拆箱操作:
1.装箱操作:将基本数据类型变为包装类的形式;
每个包装类的构造方法都可以接收各自数据类型的变量;
2.拆箱操作:从包装类中取出被包装的数据。
利用从Number类中继承而来的一系列xxxValue()方法完成。
使用int和Integer:
public class TestDemo {
public static void main(String args[]) {
Integer obj = new Integer(10) ;
int temp = obj.intValue() ;
System.out.println(temp*2);
}
}
首先利用Integer类的构造方法将基本数据类型装箱为Integer类对象,然后利用从Number类继承的intValue()方法可以直接从包装类对象中取出所包装的int型数据。
使用double和Double:
public class TestDemo {
public static void main(String args[]) {
Double obj = new Double(10.2) ;
double temp = obj.doubleValue() ;
System.out.println(temp*2);
}
}
本程序与上一个程序功能完全相同,唯一区别就是将int型数据变为了double型数据。
使用Boolean和boolean(不是Number子类)
public class TestDemo {
public static void main(String args[]) {
Boolean obj = new Boolean(true) ;
boolean temp = obj.booleanValue() ;
System.out.println(temp);
}
}
虽然Boolean时对象型的包装,但是在使用过程中可以发现其代码的处理结构都是相似的。