内部类
内部类:如果一个事物,内部包含另外一个事物,那么这就是一个类 内部包含另一个类
例如:身体和心脏的关系,汽车和发动机的关系
分类:
1.成员内部类:
2.局部内部类(包含匿名内部类)
1.成员内部类:定义在外部类中的
格式:
修饰符 class 外部类名称{
修饰符 class 内部类名称{}
}
注意:内用外,随意访问;外用内,需要内部对象
使用方法:
间接方法:在外部类方法中,使用内部类;然后 main 只是调用外部类方法
直接方法:公式: 外部类名称 . 内部类名称 对象名 = new 外部类名称 () . new 内部类名称()
public class Body {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void method() {
System.out.println("外部类方法");
new Heart().beat();
}
private String name;
public class Heart {
public void beat() {
System.out.println("蹦蹦蹦!");
System.out.println("我叫 " + name);
}
}
}
public class demo1 {
public static void main(String[] args) {
Body body = new Body();
body.setName("心脏");
body.method();
System.out.println("==================");
Body.Heart heart = new Body().new Heart();
heart.beat();
}
}
内部类的同名变量访问:
内部类访问内部类的成员变量:this.num
内部类访问外部类的成员变量:外部类名称 .this .num
2.局部内部类:定义在外部类,成员方法中的(只有该方法能用,出了方法就不行了)
格式:
修饰符 class 外部类 {
修饰符 返回值类型 外部类方法名(参数列表){
class 内部类名称 { }
}
}
public class Out {
public void method() {
class In {
int num = 100; // 这个 num 必须是有效 final 的,不可以再赋值,或者直接 final int num = 100;
public void methodIn() {
System.out.println("内部类方法");
}
}
new In().methodIn();
}
}
public class demo2main {
public static void main(String[] args) {
Out out = new Out();
out.method();
}
}
只该方法用,出了就不行
如果访问所在方法的局部变量,那这个局部变量必须是【有效 final 的】,因为局部内部类可以找到常量池的常量内容,一旦改变,就找不到了,数据就变了
3.匿名内部类,也是局部内部类的一种
如果接口的实现类(或者父类的子类)只需要使用一次,那么这种情况就可以省略类的定义,改而是用匿名内部类
格式:
接口名称 对象名 = new 接口名称 { 重写的方法 }; (分号不可以掉)
再用对象名调用方法
解析:
1.new是创建对象的动作
2.接口名称就是匿名内部类要实现的接口
3. {...} 就是匿名内部类的内容
注意事项:
1.匿名内部类在创建对象的时候只能使用唯一一次;
如果希望创建多个对象,就只能重复创建匿名内部类;或者使用实现类
2.有名称的匿名内部类,只能使用唯一一次,但是可以调用多个方法
没有对象名的匿名内部类,只能调用一个方法,在分号前调用
3.匿名内部类省略了 实现类/子类名,匿名对象省略了对象名称
匿名内部类和匿名对象是两回事
package Niminglei;
public class demo1main {
public static void main(String[] args) {
//使用了匿名内部类,但是有对象名称,对象名为 ok
Ok ok = new Ok() {
@Override
public void method() {
int num = 100;
System.out.println(num);
}
};
ok.method();
//使用了匿名内部类,但是没有对象名称
new Ok() {
@Override
public void method() {
int num = 100;
System.out.println("好的");
}
}.method();
}
}
类的权限修饰符规则:
1.外部类:public / (default)
2.成员内部类:public / protected / (default) / private
3.局部内部类:什么都不能写