概念:在一个类内部定义一个完整的类
特点:每一个类都会生成一个单独的 .class 文件
语法:
class 外部类类名{class 内部类类名{}}
案例:
packagecn.baizhi.day13;publicclassDemo{}//定义外部类classOuter{//定义内部类classInner{}}
内部类的分类
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类
位置:外部类的成员位置 和成员方法成员变量并列
特点:可以访问外部类的私有成员而不破坏封装
案例:
packagecn.baizhi.day13;publicclassDemo{}//定义外部类classOuter{privateint a =10;//实例变量//定义内部类//成员内部类classInner{//内部类的方法publicvoidm1(){System.out.println(a);}}}
创建内部类的对象
第一步:创建外部类的对象
第二步:通过外部类的对象创建内部类的对象
案例:
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){//1 创建外部类的对象Outer outer =newOuter();//2.通过外部类的对象创建内部类的对象Outer.Inner inner = outer.newInner();
inner.m1();}}//定义外部类classOuter{privateint a =10;//实例变量staticint b =20;//静态变量 类变量//定义内部类//成员内部类classInner{//int a = 250;int c =30;//内部类的方法publicvoidm1(){System.out.println(a);//10System.out.println(b);//20System.out.println(c);//30}}}
当内部类存在和外部类成员变量重名问题 通过 外部类.this 访问外部类的属性
this. 代表的是本类的引用
外部类.this. 代表的是外部类的引用
案例:
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){//1 创建外部类的对象Outer outer =newOuter();//2.通过外部类的对象创建内部类的对象Outer.Inner inner = outer.newInner();
inner.m1();}}//定义外部类classOuter{privateint a =10;//实例变量staticint b =20;//静态变量 类变量//定义内部类//成员内部类classInner{int a =250;//内部类的成员变量int c =30;//内部类的方法publicvoidm1(){int a =360;//内部类局部变量System.out.println(a);//360System.out.println(this.a);//250System.out.println(Outer.this.a);//10System.out.println(b);//20System.out.println(c);//30}}}
注意:不能在成员内部类中创建静态成员
案例
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){//1 创建外部类的对象Outer outer =newOuter();//2.通过外部类的对象创建内部类的对象Outer.Inner inner = outer.newInner();
inner.m1();}}//定义外部类classOuter{privateint a =10;//实例变量staticint b =20;//静态变量 类变量//定义内部类//成员内部类classInner{int a =250;//内部类的成员变量int c =30;//static int d = 30;//不可以创建内部类的静态成员//内部类的方法publicvoidm1(){int a =360;//内部类局部变量System.out.println(a);//360System.out.println(this.a);//250System.out.println(Outer.this.a);//10System.out.println(b);//20System.out.println(c);//30}}}
静态内部类
位置:在外部类中 和静态的成员并列
语法:
staticclass 类名{
}
案例:静态内部类中不能访问外部类非静态的成员
//定义外部类classOuter{int a =10;//实例变量staticint b =20;//静态变量//静态内部类staticclassInner{publicvoidm1(){//System.out.println(a);//静态内部类中不能访问外部类非静态的成员System.out.println(b);}}}==================================================================
创建静态内部类的对象
访问静态内部类中的静态成员可以通过 外部类类名.内部类类名.静态成员
语法:外部类类名.内部类类名 对象名 =new 外部类.内部类();
案例:
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){//创建静态内部类的对象/*Outer.Inner inner = new Outer.Inner();
inner.m1();*/System.out.println(Outer.Inner.d);}}//定义外部类classOuter{int a =10;//实例变量staticint b =20;//静态变量//静态内部类staticclassInner{//int a = 20;int c =30;staticint b =250;staticint d =40;publicvoidm1(){//System.out.println(a);//静态内部类中不能访问外部类非静态的成员System.out.println(Outer.b);System.out.println(c);System.out.println(d);}}}
局部内部类
位置: 在外部类的方法中定义局部内部类
语法:
//定义外部类classOuter{publicvoidm1(){//定义局部内部类classInner{}}}
特点:在局部内部类中可以访问外部类中的成员
案例:
//定义外部类classOuter{int a =10;staticint b =20;publicvoidm1(){//定义局部内部类classInner{publicvoidm2(){System.out.println(a);System.out.println(b);}}}}
创建局部内部类的对象
注意:局部内部类的对象只能在它所在的方法中创建
案例:
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){Outer outer =newOuter();
outer.m1();}}//定义外部类classOuter{int a =10;staticint b =20;publicvoidm1(){//定义局部内部类classInner{publicvoidm2(){System.out.println(a);System.out.println(b);}}//创建局部内部类的对象Inner inner =newInner();
inner.m2();}}
注意:局部内部类访问外部类的局部变量 要求这个局部变量必须是final修饰的 在jdk7中必须加final jdk8可以不加但是默认是final
案例:
packagecn.baizhi.day13;publicclassDemo{publicstaticvoidmain(String[] args){Outer outer =newOuter();
outer.m1();}}//定义外部类classOuter{int a =10;staticint b =20;publicvoidm1(){finalint c =30;//定义局部内部类classInner{publicvoidm2(){System.out.println(a);System.out.println(b);System.out.println(c);}}//创建局部内部类的对象Inner inner =newInner();
inner.m2();}}
案例:
学生可以通过学校选择老师 如果输入偶数 返回一个老师 刘洋 如果奇数 返回高健
代码:
packagecn.baizhi.day13;importjava.util.Scanner;publicclassStudent{publicstaticvoidmain(String[] args){Scanner scanner =newScanner(System.in);System.out.println("请输入一个整数选择老师:");int a = scanner.nextInt();Teacher teacher =School.getTeacher(a);
teacher.teach();}}//定义一个教学的接口interfaceTeacher{publicvoidteach();}//定义一个刘洋类classLiuYangimplementsTeacher{@Overridepublicvoidteach(){System.out.println("刘洋教Java");}}//定义一个高健类classGaoJianimplementsTeacher{@Overridepublicvoidteach(){System.out.println("高健教 抽烟 喝酒 烫头");}}//定义一个学校类classSchool{publicstaticTeachergetTeacher(int a){if(a%2==0){returnnewLiuYang();}else{returnnewGaoJian();}}}
案例的问题 学生可以不通过学校获得老师
改进后: 学生必须通过学校才能得到老师 实现了 强制弱耦合
案例:
packagecn.baizhi.day13;importjava.util.Scanner;publicclassStudent{publicstaticvoidmain(String[] args){Scanner scanner =newScanner(System.in);System.out.println("请输入一个整数选择老师:");int a = scanner.nextInt();Teacher teacher =School.getTeacher(a);
teacher.teach();/*LiuYang liuYang = new LiuYang();
liuYang.teach();*/}}//定义一个教学的接口interfaceTeacher{publicvoidteach();}//定义一个学校类classSchool{publicstaticTeachergetTeacher(int a){//定义一个刘洋类classLiuYangimplementsTeacher{@Overridepublicvoidteach(){System.out.println("刘洋教Java");}}//定义一个高健类classGaoJianimplementsTeacher{@Overridepublicvoidteach(){System.out.println("高健教 抽烟 喝酒 烫头");}}if(a%2==0){returnnewTeacher();}else{returnnewGaoJian();}}}