类的结构:内部类

1. 内部类( Inner class )定义

    (1)当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。

    (2)在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。

    (3)内部类一般用在定义它的类或语句块之内,在外部引用它时必须给出完整的名称。 Inner class 的名字不能与包含它的外部类类名相同;

───────────────────────────────────────────────────────────

2. 内部类分类

    (1)成员内部类(static 成员内部类和非 static 成员内部类)

    (2)局部内部类(方法体内、代码块、构造器)、匿名内部类

────────────────────────────────────────────────────────────

3. 成员内部类作为类的成员的角色

    (1)和外部类不同,内部类除了可以被 public 和 default 修饰外,还可以声明为 private 或 protected;

    (2)可以调用外部类的结构

    (3)内部类可以声明为 static 的,但此时就不能再使用外层类的非 static 的成员变量;

────────────────────────────────────────────────────────────

4. 成员内部类作为类的角色

    (1)在内部类中可以定义属性、方法、构造器等结构。

    (2)内部类可以被 abstract 修饰 ,因此可以被其它的内部类继承。

    (3)内部类可以被 final 修饰,表示此类不能被继承

    (4)编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)

────────────────────────────────────────────────────────────

5. 注意

    (1)非 static 的成员内部类中的成员不能声明为 static 的,只有在外部类或 static 的成员内部类中才可声明 static 成员。

    (2)外部类访问成员内部类的成员,需要“内部类.成员”或“内部类对象.成员”的方式

    (3)成员内部类可以直接使用外部类的所有成员,包括私有的数据

    (4)当想要在外部类的静态成员部分使用内部类时,可以考虑内部类声明为静态的

────────────────────────────────────────────────────────────

6. 关注如下的3个问题

    (1)如何实例化成员内部类的对象

静态成员内部类

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

非静态成员内部类

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

    (2)如何在成员内部类中区分调用外部类的结构

class Person{

String name = "小明";

public void eat(){

}

//非静态成员内部类

class Bird{

String name = "杜鹃";

public void display(String name){

System.out.println(name);//方法的形参

System.out.println(this.name);//内部类的属性

System.out.println(Person.this.name);//外部类的属性

Person.this.eat();//外部类的方法

}

}

}

    (3)开发中局部内部类的使用:通过内部类实现某个接口返回一个对象

//返回一个实现了Comparable接口的类的对象

public Comparable getComparable(){

//创建一个实现了Comparable接口的类:局部内部类

//方式一:

        class MyComparable implements Comparable{

                @Override

                public int compareTo(Object o) {

                        return 0;

                }        

        }

             return new MyComparable();

//方式二:

     return new Comparable(){

    @Override

    public int compareTo(Object o) {

   return 0;

   }

    };

}

    (4)注意点:

在局部内部类的方法中( 比如:show 如果调用局部内部类所声明的方法 ( 比如:method ) 中的局部变 量( 比如:num ) 的话,要求此局部变量声明为 final 的。

JDK 7 及之前版本:要求此局部变量显式的声明为 final 的

JDK 8 及之后的版本:可以省略 final 的声明

────────────────────────────────────────────────────────────

6. 总结

    (1)成员内部类和局部内部类,在编译以后,都会生成字节码文件。

成员内部类

外部类$内部类名.class

局部内部类

外部类$数字 内部类名.class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kotlin中的嵌套(Nested Classes)和内部类(Inner Classes)是非常相似的概念,但有一些细微的区别。以下是对它们的一些基本介绍: 1. **嵌套(Nested Classes)**:在Kotlin中,嵌套是一种,它包含在另一个的内部。它可以是静态的(static)、非静态的(inner)或者局部的(local)。嵌套可以从任何访问它的外部访问字段、方法、构造器和嵌套。这允许一个的数据可以在嵌套中被更细粒度地访问和控制。 ```kotlin class OuterClass { class NestedClass { // code inside } } ``` 2. **内部类(Inner Classes)**:内部类是定义在另一个内部的。它可以直接访问外部的所有成员,包括字段、方法、构造器和嵌套内部类可以包含自己的构造函数,并且可以访问外部的私有成员。内部类可以嵌套在其他内部类中,形成一个复杂的层次结构。 ```kotlin class OuterClass { inner class InnerClass { // code inside } } ``` 总的来说,内部类在实现接口、继承某个或封装内部数据结构时特别有用。另一方面,嵌套提供了一种更灵活的方式来访问外部的数据和方法,即使外部在不同的包或模块中。 需要注意的是,尽管Kotlin中的嵌套内部类非常相似,但在某些情况下,使用嵌套的语法可能更清晰和直观。例如,使用嵌套可以更清楚地表示一个的嵌套结构,而内部类则更适合实现接口或封装内部数据结构

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值