类的内部成员之五:内部类

简介: 类的内部成员之五:内部类

类的内部成员之五:内部类

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


1.Java中允许讲一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类

2.内部类的分类:成员内部类(静态、非静态)VS局部内部类(方法内、代码块内、构造器内)

3.成员内部类:

一方面,作为外部类的成员:

调用外部类的结构

可以用static修饰

可以被4种不同的权限修饰

另一方面,作为一个类

类内可以定义属性、方法、构造器等

可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承

可以被abstract修饰

4.关注如下的3个问题

4.1如何实例化成员内部类的对象

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

4.3开发中局部内部类的使用 见 《InnerClassTest1.java》

5.补充

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

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

jdk 8及之后版本:可以省略final的声明
在B站学习java写的代码

代码如下

/*
 * 类的内部成员之五:内部类
 * 1.Java中允许讲一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
 * 
 * 2.内部类的分类:成员内部类(静态、非静态)VS局部内部类(方法内、代码块内、构造器内)
 * 
 * 3.成员内部类:
 *    一方面,作为外部类的成员:
 *      》调用外部类的结构   
 *      》可以用static修饰
 *      》可以被4种不同的权限修饰
 * 
 *    另一方面,作为一个类
 *      》类内可以定义属性、方法、构造器等
 *      》可以被final修饰,表示此类不能被继承。言外之意,不使用final,就可以被继承
 *      》可以被abstract修饰
 * 
 * 4.关注如下的3个问题
 *    4.1如何实例化成员内部类的对象
 *    4.2如何在成员内部类中区分调用外部类的结构
 *    4.3开发中局部内部类的使用 见 《InnerClassTest1.java》
 * 
 * 5.补充
 *  在局部内部类的方法中(比如show)如果调用局部内部类所声明的方法(比              如method)中的局部变量(比如num)的话, 要求此局部变量声明为final的。
 * 
 * jdk 7及之前版本:要求此局部变量显示的声明为final的
 * jdk 8及之后版本:可以省略final的声明
 * 
 *
 */

InnerClassTest类

package com.day0201_1;
public class InnerClassTest {
  public static void main(String[] args) {
    //创建Dog实例(静态的成员内部类):
    Person.Dog dog=new Person.Dog();
    dog.show();
    //创建Bird实例(非静态的成员内部类):
//    Person.Bird bird=new Person.Bird();//错误的
    Person p =new Person();
    Person.Bird bird=p.new Bird();
    bird.sing();
    System.out.println();
    bird.display("黄鹂");
  }
}
class Person{
  String name="小明";
  int age;
  public void eat() {
    System.out.println("人吃饭");
  }
  //静态成员内部类
   static class Dog{
    String name;
    int age;
    public void show() {
      System.out.println("卡拉是条狗");
//      eat();
    }
  }
  //非静态成员内部类
   class Bird{
    String name="杜鹃";
    public Bird() {
    }
    public void sing() {
      System.out.println("我是一只小小鸟");
      eat();//调用外部类的非静态属性Person.this.eat();
      System.out.println(age);
    }
    public void display(String name) {
      System.out.println(name);//方法的形参
      System.out.println(this.name);//内部类的属性
      System.out.println(Person.this.name);//外部类的属性
    }
  }
  public void method() {
    //局部内部类
    class AA{
    }
  }
  {
    //局部内部类
    class BB{
    }
  }
  public Person(){
    int num=10;
    //局部内部类
    class CC{
//      num=20;//Syntax error on token "num", VariableDeclaratorId expected after this token
      public void show() {
        System.out.println(num);
      }
    }
  }
}

InnerClassTest1类

package com.day0201_1;
/*
 * 开发中局部内部类的使用
 * 
 */
public class InnerClassTest1 {
  //开发中很少见
  public void method() {
    //局部内部类
    class AA{
    }
  }
  //返回一个实现了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月前
|
C++
友元是一种允许某些外部函数或类访问另一个类的成员的机制
友元是C++中的一个强大特性,它提供了一种机制来允许特定的外部函数或类访问私有和保护成员。正确使用友元可以增强程序的功能性和灵活性,但应谨慎使用以避免破坏封装性和增加代码的复杂度。在设计类和功能时,合理利用友元,可以使得C++程序更加有效和高效。
34 2
|
5月前
|
存储 编译器 C语言
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
|
Java C++
类的成员之四:代码块
类的成员之四:代码块
55 0
类的内部成员之五:内部类
类的内部成员之五:内部类
32 1
|
12月前
|
Java
【JavaSE专栏65】内部类的使用,定义在其他类内部的类
【JavaSE专栏65】内部类的使用,定义在其他类内部的类
类和对象-封装-成员属性私有化
类和对象-封装-成员属性私有化
45 0
【C++系列P5】‘类与对象‘-三部曲——[对象&特殊成员](3/3)
【C++系列P5】‘类与对象‘-三部曲——[对象&特殊成员](3/3)
18-类和对象-封装-成员属性私有化
18-类和对象-封装-成员属性私有化
|
Java 编译器 C++
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(下)
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(下)
175 0
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(下)
|
编译器 C++
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(上)
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(上)
150 0
【C++】类和对象(下)—— 再谈构造函数 | static成员 | C++11补丁 |友元(上)