1、内部类
(1)一个事物的内部包含着另一个事务,一个类内部包含着另一个类;
(2)分类:成员内部类,局部内部类(包含匿名内部类);
(3)成员内部类的定义格式:修饰符 class 外部类名称{
修饰符 class 内部类名称{ …… }
……
}
注意:内用外,随意访问;外用内,需要内部类对象;
(4)如何使用成员内部类:两种方式:1》间接方式:在外部类的方法中,使用内部类,然后main只是调用外部类的方法;
2》直接方式:(本质是:类名称 对象名=new 类名称();)
【外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();】
(5)内部类与外部类变量同名的访问:在内部类方法中访问局部变量,直接访问,访问内部类的成员变量,this.变量名;访问外部类的成员变量,外部类.this.变量名;
(6)局部内部类:一个类定义在一个方法的内部;【”局部“只有当前所属的方法才能使用它,出了这个方法外部就不能用了】;
(7)定义格式:修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{ …… }
}
}
(8)定义一个类时权限修饰符规则:1》外部类:public/default;
2》成员内部类:public/protected/default/private;局部内部类:什么都不能写;
(9)局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】;(注:从java8开始,只要局部变量事实不变,final关键字可以省略);
原因:1》new出来的对象在堆内存中;
2》局部变量是跟着方法走的,在栈内存中;
3》方法运行结束之后,立刻出栈,局部变量就会立刻消失;
4》但是new出来的对象会在堆当中持续存在,直到垃圾回收时消失;
(10)匿名内部类(重点):如果接口的实现类,或父类的子类,只需要使用唯一一次,这种情况下可以省略掉该类的定义,使用匿名内部类;
(11)定义格式:【接口名称 对象名=new 接口名称(){ 覆盖重写所有抽象方法 };】;1》new代表创建对象的动作;2》接口名称是匿名内部类需要实现哪个接口;3》{ …… }才是匿名内部类的内容;
(12)匿名内部类的注意事项:1》匿名内部类在【创建对象】的时候,只能使用唯一一次;(如果希望多次创建对象,而且类的内容一样,必须使用单独定义的实现类);
2》匿名对象,在【调用方法】的时候,只能调用唯一一次,如果希望同一对象调用多次方法,必须给对象起个名字;
3》匿名内部类是省略了实现类/子类名称,匿名对象是省略了对象名称;
原文:https://www.cnblogs.com/xiaozhu1017/p/12609872.html