概念:在一个类的内部再定义一个完整的类
特点:编译之后可别分生成独立的字节码文件
内部类可直接访问外部类的私有成员,而不破坏封装
内部类:成员内部类、静态内部类、局部内部类、匿名内部类
成员内部类:创建对象 先创建外部类对象 再通过外部类对象.new.内部类类名() 创建内部类对象
外部类类名.this 引用外部类的当前对象
public class TsetInner {
public static void main(String[] args) {
Outer o1= new Outer(11);
Outer.MemberInner in1= o1.new MemberInner();
in1.method();
Outer o2= new Outer(22);
//Outer.MemberInner in2= o2.new MemberInner();
//in2.method();
}
}
class Outer{
private int a;
public Outer(int a) {
this.a=a;
}
public void m() {
//局部变量
int x= 20;
//局部内部类
class localInner{
}
}
//成员内部类
class MemberInner{
private int a = 33;
public void method() {
int a= 44;
System.out.println(a);//44
System.out.println(this.a);//33
System.out.println(Outer.this.a);//11
}
}
//静态内部类
static class StaticInner{
}
}
静态内部类:只能访问外部类的静态成员
局部内部类:作用范围 从定义开始 到代码块结束
局部内部类不能定义静态成员
局部内部类可以访问外部类的私有成员 还能访问外部类的局部变量 但是要加final
public class TestTeacher {
public static void main(String[] args) {
Students stu = new Students();
stu.study();
}
}
class School{
//静态的教师教课A和B
public static Teacher getTeacher(int n) {
class TeacherA implements Teacher{
public void teach() {
System.out.println("A");
}
}
class TeacherB implements Teacher{
public void teach() {
System.out.println("B");
}
}
//判断学习安排的老师进行讲课 学生访问不到 只有数值0或1
if(n%2==0)return new TeacherA();
else return new TeacherB();
}
}
class Students{
//学习方法 不能自己在去决定哪个老师来上课
public void study() {
Teacher t=School.getTeacher(0);
t.teach();
}
}
//接口 为了让教师方法都可以去随意调用访问
interface Teacher{
void teach();
}