内部类
概述
内部类,即为在一个类中定义的类
语法格式
class A{classB{B即为内部类}}
特点
内部类可以直接访问外部类中的成员,包括私有成员
外部类要访问内部类的成员,必须要建立内部类的对象
在成员位置的内部类是成员内部类
在局部位置的内部类是局部内部类
内部类代码示例
package cn.tedu.innerclass;/*** 内部类案例*/public class TestInner1 {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner();oi.delete();System.out.println(oi.sum);//直接创建外部类匿名对象调用外部类方法new Outer().find();}}class Outer{String name;private int age;public void find(){System.out.println("马钊要起飞了!");/*System.out.println(sum);delete();内部类无法直接使用外部类的资源需要创建内部类对象后才可使用*/Inner in = new Inner();System.out.println(in.sum);in.delete();}class Inner{int sum = 100;public void delete(){System.out.println("马钊起飞成功");System.out.println(name);System.out.println(age);//只能单向调用,不能循环调用,会导致栈溢出异常//find();}}}
私有内部类
成员内部类被Private修饰以后,无法被外界直接创建创建对象使用
所以可以创建外部类对象,通过外部类对象间接访问内部类的资源
package cn.tedu.innerclass;/*** 测试成员内部类被private修饰*/public class TestInner2 {public static void main(String[] args) {/*Outer2.Inner2 oi = new Outer2().new Inner2();oi.eat();报错*/Outer2 o2 = new Outer2();o2.getInner2Eat();}}class Outer2{/*成员内部类位置:类里方法外*/private class Inner2{public void eat(){System.out.println("明天,马钊,吃的,起飞!");}}public void getInner2Eat(){Inner2 in = new Inner2();in.eat();}}
静态内部类
静态资源访问时不需要创建对象,可以通过类名直接访问
访问静态类中的静态资源可以通过”. . . ”链式加载的方式访问
package cn.tedu.innerclass;/*** 测试静态内部类*/public class TestInner3 {public static void main(String[] args) {/*Outer3.Inner3 oi = new Outer3().new Inner3();oi.watermelon();new Outer3().new Inner3().watermelon();内部类被static修饰后,报错*/Outer3.Inner3 oi = new Outer3.Inner3();//静态内部类普通对象oi.watermelon();new Outer3.Inner3().watermelon();//静态内部类匿名对象//访问静态内部类的静态资源---链式加载Outer3.Inner3.eat();}}class Outer3{static class Inner3{public void watermelon(){System.out.println("吃瓜大赛");}public static void eat(){System.out.println("吃瓜吃到吐");}}}
局部内部类
调用局部内部类功能 在外部类中创建局部类的对象并且调用其功能
package cn.tedu.innerclass;/*** 测试局部内部类*/public class TestInner4 {public static void main(String[] args) {Outer4 o = new Outer4();o.show();}}class Outer4{public void show(){System.out.println("Other4-----show()");//局部内部类--方法里class Inner4{String name;int age;public void eat(){System.out.println("show-----eat()");}}/*在外部类中创建局部类的对象并且调用其功能*/Inner4 in = new Inner4();in.eat();System.out.println(in.age);System.out.println(in.name);}}
匿名内部类
匿名内部类属于局部内部类,而且是没有名字的局部内部类,通常和匿名对象一起使用
package cn.tedu.innerclass;/*** 匿名内部类*/public class TestInner5 {public static void main(String[] args) {/*创建接口实现类的对象才能调用方法===创建接口实现类+重写接口中的抽象方法+调用方法匿名内部类没有名字,通常与匿名对象结合使用,用于调用一次&一个方法*/new Inner1() {@Overridepublic void save() {System.out.println("保存");}@Overridepublic void get() {System.out.println("获取");}}.save();new Inner11() {@Overridepublic void play() {System.out.println("大赛");}}.play();new Inner3().get();}}interface Inner1{void save();void get();class Inner4{}}abstract class Inner11{public void eat(){System.out.println("吃瓜");}abstract public void play();}class Inner3{public void eat(){System.out.println("吃土");}public void get(){System.out.println("获取");}}
