java-内部类

什么是内部类

内部类(inner class)是定义在一个类中的类。所以为什么需要内部类呢?

主要是由两个原因:

  1. 内部类可以对同一个包中的其他类隐藏。
  2. 内部类方法可以访问定义这些方法的作用域中的数据,包括原本私有的数据。

所以内部类可以理解为一个类的内部又完整的嵌套了另一个类结构,被嵌套的类称为内部类(inner class),嵌套其他类的类称为外部类(outer class)。

类的"五"大成员是哪些?---->[属性、方法、构造器、代码块、“内部类”]

内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类

其中区别为----->如果定义类在局部位置(方法中/代码块) :(1) 局部内部类 (2) 匿名内部类
-------->定义在成员位置 (1) 成员内部类 (2)静态内部类

成员内部类

成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员);

**外部类访问非静态成员内部类的成员,必须要创建成员内部类对象;**外部类可以通过类名直接访问静态内部类的静态成员,包括私有的。

成员内部类和外部类不存在继承关系

成员内部类是依附外部类而存在的,也就是说,如果要创建成员内部类的对象,前提是必须存在一个外部类的对象。所以在外部类访问内部类的时候必须先实例化外部类对象

外部类名.内部类名 对象名 = new 外部类().new 内部类()

实例

public class Test {
    String words = "Helloworld!";
    public class inner{
        String str = "我来了";
        public void show(){
            System.out.println(words+str);
        }

    }

    public static void main(String[] args){
        Test.inner t = new Test().new inner();
        t.show();
    }
}



在这里插入图片描述

局部内部类

声明局部类时不能有访问说明符(即 public 或 private )。局部类的作用域总是限定在声明这个局部类是块中。

局部类具有一个很大的优势 ,即对外部世界完全隐藏。就算是继承某父类(或实现某接口),若局部内部类中没调用的方法,父类或父接口都无法访问它。

相比于其他内部类,局部类还有一个优点,它们不仅能够直接访问方法外部类中属性和方法(包含私有的),还可以访问局部变量(不过,这些局部变量必须是事实最终变量 effectively final)

实例:

public class Test {
       String words = "Helloworld!";
       private int A = 123;
       final String mark = "我来了";
       public void Way(){
       class inner{
           String a = words;
           int b = A;
           String c = mark;
       }
       inner w = new inner();
           System.out.println(w.a+w.b+w.c);
       }
        public static void main(String[] args){
                Test t= new Test();
                t.Way();
        }
}

在这里插入图片描述

匿名内部类

使用局部类时,通常可以再进一步,如只想创建一个对象,甚至不需要为类指定名字。这样的一个类通常被称为匿名内部类(anonymous inner class).

匿名内部类不能定义任何静态成员、方法和类,只能创建匿名内部类的一个实例。一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。

匿名内部类可以直接访问外部类的所有成员,包含私有的,但不能添加访问修饰符,因为它的地位就是一个局部变量,它作用域:仅仅在定义它的方法或代码块中。

实例

public interface Words {

    public void fun();


}

public class Test {
    public static void main(String [] args){
        Words w = new Words(){
            @Override
            public void fun(){
            System.out.println("Helloworld!");
    }
};
        w.fun();
}}

在这里插入图片描述

静态内部类

为把一个类隐藏在另一个类的内部,并不需要内部类有外部类对象的引用。为此,可以将内部类声明为static,这样就不会生成那个引用了。

只要内部类不需要访问外部类对象,就应该使用静态内部类。有些程序员会用镶嵌类(nested class)表示静态内部类

与常规内部类不同,静态内部类可以有静态方法和属性,可以直接访问外部类的所有静态成员,包含私有的,但不能直接访问非静态成员

在接口中声明的内部类自动是static 和 public

实例


public class Test {
    static String words = "Helloworld!";
    int num = 100;
    static class inner{
        String a = "我来了";
        public void show() {
            System.out.println(Test.words + a);
        }
    }
    public static void main(String[] args){
        inner i = new inner();
        i.show();
    }


}


在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值