内部类的创建以及规范
一、成员内部类
1.内部类在外部使用时,无法直接进行实例化,需要借由外部类信息才能完成实例化。
2.内部类的访问修饰符,可以任意,但是访问范围会受到影响。
3.内部类可以直接访问外部类的成员,如果出现同名属性,优先访问内部类中定义的。
4.可以使用外部类.this.成员的方法,访问外部类中同名的信息。
5.外部类访问内部类信息,需要通过内部类实例,无法直接访问。‘
6.内部类编译后.class文件命名:外部类$内部类.class。
二、静态内部类
1.静态内部类,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例。
2.静态内部类对象实例时,可以不依赖于外部类对象。
3.可以通过外部类.内部类.静态成员的方法,访问内部类中的静态成员。
4.当内部类属性与外部类属性同名时,默认直接调用内部类中的成员;
如果选哟访问外部类中的静态属性,则可以通过 外部类.属性 的方法;
如果需要 访问外部类中的非静态属性,则可以通过 new 外部类().属性 的方法;
三、方法内部类
1.定义在方法内部,作用范围也在方法内。
2.和方法内部成员使用规则一样,class前面不可以添加public、private、protected、static。
3.类中不能包含静态成员。
4.类中可以包含final、abstract修饰的成员。
四、匿名内部类
1.匿名内部类中没有类型名称、实例对象名称。
2.编译后的文件命名:外部类$数字.class。
3.无法使用private、public、protected、abstract、static修饰。
4.无法编写构造方法,可以添加构造代码块。
5.不能出现静态成员。
6.匿名内部类可以实现接口也可以继承父类,但是不能兼得。
案例:
Ball类
public abstract class Ball{ //创建抽象方法play():void public abstract void play(); }
BallTest类
//创建类BallTest public class BallTest{ // 创建成员内部类Inner_m public class Inner_m extends Ball{ public void play(){ System.out.println("成员内部类:"); System.out.println("打篮球"); } } // 创建方法内部类 public void info(){ class Inner_f extends Ball{ public void play(){ System.out.println("*************"); System.out.println("方法内部类:"); System.out.println("打乒乓球"); } } Inner_f inner_f=new Inner_f(); inner_f.play(); } // 定义一个方法void playBall(Ball ball),调用play()方法 public void playBall(Ball ball){ ball.play(); } }
Test类
//测试类 public class Test { public static void main(String[] args) { //完成成员内部类内部测试 BallTest.Inner_m inner_m=new BallTest().new Inner_m(); inner_m.play(); //完成方法内部类测试 BallTest ballTest=new BallTest(); ballTest.info(); //完成匿名内部类测试 ballTest.playBall(new Ball() { @Override public void play() { System.out.println("************"); System.out.println("匿名内部类"); System.out.println("打排球"); } }); } }
浙公网安备 33010602011771号