内部类

内部类:如果一个事物,内部包含另外一个事物,那么这就是一个类 内部包含另一个类

例如:身体和心脏的关系,汽车和发动机的关系

 

分类:

1.成员内部类:

2.局部内部类(包含匿名内部类)

 

1.成员内部类:定义在外部类中的

格式:

修饰符 class 外部类名称{

  修饰符 class 内部类名称{}

}

注意:内用外,随意访问;外用内,需要内部对象

使用方法:

 间接方法:在外部类方法中,使用内部类;然后 main 只是调用外部类方法

 直接方法:公式:       外部类名称 . 内部类名称 对象名 = new 外部类名称 () . new 内部类名称()

public class Body {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void method() {
        System.out.println("外部类方法");
        new Heart().beat();

    }

    private String name;

    public class Heart {

        public void beat() {
            System.out.println("蹦蹦蹦!");
            System.out.println("我叫 " + name);
        }
    }
}
public class demo1 {
    public static void main(String[] args) {
        Body body = new Body();
        body.setName("心脏");
        body.method();

        System.out.println("==================");

        Body.Heart heart = new Body().new Heart();
        heart.beat();
    }
}

内部类的同名变量访问:

内部类访问内部类的成员变量:this.num

内部类访问外部类的成员变量:外部类名称 .this .num

 

2.局部内部类:定义在外部类,成员方法中的(只有该方法能用,出了方法就不行了)

格式:

修饰符 class 外部类 {

  修饰符 返回值类型 外部类方法名(参数列表){

    class 内部类名称 { }

  }

}

public class Out {
    public void method() {
        class In {
       int num = 100; // 这个 num 必须是有效 final 的,不可以再赋值,或者直接 final int num = 100;
public void methodIn() { System.out.println("内部类方法"); } } new In().methodIn(); } }
public class demo2main {
    public static void main(String[] args) {
        Out out = new Out();
        out.method();
    }
}

只该方法用,出了就不行

如果访问所在方法的局部变量,那这个局部变量必须是【有效 final 的】,因为局部内部类可以找到常量池的常量内容,一旦改变,就找不到了,数据就变了

 

3.匿名内部类,也是局部内部类的一种

如果接口的实现类(或者父类的子类)只需要使用一次,那么这种情况就可以省略类的定义,改而是用匿名内部类

格式:

接口名称 对象名 = new 接口名称 { 重写的方法 };    (分号不可以掉)

再用对象名调用方法

解析:

1.new是创建对象的动作

2.接口名称就是匿名内部类要实现的接口

3. {...}  就是匿名内部类的内容

注意事项:

1.匿名内部类在创建对象的时候只能使用唯一一次;

如果希望创建多个对象,就只能重复创建匿名内部类;或者使用实现类

2.有名称的匿名内部类,只能使用唯一一次,但是可以调用多个方法

 没有对象名的匿名内部类,只能调用一个方法,在分号前调用

3.匿名内部类省略了 实现类/子类名,匿名对象省略了对象名称

匿名内部类和匿名对象是两回事

package Niminglei;

public class demo1main {
    public static void main(String[] args) {
//使用了匿名内部类,但是有对象名称,对象名为 ok Ok ok
= new Ok() { @Override public void method() { int num = 100; System.out.println(num); } }; ok.method();
//使用了匿名内部类,但是没有对象名称
new Ok() { @Override public void method() { int num = 100; System.out.println("好的"); } }.method(); } }

 

 

类的权限修饰符规则:

1.外部类:public / (default)

2.成员内部类:public / protected / (default) / private

3.局部内部类:什么都不能写

 

posted @ 2020-02-29 18:32  |超人不会飞|  阅读(200)  评论(0编辑  收藏  举报