一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。
内部类是我们类的第五大成员(属性、方法、构造器、代码块、内部类),内部类最大的特点就是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
class Outer{ //外部类class Inner{ //内部类}}class Other{ //外部其他类}
说明:局部内部类是定义在外部类的局部位置,比如方法中,并且有类名。
public class z1_LocalInerClass { //外部其他类public static void main(String[] args) {Outer1 outer1 = new Outer1();outer1.m1();}
}class Outer1{ //外部类private int n1 = 100 ; //私有属性private int n2 = 200 ;private void m2(){ //私有方法System.out.println("outer1 m2方法被调用");}public void m1(){ //方法//1.局部内部类是定义在外部类的局部位置,如方法中或代码块中//3.不能添加访问修饰符,但是可以使用final修饰//4.作用域:仅仅在定义他的方法或代码块中final class Inner01{ //局部内部类(本质仍然是一个类)private int n2 = 800 ;public void f1(){//2.可以直接访问外部类的所有成员,包含私有的System.out.println("n1=" + n1);//7.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想要访问外部类的成员,则可以使用(外部类名.this.成员)//Outer01.this本质就是外部类对象,即哪个对象调用了m1,Outer01.this就是哪个对象System.out.println("内部类n2=" + n2 + " 外部类n2=" + Outer1.this.n2); //输出 内部类n2=800 外部类n2=200m2();}}//5.外部类在方法中,可以创建局部内部类的对象,然后调用方法Inner01 inner01 = new Inner01();inner01.f1();}}
new 类或接口(参数列表){类体
};
示例
public class z2_AnonymousInnerClass {public static void main(String[] args) {Outer2 outer2 = new Outer2();hod();}
}class Outer2{public void method(){//1.需求:使用IA接口,并创建对象,调用方法//2.传统方式:写一个类,实现该接口,并创建对象Tiger tiger = new Tiger();();//3.现在的需求:Tiger类只使用一次,后面不再使用。若这样的需求多了,单独为其创建一个类相当繁琐//4. 可以使用匿名内部类解决//5. tiger1的编译类型 -> IA//6.tiger1的运行类型 -> 匿名内部类 xxx -> 外部类名称$1/** 我们看底层* class xxx implements IA{* @Overridepublic void cry() {System.out.println("匿名内部类--老虎叫");}* }* *///7. JDK底层在创建匿名内部类Outer02$1后,立即马上就创建了Outer02$1实例,并把地址返回给tiger1IA tiger1 = new IA(){@Overridepublic void cry() {System.out.println("匿名内部类--老虎叫");}};();System.out.println("========分割线=========");//演示基于类的匿名内部类Father father = new Father("周"); // 正常实例化facther对象,运行类型为Fatherfather.say();//编译类型为Father,运行类型为匿名内部类/** 底层会创建匿名内部类* class Outer02$2 extends Father{* @Overridepublic void say(){System.out.println("匿名内部类--hello world");}* }* *///参数列表("周")传入构造器Father father1 = new Father("周") { //后接{},匿名内部类写法,运行类型为匿名内部类@Overridepublic void say(){System.out.println("匿名内部类--hello world");}};father1.say();System.out.Class()); //输出father的运行类型->FatherSystem.out.Class()); //输出father1的运行类型->Outer2$2}
}interface IA{public void cry() ;
}class Tiger implements IA{@Overridepublic void cry() {System.out.println("老虎叫.....");}
}class Father{public Father( String name ){System.out.println("接收到了name=" + name);}public void say(){System.out.println("hello world");}
}
public class z3_Detail {public static void main(String[] args) {//调用匿名内部类中的方法的两种方式//第一种new A(){@Overridepublic void say(){System.out.println("方式1--匿名内部类---hello");}}.say();//第二种A a = new A() {@Overridepublic void say(){System.out.println("方式2--匿名内部类---hello");}};a.say();}}class A{public void say(){System.out.println("A--hello");}
}
有一个铃声接口Bell,里面有个ring方法,有一个手机类Cellphone,具有闹钟功能alarmclock,参数是Bell类型,测试手机类的闹钟功能,通过匿名内部类(对象)作为参数,打印:“学习时间到了”,再传入另一个匿名内部类(对象),打印:下班了
public class z4_匿名内部类的应用 {public static void main(String[] args) {Cellphone cellphone = new Cellphone();cellphone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("学习时间到....");}});cellphone.alarmclock(new Bell() {@Overridepublic void ring() {System.out.println("下班饿了.........");}});}
}interface Bell{void ring() ;
}class Cellphone{public void alarmclock(Bell bell){bell.ring();}
}
说明:成员内部类是定义在外部类的成员位置,并且没有static修饰
静态内部类是定义在外部类的成员位置,并且有static修饰
本文发布于:2024-01-29 17:12:51,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170651957316946.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |