什么是内部类,Static Nested Class(静态内部类)和 Inner Class(内部类)的区别?

@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);//访问局部变量
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值