内部类
内部类种类
成员内部类
局部内部类(包含匿名内部类)
成员内部类
成员内部类的定义格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{
//...
}
}
注意事项:
内用外,随意访问,外用内,需要内部类对象
使用成员内部类的两种方式?
间接方式:外部类的方法中,使用内部类;然后mian只是调用外部类的方法
直接方式:公式
外部类名称.内部类名称 类名称 =new 外部类名称().new 内部类名称();
public class Body{//外部类
public class Heart{//成员内部类
//内部类的方法
public void beat(){
System.out.println("心脏跳动");、
System.out.println("我叫"+name);//正确写法 内部类可以随意使用外部类的成员变量和方法
}}
//外部类的成员变量
private String name;
//外部类方法
public void methodBody(){
System.out.println("外部类的方法");
new Heart().beat();//外部类调用内部类的第一种方法,通过外部类的成员方法创建内部类的对象调用内部类的成员方法。
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
//测试类\
public class test{
public static void main(String[] args){
Body body=new Body();//创建外部类对象
//通过外部类对象调用外部类方法,从而间接调用内部类的方法
body.methodBody();
//第二种方法
//创建内部类的对象来创建,来调用内部类的方法
//格式 外部类名称.内部类名称 对象名=new 外部类名称().new 内部类名称();
Body.Heart heart=new Body().new Heart();
heart.beat();
}
}
内部类的类成员变量同名的问题
public class Body{//外部类
int num=10;
public class Heart{//成员内部类
int num=20;
//内部类的方法
public void beat(){
int num=30;
System.out.println(num);//使用内部类的局部变量
System.out.println(this.num);//使用局部类的成员变量
System.out.println(Body.this.num);//使用外部类的成员变量
}}
//外部类的成员变量
private String name;
//外部类方法
public void methodBody(){
System.out.println("外部类的方法");
new Heart().beat();//外部类调用内部类的第一种方法,通过外部类的成员方法创建内部类的对象调用内部类的成员方法。
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
局部内部类
/*
如果一个类是定义在一个方法内部的,那么这就是一个局部内部类。
“局部”:只有当前所属的方法才能使用它,出了这个方法就不能使用了。
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
//...
}
}
}
*/
public class Outer {
public void outerMethod() {
class Inner{
int num=19;
public void innerMethod() {
System.out.println(num);
}
}
Inner inner=new Inner();
inner.innerMethod();//19
}
}
public class mainTest {
public static void main(String[] args) {
Outer outer =new Outer();
outer.outerMethod();
}
}
注意事项:
小结一下权限修饰符:
public >protected>(default)>private
定义一个类的时候,权限修饰符规则
外部类:public /(default)
成员内部类:public /protected/(default)/private
局部内部类:什么都不写
局部变量的final问题
/*
局部内部类,如果希望访问所在的方法的局部变量,那么这个局部变量必须是[有效final的]
备注:从java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
原因:
new 出来的对象是在堆内存中。
局部变量是跟着方法走的,在栈内部当中。
方法运行结束之后,立刻出栈,局部变量就会立刻消失
但是new 出来的对象,会在堆当中持续存在,直到垃圾回收消失。
*/