目录
1.内部类的概念:
如果一个事物的内部包含另一个事物,那么这就是一个类 内部包含另一个类。
例如:身体和心脏的关系。又如:汽车和发动机的关系。房子和房间的关系等。
2.内部类的分类:
Ⅰ.成员内部类
成员内部类的定义格式:
修饰符 class 外部类名称 {
修饰符 class 内部类名称 {
//...
}
//...
}
注意:内用外,随意访问,外用内,需要内部类对象。
//内部类使用外部类成员变量
public class Body { //外部类
public class Heart { //内部类
//内部类方法
public void beat() {
System.out.println("内部类 心脏跳动 ");
System.out.println("我叫" + name); //private修饰的外部成员变量可以在内部类里访问
}
}
//外部类成员变量
private String name;
public Body(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//外部类方法
public void methodBody() {
System.out.println("外部类方法");
}
}
文件夹里显示内部类的名称如下:
①间接方式使用成员内部类:
在外部类的方法当中使用内部类,然后mian中只调用外部类的方法。
//外部类方法
public void methodBody() {
System.out.println("外部类方法");
Heart heart = new Heart();
heart.beat();
//或者 new Heart().beat();
}
public class DemoMain {
public static void main(String[] args) {
Body body = new Body("小明"); //外部类对象
//通过外部类对象,调用外部类方法,里面间接使用内部类Heart
body.methodBody();
}
}
②直接方式使用成员内部类:
格式:
【外部内名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();】
public class DemoMain {
public static void main(String[] args) {
Body.Heart heart = new Body("小明" ).new Heart();
heart.beat();
}
}
Ⅱ.局部内部类(包含匿名内部类)
①内部类的定义和使用
如果一个类是定义在一个方法内部的,那么这个类就是一个局部内部类。
“局部”:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
定义格式:
修饰符 class 外部类名称{
修饰符 返回值类型 外部类方法名称(参数列表){
class 局部内部类名称{
//...
}
}
}
public class Outer {
public void methodOuter(){
class Inner{
public void methodInner(){
int num = 10;
System.out.println(num);
}
}
Inner inner = new Inner();
inner.methodInner();
}
}
public class DemoTest {
public static void main(String[] args) {
Outer outer = new Outer();
outer.methodOuter();
}
}
②局部内部类的final问题
局部内部类,如果希望访问所在的方法的局部变量,那么这个局部变量必须是【有效final的】
备注:从java 8以后开始,只要局部变量事实不变,那么final关键字可以省略。
原因:
1.new出来的对象在推内存当中。
2.局部变量事跟着方法走的,在栈内存当中。
3.方法运行结束后,立刻出栈,局部变量就会立刻消失。
4.但是呢我出来的对象会在堆当中持续存在,知道垃圾回收消失。
public class MyOuter {
public void methodOuter(){
final int num = 10;
class MyInner{
public void methodInner(){
//只要num是一直不变的常量 就算局部变量num跟着方法运行结束后消失,在消失前可以copy过来用
System.out.println(num);
}
}
}
}
③.内部类的同名变量访问
如果出现重名现象,那么格式是:外部类名称.this.外部类变量名
public class Outer {
int num = 10;
public class Inner{
int num = 20;
public void method(){
int num = 30;
System.out.println(num); //内部类的局部变量
System.out.println(this.num); // 内部类的成员变量 就近原则
System.out.println(Outer.this.num); //外部类的成员变量
}
}
}
Ⅲ.定义一个类的时候,权限修饰符规则:
其中权限修饰符:public > protected > (default) > private
定义一个类的时候,权限修饰符规则:
1.外部类:public / (default)
2.成员内部类:public / protected / (default) / private
3.局部内部类:什么都不写