Java学习笔记——内部类

如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类;
例:汽车与发动机;身体与心脏

分类:
1.成员内部类
2.局部内部类(包含匿名内部类)

成员内部类定义格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
}
}
注意:内用外,随意访问;外用内,需要内部类对象

public class Body {//内部类
    public class Haert {//成员内部类
        public void beat() {
            System.out.println("内部类方法");
            System.out.println(name);
        }

    }
    private String name;
    public void methodBody() {
        System.out.println("外部类方法");
    }
}

使用成员内部类的两种方式:
1.间接方式:在外部类的方法当中,使用内部类;然后main只是调用外部类的方法
2.直接方式:
公式:外部类名称 . 内部类名称 对象名= new 外部类名称().new 内部类名称();

如果出现了重名现象,那么格式是:外部名称 . this . 外部类成员变量

public class Outer {
    int num=20;
    public class Inner {
        int num=10;
        public void methodInner(){
            System.out.println(Outer.this.num);
        }        
    }   
}

局部内部类:如果一个类似定义在一个方法内部的,那么这就是一个局部内部类
“局部”:只有当前所属的方法才能使用它,出了这个方法就不能用了
定义格式:修饰符 class 外部类名称{
修饰符 返回值类型 外部方法名称(参数列表){
class 局部内部类名称{
}
}
}
注意事项:
定义一个类的时候,权限修饰符规则:
1.外部类:public/(default)
2.成员内部类:public/protected/(default)/private
3.局部内部类:什么都不能写

局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是有效final的(就是这个局部变量不能变)

匿名内部类:如果接口的实现类(或者是父类的子类),只需要使用唯一的一次,那么这种情况下就可以省略掉该类的定义,而改为使用匿名内部类
格式:
接口名称 对象名= new 接口名称(){
覆盖重写所有抽象方法
};

注意事项:
1.对格式“new 接口名称(){。。。};”进行解析:

  • new代表创建对象的动作
  • 接口名称就是匿名内部类需要实现哪个接口
  • {。。。}匿名内部类的内容

2.匿名内部类,在创建对象的时候,只能使用唯一一次
3.匿名对象,在调用方法的时候,只能调用唯一一次,如果希望同一个对象调用多次方法,那么必须给对象起个名字
4.匿名内部类是省略了实现类/子类名称,但是匿名对象是省略的对象名称,他俩不是一回事

猜你喜欢

转载自blog.csdn.net/weixin_42443419/article/details/86483524