简介
内部类:
java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B为外部类
内部类分类:成员内部类(静态,非静态) VS 局部内部类(方法内,代码块内,构造器内)
调用非静态外部结构:Person.this.eat();
1 成员内部类:
一方面:作为外部类的成员
》调用外部类的结构
》可被static修饰
》可以被4种不同的权限修饰
另一方面:作为一个类
》类内部可以定义属性,方法,构造器等
》可以被final修饰,表示此类不能被继承,言外之意不使用final、修饰可以被继承
》可以被abstract修饰
2 局部内部类:不能写任何权限修饰符
- 因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有的局部成员都不能使用访问控制修饰符修饰。
- 局部内部类访问包含他的方法中的变量必须有final修饰; java8如果局部内部类中使用到变量默认final可以省略不写
- 如果局部内部类访问外部类的变量不用定义为final的,只有在访问包含他的方法中的变量需要定义为final
关注一下三问题
1 如何实例化成员内部类
//静态成员内部类创建
Outer.InnerStatic innerStatic = new Outer.InnerStatic();
innerStatic.show();
//非静态成员内部类创建
Outer.Inner inner = new Outer().new Inner();
inner.sing();
2 如何在成员内部类中区分调用外部类结构
System.out.println(name); 形参
System.out.println(this.name);内部类的属性
System.out.println(Outer.this.name);外部类的属性
3 开发当中,局部内部类的使用
//局部内部类
public Comparable getComparable() {
//方式一,显示实现类
// 方式二 匿名内部类//创建一个实现Comparable接口的局部内部类
class MyComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
} return new MyComparable();
}
一、静态内部类的创建需要依赖外部类
Out.Ind j=new Out.Ind();
//静态成员内部类创建
Outer.InnerStatic innerStatic = new Outer.InnerStatic();
innerStatic.show();
二、非静态内部类
Outside in=new Outside();
//在通过外部类对象创建一个内部类对象
Outside.Indoor oi = in.new Indoor();
Outer.Inner inner = new Outer().new Inner();
inner.sing();
System.out.println();
inner.display("AA");
三、如何在成员内部类中区分调用外部类结构
Outer.this.eat(); //调用外部方法 System.out.println(name); 形参 System.out.println(this.name);内部类的属性 System.out.println(Outer.this.name);外部类的属性
四、开发当中,局部内部类的使用
//局部内部类
public Comparable getComparable() {
//创建一个实现Comparable接口的局部内部类
//方式一,显示实现类
// 方式二 匿名内部类
class MyComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
五、 内部类的示例
public class Outer {
String name = "小明" ;
int age;
String salary = "200";
public void eat() {
System.out.println("吃饭");
}
public static void main(String[] args) {
//静态成员内部类创建
Outer.InnerStatic innerStatic = new Outer.InnerStatic();
innerStatic.show();
System.out.println();
//非静态成员内部类创建
Outer.Inner inner = new Outer().new Inner();
inner.sing();
System.out.println();
inner.display("AA");
}
static class InnerStatic {
String name ;
int age;
public void show() {
System.out.println("卡巴是条狗");
}
}
class Inner {
String name="杜鹃";
int age;
public void sing() {
System.out.println("我是一只小小鸟");
Outer.this.eat(); //调用外部方法
}
public void display(String name) {
System.out.println(name);
System.out.println(this.name);
System.out.println(Outer.this.name);
salary = "aaa";
System.out.println(salary);
}
}
//局部内部类
public Comparable getComparable() {
//创建一个实现Comparable接口的局部内部类
//方式一,显示实现类
// 方式二 匿名内部类
class MyComparable implements Comparable {
@Override
public int compareTo(Object o) {
return 0;
}
}
return new MyComparable();
}
public void hello () {
String name = "小鸟" ;
class Bird {
public void say () {
salary ="bbb";
// name = "ccc"; 方法中name 被默认是定义为final 这里编译会报错
System.out.println(salary);// 成员变量没有必要定义为final
System.out.println(name);
}
}
}
}
六、总结
不管是静态内部类还是非静态内部类都需要先new 外部的类。然后用外部的去直接点静态内部类或者 点new 非静态内部类