如果一个事物的内部包含另一个事物,那么这就是一个类内部包含另一个类。
例如:汽车与发动机的关系
修饰符 class 外部类名称 {
修饰符 class 内部类名称 {
//...
}
//...
}
public class Body {//外部类
public class Heart {//成员内部类
public viod beat() {//内部类方法
System.out.println("beat,beat!");
System.out.println(name);//正确;能够访问外部成员变量
}
}
private String name;
public void methodBody() {
System.out.println("外部类的方法");
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
注意:内用外,可以随意访问;外用内,需要内部类对象。
public class Body {//外部类
public class Heart {//成员内部类
public viod beat() {//内部类方法
System.out.println("beat,beat!");
System.out.println(name);//正确;能够访问外部成员变量
}
}
private String name;
public void methodBody() {
System.out.println("外部类的方法");
new Heart().beat();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Demo1 {
public static void main(String[] args) {
Body body = new Body();
//通过外部类的对象,调用外部类的方法,里面间接在使用内部类Heart
body.methodBody();
}
}
外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
public class Demo2 {
public static void main(String[] args) {
Body.Heart heart = new Body().new Heart();
heart.beat();
}
}
外部类名称.this.外部成员变量名
public class Outer {
int num = 10;//外部类的成员变量
public class Inner {
int num = 20;//内部类的成员变量
public void methodInner() {
int num = 30;//内部类方法的局部变量
System.out.println(num);//30局部变量;就近原则
System.out.println(this.num);//20
// System.out.println(super.num);//错误;内部类和外部类并不是继承关系
System.out.println(Outer.this.num);//外部类的成员变量名
}
}
}
public class Demo {
public static void main(String[] args) {
Outer.Inner obj = new Outer().new Inner();
obj.merhodInner();
}
}
如果一个类是定义在方法内部的,那么这就是一个局部内部类。
”局部“:只有当前所属的方法才能使用它,出了这个方法外面就不能用了。
修饰符 class 外部类名称 {
修饰符 返回值类型 外部类方法名称(参数列表) {
class 局部内部类名称 {
//...
}
}
}
public class Outer {
public viod methodOuter() {
class Inner { //局部内部类
int num = 10;
public void methodInner() {
System.out.println(num);//10
}
}
Inner inner = new Inner();
inner.methodInner(); //只有当前方法才能访问
}
}
public class Demo {
public static void main(String[] args) {
Outer obj = new Outer();
obj.methodOuter();
}
}
局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须是【有效final的】
【备注】:从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略
public class MyOuter {
public void methodOuter() {
final int num = 10;//final可以省略但是num不能再重新赋值,否则局部类就不能访问
class Inner {
public void methodInner() {
System.out.println(num);
}
}
}
}
如果接口的实现类(或者是父类的子类)只需要使用唯一的一次。那么这种抢矿下就可以省略掉该类的定义,而改为使用匿名内部类。
接口名称 对象名称 = new 接口名称() {
//覆盖重写所有抽象方法
};
public interface MyInterface {
/*public abstract*/ void method();//抽象方法
}
public class MyInterfaceImpl impelememts MyInterface {
@Override
public void method() {
System.out.println("实现类覆盖重写了方法");
}
}
public class Demo1 {
public static void main(String[] args) {
MyInterface obj = new MyInterfaceImpl();//多态
obj.method();
}
}
public interface MyInterface {
/*public abstract*/ void method();//抽象方法
}
public class Demo2 {
public static void main(String[] args) {
MyInterface obj = new MyInterface() {//这个大括号里就是个匿名内部类
@Override
public void method() {
System.out.println("匿名内部类实现了方法A");
}
};
obj.method();
new MyInterface() {//使用方法2
@Override
public void method() {
System.out.println("匿名内部类实现了方法B");
}
}.method();
}
}
创建对象
的时候,只能使用唯一一次。(如果希望多次创建对象,而且类的内容一样的化,那么久必须使用单独定义的实现类)调用方法
的时候,只能调用唯一一次。(如果希望同一个对象,调用多次就需要给对象取个名字)实现类/子类名称
,但是匿名对象是省略了 对象名称
(匿名内部类和匿名对象不是一回事)