Java内部类
在Java中,共存在四种内部类,分别为对象内部类、方法内部类、静态内部类和匿名内部类(*)。下面简述前三种内部类的使用方法。
对象内部类:顾名思义,就是在类中嵌套一个非静态类。内部类的成员与构造函数与普通类基本相同。this.variable表示当前类下的对象。这种类可以被外部类访问,也可以访问外部类,包括protected对象。
方法内部类:在类的方法中定义另外的一个类。内部类不可用private、protected、public和static修饰,只可以用final与abstract修饰。这表示这个类只可以在类的该函数中使用,不可作用于外部域。此外,内部类只可以访问被final修饰的局部变量,原因很好理解——局部变量在方法调用后会随时消失,因此一般的局部变量不可能被局部内部类引用。局部内部类可以调用其他的外部类。
静态类:静态类中用于存放静态对象和静态方法。表示当前类中的对象用类名.variable来表示,这与非静态类的this.variable具有明显的不同。静态类不能访问非static的对象与方法。
匿名内部类:匿名内部类需要使用父类或接口来新建一个匿名类。在Object对象中,其中有内置接口toString()。匿名内部类只能使用一次,每次使用完后需要重新建立。
package helloWorld; public class InnerClass { private String name; private int age; public InnerClass(){} public InnerClass(String name,int age) { this.name=name; this.age=age; } //类对象内部类 public class Inner extends InnerClassTemp { private String name; private int age; public Inner(){} public Inner(String name,int age) { super("SJTU"); this.name=name; this.age=age; } public void print() { System.out.println("class Inner: "+name+": "+age+" "+super.school); } } //类方法内部类 //===========
/*
* obj中定义了toString()这个接口
* public Object copy()
*/
public String copy()
{
final String name="Elizabeth";
class Inner2
{
public String print()
{
//System.out.println("class Inner2: "+name);
return name+"!";
}
}
Inner2 in2=new Inner2();
return in2.print();
}
//静态内部类 public static class Inner3 { //对象与方法均需要为static static String name; static int age; public Inner3(){} public Inner3(String name,int age) { //静态类中Inner3.name表示静态对象 //非静态类中不能这样使用 Inner3.name=name; Inner3.age=age; } public static void print() { System.out.println("class Inner3: "+name+": "+age); } } public void print() { System.out.println("class InnerClass: "+name+": "+age); } //匿名内部类 //===============
public Object annoyCopy(String str)
{
return new Object(){
public String toString()
{
return "How do you do! "+str;
}
};
}
} class InnerClassTemp { protected String school; public InnerClassTemp(){} public InnerClassTemp(String school) { this.school=school; } }
//类的实例化 InnerClass ic=new InnerClass("Andy",24); ic.print(); //类对象的内部类 InnerClass.Inner ici1=ic.new Inner("Jane",23); ici1.print(); //静态内部类 //静态内部类可以不通过实例就创建类 //这与非静态类有较大差别 InnerClass.Inner3 ici3=new InnerClass.Inner3("Tom",27); ici3.print();
//匿名内部类
System.out.println(ic.annoyCopy("Sansa").toString());
结果为: class InnerClass: Andy: 24 class Inner: Jane: 23 SJTU
Elizabeth! class Inner3: Tom: 27
How do you do! Sansa
在Java中存在Boolean、Character、Byte、Short、Integer、Long、Float、Double类,还有bool、char、byte、short、int、、float、long、double八种数据类型。前面八种基本类被封装在Object类中,为引用类型。将数值赋给前八种类称为封装(Boxing),将前八种类的值传递给后八种数据类型称为拆包(Unboxing)。这些操作均由编译器compiler自动完成。下面以double与Double为例简述他们的区别:
1.Double是java定义的类,而double是预定义数据类型(8种中的一种)
2.Double是对double类型的封装,内置很多方法可以实现String到double的转换,以及获取各种double类型的属性值(MAX_VALUE、SIZE等等)。
基于上述两点,如果是在普通的定义一个浮点类型的数据,两者都可以,但是Double是类所以其对象是可以为NULL的,而double定义的不能为NULL。
1 package helloWorld; 2 3 public class AdvancedGrammar { 4 enum Light{Red,Orange,Yello,Green,Blue,Purple}; 5 public AdvancedGrammar(){} 6 public void Box() 7 { 8 Integer I1=new Integer(10); 9 int i1=I1; 10 Integer I2=11; 11 int i2=I2; 12 System.out.println(I1+" "+i1); 13 System.out.println(I2+" "+i2); 14 15 Object[] obj=new Object[]{1,"Nice"};//Object为引用类型 16 System.out.println(obj[0]+" "+obj[1]); 17 System.out.println((Integer)obj[0]+" "+(String)obj[1]); 18 } 19 20 }
1 AdvanceGrammar advg=new AdvanceGrammar(); 2 advg.Box(); 3 结果为: 4 10 10 5 11 11 6 1 Nice 7 1 Nice