Java面向对象之内部类

1 - 什么是内部类?外部类?

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

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

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

4. 分类:

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

  局部内部类(不谈修饰符)、匿名内部类
*/

2 - 内部类的定义与使用

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

1. 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者 称为外部类

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

3. 成员内部类:

 

  作为外部类的成员:

    >调用外部类的结构

    >可以被static修饰

    >可以被4种不同权限修饰符修饰

  作为一个类:

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

    >可以被final修饰,表示此类不可以被继承。不是final修饰,就可以被继承

    >可以被abstract修饰

4. 关注如下的3个问题

  ①如何实例化成员内部类的对象 (见代码内)

  ②如何在成员内部类中区分调用外部类的结构 (见代码内)

  ③开发中局部内部类的使用
*/

public class InnerClass {
    public static void main(String[] args) {
        
        // 创建静态Mouth内部类的对象
        Person.Mouth mouth = new Person.Mouth();
        mouth.function(); // 功能:吃饭、说话、呼吸、接吻
        
        // 创建Foots实例(非静态成员内部类)
        Person p = new Person();
        Person.Foots foot = p.new Foots();
        foot.function(); // 脚的作用是走路
        
        System.out.println();
        
        foot.display("测试");
        
    }
}

class Person{
    
    String name = "李白";
    int age;
    public void eat() {
        System.out.println("人:吃饭");
    }
    
    // 静态成员内部类
    static class Mouth{
        String name = "嘴";
        
        public void function() {
            System.out.println("功能:吃饭、说话、呼吸、接吻");
    
        }
    }
    
    // 非静态内部类
    final class Foots{
        String name = "脚";
        int footsNum;
        
        public Foots() {
            
        }
        
        public void function() {
            System.out.println("脚的作用是走路");
            // eat();
            Person.this.eat(); // 调用外部类的非静态属性
        }
        
        public void display(String name) {
            System.out.println(name); // 方法的形参
            System.out.println(this.name); // 内部类的属性
            System.out.println(Person.this.name); // 外部类的属性
        }
    }
    
    // 构造器内
    public Person() {
        
        class AA{
            
        }
    }
    // 方法内
    public void method() {
        
        class BB{
            
        }
    }
    
    // 代码块内
    {
        class CC{
            
        }
    }
}
InnerClass.java

3 - 开发中 局部内部类 的使用

package com.lzh.innerclss;

public class InnerClassTest {
    // 开发中很少见
    public void method() {
        // 局部内部类
        class BB{
            
        }
    }
    // 返回一个实现了Comparable接口的类的对象
    public Comparable getComparable() {
        
        // 创建一个实现了Comparable接口类:局部内部类
        // 方式1
//        class MyComparable implements Comparable{
//
//            @Override
//            public int compareTo(Object o) {
//                // TODO Auto-generated method stub
//                return 0;
//            }    
//        }
//        return new MyComparable();
        
        // 方式2
        return new Comparable() {

            @Override
            public int compareTo(Object o) {
                // TODO Auto-generated method stub
                return 0;
            }
        };
    }
}
innerClassTest.java

4 - 局部内部类的特点

1 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但 是前面冠以外部类的类名和$符号,以及数字编号。

2 只能在声明它的方法或代码块中使用,而且是先声明后使用。除此之外的任何地方 都不能使用该类。

3 局部内部类可以使用外部类的成员,包括私有的。

4 局部内部类可以使用外部方法的局部变量,但是必须是final的。由局部内部类和局 部变量的声明周期不同所致。

5 局部内部类和局部变量地位类似,不能使用public,protected,缺省,private

6 局部内部类不能使用static修饰,因此也不能包含静态成员

5 - 匿名内部类

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

2 格式:

  new 父类构造器(实参列表)| 实现接口(){

    // 匿名内部类的类体部分

  }

3 匿名内部类的特点

  ① 匿名内部类必须继承父类或实现接口

  ② 匿名内部类只能有一个对象

  ③ 匿名内部类对象只能使用多态形式引用 

 

posted @ 2020-06-06 09:25  赖正华  阅读(85)  评论(0编辑  收藏  举报