从开始有要建立类的作业开始,就发现一个问题:经常建立一个对象后,会出现“未实例化”的错误提醒,在搜过一点代码后敷衍地解决了这个问题。后来发现,自己一直建立的是成员内部类,导致每一次都要先建立一个主类的对象。
1. 与主类并列的普通类
主类,一般就是新建类文件后命名的那个类。而在这个类的外部,我们可以建立一个类,那我们使用主类的成员中的内部类的时候,就可以不用先实例化对象了。
注意:普通类前面不能加public & private & protected修饰
public class MainClass
{
//属性和方法
}
/*与主类并列的普通类*/
class Otherclass{ }
2. 成员内部类
在主类中定义的类,可以使用public private等修饰。
3. 局部内部类
可以在类的局部位置定义,常见的是在类的方法中定义。
若在方法中定义一个局部内部类,注意以下几点:
- 注意该类的作用域。比如在一个类A的方法public void do( )中定义了一个局部内部类B,则在类A中的其它方法将无法使用类B。
- 如果需要在方法中使用局部内部类,该局部变量需要设置为final类型。
4. 匿名内部类
当局部内部类只被使用一次时,可以尝试使用匿名内部类。
通常,在匿名内部类定义结束后,需要加分号进行标识,但是这个并不代表内部类的结束,二十代表引用表达式的创建。
例:同时实现了成员内部类、局部内部类、匿名内部类。
public class Lab5_2 {
/*接口*/
interface Car
{
public void run(); //抽象方法
}
/*CatTest_1类,实现Car接口*/
/*成员内部类*/
class CarTest_1 implements Car
{
/*方法*/
public void run() //覆盖run方法
{
System.out.println("Car 1 run!");
}
public void CarRun() //在该方法中定义一个局部内部类
{
/*局部内部类*/
class CarTest_2 //局部内部类carTest_2
{
/*方法*/
public void CarRunTo()
{
System.out.println("Car 2 run!");
}
}
CarTest_2 c=new CarTest_2();
c.CarRunTo();
/*匿名类:一般继承抽象类和接口*/
Car anonymity=new Car(){
public void run()
{
System.out.println("Car 3 Run!");
}
};
anonymity.run();
}
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Lab5_2 t=new Lab5_2();
CarTest_1 cc=t.new CarTest_1();
cc.run();
cc.CarRun();
}
}