java基础——java的四种内部类
1.成员内部类
1.1 拥有类的所有访问权限
成员内部类可以无条件访问外部类所有的成员属性和成员方法(包括private成员和静态成员)
1.2 访问同名成员要用this
说过要访问外部类的同名成员,要用以下新式访问
- 外部类.this.成员变量
- 外部类.this.成员方法
1.3 外部类访问要先创建对象
在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
1.4 创建成员内部类要有外部类对象
Outter outter = new Outter();
Outter inner inner = outter.new inner()
1.5 内部类可以有所有访问权限
内部类可以拥有private,protected,public,包权限
1.6 总体实践代码
public class Test {
public String a = "aa";
private String b;
public class PublicClass{
public PublicClass() {
}
public String a = "bb";
public void test(){
System.out.println(this.a);
System.out.println(Test.this.a);
}
}
private class privateClass{
}
protected class protectedClass{
}
public static void main(String[] args) {
Test test = new Test();
Test.PublicClass aa = test.new PublicClass();
aa.test();
}
}
2.局部内部类
局部内部类就像是方法里面的一个局部变量,不能有public,protected,private以及static修饰符
//测试局部内部类
public void test() {
// 编译报错
// public class jubuClass{
//
// }
class jubuClass {
public void test() {
System.out.println(Test.this.a);
}
}
}
3.匿名内部类
- 匿名内部类不能有修饰符和static修饰符
- 匿名内部类没有构造器
- 匿名内部类不能定义任何静态成员、方法
- 匿名内部类必须实现接口或抽象父类的所有抽象方法
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
//测试匿名类
HelloWorld helloWorld = new HelloWorld() {
@Override
public void greet() {
}
@Override
public void greetSomeone(String someone) {
}
};
4.静态内部类
- 静态内部类不需要依赖外部类
- 不能使用外部类非静态的成员变量和方法
public String a = "aa";
public static String c = "cc";
private String b;
static class staticTest{
public void test(){
c = "aaa";
//编译不通过
a = "ccc";
}
}