目录
一 内部类
什么是内部类
外部类里面的类被称为内部类,为外部类的一部分
分类
class OutClass{
//被static修饰 -》静态内部类
static class InnerClass1{
}
}
//未被static修饰 -》实例内部类
public class InnerClass2{
}
//被static修饰 -》静态内部类
public void method(){
//方法中定义的内部类 -》局部内部类:几乎不用
class InnerClass3{
}
}
}
实例内部类:未被static修饰
静态内部类:被static修饰
局部内部类:在方法中定义的内部类,几步用不上
二 内部类属性
静态内部类
class OutClass{
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public void fun1(){
System.out.println("外部内中的方法");
}
//被static修饰 -》静态内部类
static class InnerClass1{
public int data1 = 1;
private int data2 = 2;
public static int data3 = 3;
public void fun(){
System.out.println("静态内部类中的方法");
}
}
}
public class Main {
public static void main(String[] args){
OutClass.InnerClass1 innerclass1 = new OutClass.InnerClass1();
System.out.println(innerclass1.data1);
System.out.println(OutClass.InnerClass1.data3);
}
}
静态内部类实例化
对于静态内部类,我们可以通过Outclass.InnerClass innerclass来进行实例化,然后通过innerclass来访问成员和方法
或者可以直接通过Outclass.InnerClass直接来访问里面静态成员和方法
静态内部类访问外部类
静态内部类无法直接访问外部类非静态成员,需通过外部类的引用
外部类访问静态内部类
外部类也无法直接访问内部类的非静态成员,需要通过内部类引用
注意:
创建静态内部类对象时,不需要先创建外部内对象
非静态内部类(实例内部类)
class OutClass{
public int data4 = 4;
private int data5 = 5;
public static int data6 = 6;
public void fun1(){
System.out.println("外部内中的方法");
}
//未被static修饰 -》实例内部类
public class InnerClass2{
public int data1 = 1;
private int data2 = 2;
public static final int data3 = 3;
public void fun(){
System.out.println("实例内部类中的方法");
}
}
}
无法定义静态变量,可以加上final将其变成常量就可以进行定义
public static final int data3 = 3;
实例内部类的实例化
需要先将外部类实例化然后再实例化内部类
public class Main {
public static void main(String[] args){
OutClass outclass = new OutClass();
OutClass.InnerClass2 innerClass2 = outclass.new InnerClass2();
System.out.println(innerClass2.data1);
System.out.println(OutClass.InnerClass2.data3);
}
}
可以通过实例化的对象访问非静态成员
也可以直接访问static final的成员
实例内部类访问外部类成员
非静态内方法可以随意访问外部成员,但如果有相同成员名的话,想要调用外部成员的用 外部类.this
外部类访问实例内部类成员
访问方式和静态内部类一样
注意:
1.外部类中的任何成员都可以在实例内部类中直接访问
2.实例内部类所处的位置于外部类成员位置相同,因此也受public,private等访问限定符的约束
3.在实例在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名.this.同名成员 来访问
4.实例内部类对象必须在先有外部类对象前提下才能创建
5.实例内部类的非静态方法包含了一个指向外部类对象的引用
6.外部类中,不能直接访问实例内部类中的成员,要访问必须要创建内部类的对象