一个类的内部包含另外一个类,那么这种状况就叫内部类。this
内部类与外部类的关系,就像人体与心脏,汽车与发动机的关系。对象
内部类分为:成员内部类和局部内部类(包含匿名内部类)。接口
定义格式:内存
修饰符 class 外部类名称 {
修饰符 class 内部类名称 {class
//...}变量
//...}权限
注意:内部类访问外部类,能够随意访问,但外部类访问内部类,须要内部类的对象。方法
内部类的使用:命名
1).间接方式:在外部类的方法中使用内部类,而后经过main方法仅调用外部类的方法。new
2).直接方式:调用格式以下:
外部类名称.内部类名称 对象名 = new 外部类名称.new 内部类名称();
在内部类中的访问外部类同名变量的访问格式:
外部类名称.this.外部类的成员变量
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{方法体
}
}
方法体
}
局部性体如今:只能在该方法中内使用,出了方法就不能使用了。
定义一个类的时候,权限修饰符的规则:
外部类:public/(default)
成员内部类:public/protected/(default)/private
局部内部类:什么都不能写。
局部内部类的final问题:
对局部内部类,若是但愿访问所在方法的局部变量,那么这个局部变量必须是有效final的。
注意:从Java8开始,只要局部变量事实不变,那么final关键字能够省略不写。
缘由以下:
1).new出来的对象是存放在堆内存当中的。
2).局部变量是跟着方法走的,存放在栈内存当中。
3).方法运行结束后,马上出栈,局部变量会马上消失。
4).可是此时new出来的对象会在堆当中持续存在,直到回收消失。
局部内部类中的匿名内部类:
若是接口的实现类或者父类的子类只须要使用一次,那么这种状况下,就能够省略掉该类的定义,而改成使用匿名内部类。
匿名内部类的定义格式:
接口名 对象名 = new 接口名称 (){ // 覆盖重写全部的·抽象方法}
匿名内部类的注意事项:
对格式“new 接口名称 (){ // 覆盖重写全部的·抽象方法}”进行解析:
1).new表明建立对象的动做。
2).接口名称就是匿名内部类须要实现的哪一个接口。
3)."{......}"中的才是匿名内部类的内容。
注意事项:
1).匿名内部类在建立对象时,只能使用惟一一次。若是但愿屡次建立对象,并且类的内容同样,那么就须要单独定义实现类。
2).匿名对象在调用方法时,只能调用惟一的一次,若是但愿同一个对象屡次调用方法,那么必须给该对象命名。
3).匿名内部类时省略了实现类/子类名称,可是匿名对象是省略了对象名称。
强调:匿名对象和匿名内部类不是同一回事。