@TOC内部类
什么是内部类?
内部类很通俗的来说就是一个类里面的另外一个类。
关于内部类主要分为两种:
一、外部类的方法体外的类;
二、外部类的方法体内的类;
Inner Class(内部类)
第一种:外部类的方法体外的类:
1、这种内部类的访问类型可以是public,protecte,默认的,private等四种类型,这些访问类型确定这个内部类是否对其他类的可见性。
2、这种内部类是可以访问外部类中的成员变量,不管是静态还是非静态。
3、关于这个内部类的引用:必须先创建一个外部类的实例化对象,再通过外部类的实例化对象去创建一个内部类的实例化对象。
Test1 test1 = new Test1();
Test1.Test2 test2= test1.new Test2();
第二种:外部类的方法体内的内部类:
1、这种内部类前面是不能加访问类型修饰符的,但是可以在前面加final,abstract修饰符。这种内部类一般对于其他类来说是不可见,其他类无法访问。但是这种内部类创建的实例化对象是可以给其他访问。
2、关于这种内部类同样可以访问外部类中的成员变量,不管是静态还是非静态。
3、同样这种内部类也还可以访问方法中的局部变量,但是该局部变量前必须用final修饰。
public class Test1 {
private static String name ;
private int age ;
public int getAge() {
return age;
}
public void setAge(int info) {
final String msg = null;
class Test1_3{
public void main(String[] args) {
System.out.println(name);//访问外部类的静态变量
System.out.println(age);//访问外部类的非静态变量
System.out.println(msg);//访问局部变量
}
}
}
class Test1_2{
public void main(String[] args) {
System.out.println(name);//访问外部类的静态变量
System.out.println(age);//访问外部类的非静态变量
}
}
}
Static Nested Class(静态内部类)
对于静态内部类来说其实就是它字面上的意思,就是普通的内部类前面加上static修饰
但是对于方法体内的静态内部类有一点点小小的区别。
第一种:在外部类方法体外里的内部类前加上static
1、这种静态内部类在狭义上来说已经不属于内部类,并且不再具备内部类的特性。
2、同样这种静态内部类和普通的类在运行和功能上没有什么差异,只是在编程的语法上有点不一样,这种静态内部类可以被public,protected,默认的,private等修饰符修饰。
3、在其他类引用这种静态内部类时,没有必要在去先实例化外部类,直接可以用(外部类名.静态内部类)。在外部类中使用该静态内部类时,可以直接用该静态类的名字,无需创建实例化对象。
4、这种静态内部类是可以访问外部类中的静态成员变量,但是在该静态内部类中创建了外部类的实例化对象的前提下,也是可以访问外部类的非静态成员变量。
//通过实例化外部类访问外部类的非静态变量
Test1 test1 = new Test1();
System.out.println(test1.age);
第二种:在外部类静态方法中的内部类
1、当在外部类的静态方法中加入静态内部类时,该内部类前面是不用用static修饰了的
2、这种静态内部类和普通方法中的内部类的应用方式很相似,可以直接访问外部类的静态方法,同时也可以访问静态方法中的局部变量,但是该局部变量必须被final修饰。
3、但是在该静态内部类中创建了外部类的实例化对象的前提下,同样也是可以访问外部类的非静态成员变量。
public static void setAge(int info) {
final String msg = null;
class Test1_3{
public void main(String[] args) {
Test1 test1 = new Test1();
System.out.println(name);//访问外部类的静态变量
System.out.println(test1.age);//通过实例化外部类访问外部类的非静态变量
System.out.println(msg);//访问局部变量
}
}
}