内部类

大部分时候,类被定义在一个独立的class中。在某些情况下,也会把一个类放在另一个类中的内部定义,这个定义在其他类内部的类被称为内部类。包含内部类的类也被称为外部类。

1、内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。

2、内部类成员可以直接访问外部类私有数据,但外部类不能访问内部类的实现细节。

3、匿名内部类仅适用于需要使用一次的类。

4、内部类比外部类可以多3个修饰符:private、protected、static

5、非静态内部类不能拥有静态成员

非静态内部类:

定义格式

public class OuterClass{
         class innerClassA{}
         public class innerClassB{}
	}


从上面代码可以看出,内部类在外部类成员位置,所以说内部类也可以访问外部类的成员。

//TODO 内部类定义并在外部类使用,静态方法不能new内部类

class OuterClass{
    class InnerClass
    {
    }
    public static void main(String[] args){
        InnerClass innerClass = new InnerClass();
    }
}
 


静态内部类

使用static修饰的一个内部类,则这个内部类属于所在外部类本身,而不属于外部类创建出来的某个对象,因此使用static修饰的内部类被称为类内部类,有的地方也称为静态内部类。

静态内部类可以包含静态成员,也可以包含非静态成员。根据静态成员访问规则,静态内部类的方法或代码块不能访问外部类的实例成员,只能访问外部类的静态成员。


//TODO
class OuterClass{
 
    static String school;
    static class InnerClass
    {
        static{
            school= "abcd";
        }
        String name;
        String age;
        static String address;
    }
    public static void main(String[] args){
        InnerClass innerClass = new InnerClass();
    }
}


具有内部类的类被编译后,编译文件格式如下:


使用内部类

定义格式:

         外部类.内部类变量名= new外部类().new 内部类();

        

class OuterClass{
    class InnerClass
    {
        String name;
        public void printName(){
            System.out.println(name);
        }
    }
 
}
class TestInnerClass
{
    public static void main(String[] args){
        OuterClass.InnerClassinnerClass = new OuterClass().new InnerClass();
        innerClass.name= "abcd";
        innerClass.printName();
    }
}


使用静态内部类

         外部类.内部类 变量名=new 外部类.内部类();

 

class OuterClass{
    static class InnerClass
    {
        String name;
        public void printName(){
            System.out.println(name);
        }
    }
 
}
class TestInnerClass
{
    public staticvoid main(String[] args){
        OuterClass.InnerClassinnerClass =  newOuterClass.InnerClass();
        innerClass.name= "abcd";
        innerClass.printName();
    }
}


局部内部类

 

class OuterClass{
    public void method(){
        class InnerClass
        {
            Stringname = "abcd";
        }
        InnerClass in = new InnerClass();
        System.out.println(in.name);
    }
 
}
class TestInnerClass
{
    public static void main(String[] args){
        OuterClass out = new OuterClass();
        out.method();
    }
}


匿名内部类

匿名内部类没有类名,适用于:仅使用一次的时候。New 该类的父类或接口代表该匿名内部类。

class OuterClass{
    public void method(){
        new InnerClass(){
            public void method(){
                System.out.println("这是一个匿名内部类");
            }
        }.method();
    }
 
}
class InnerClass
{
    void method(){};
}
 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值