java 成员内部类
文章同步更新(更好的排版):
一篇文章理清java成员内部类
一、定义
内部类:指一种嵌套的结构关系。即在一个类的内部除了属性和方法还可以继续定义一个完整的类
二、成员内部类
2.1 位置
在类的内部定义,与类的成员属性和成员方法一个级别
2.2 特点
- 成员内部类可以被任何访问修饰符修饰。如
public
、protected
、private
、default
- 成员内部类可以直接访问外部类的属性和方法。即使是私有属性和方法也可以访问
- 成员内部类中的属性,与外部类的属性同名时,成员内部类则需要使用
外部类类名.this.外部类属性名称
访问外部类的属性 - 成员内部类不能包含静态成员,但是可以包含静态常量
2.3 成员内部类的实例化方法
- 方法一:先创建外部类对象,然后根据外部类对象创建内部类对象
//第一步:创建外部类对象
外部类类名 外部类对象名 = new 外部类类名();
//第二步:根据外部类对象,创建内部类对象
外部类类名.内部类类名 内部类对象名 =外部类对象.new 内部类类名();
- 方法二:直接创建
外部类类名.内部类类名 内部类对象名 = new 外部类类名().new 内部类类名();
2.4 代码示例一:演示特点一
//相对于 Inner 来说 Outer 是外部类
public class Outer {
//成员内部类
//成员内部类可以被任何访问修饰符修饰
public class Inner{ }
private class Inner02{}
protected class Inner03{}
class Innner04{}
}
2.5 代码实例二:演示特点二
public class Outer02 {
//成员属性
private String name = "Tom";
private int age = 18;
//成员方法
public void show(){
System.out.println("名字为:"+name + age);
}
//成员内部类
class Inner{
//内部类的成员方法
public void show(){
//成员内部类可以直接访问外部类的属性和方法。即使是私有属性和方法也可以访问
System.out.println(name + "\t" + age);
}
}
}
public class Test02 {
public static void main(String[] args) {
//第一种
//第一步:创建外部类对象
//外部类类名 外部类对象名 = new 外部类类名();
Outer02 o1 = new Outer02();
//第二步:根据外部类对象,创建内部类对象
//外部类类名.内部类类名 内部类对象名 =外部类对象.new 内部类类名();
Outer02.Inner inner1 = o1.new Inner();
inner1.show();
//第二种
//外部类类名.内部类类名 内部类对象名 = new 外部类类名().new 内部类类名();
Outer02.Inner inner2 = new Outer02().new Inner();
inner2.show();
}
}
2.6 代码实例三:演示特点三
public class Outer03 {
//成员属性
private String name = "Tom";
private int age = 18;
//成员内部类
class Inner{
//成员内部类的成员属性
//此属性与外部类的属性重名了
private String name = "GGBond";
//内部类的成员方法
public void show(){
//show 方法里面的 name
String name = "jack";
//什么都没修饰,就会就近原则
System.out.println("方法中的局部变量 name:" + name);
System.out.println("内部类的实例属性 name:" + this.name);
//成员内部类中的属性,与外部类的属性同名时,内部类则需要使用 外部类类名.this.外部类属性名称 访问外部类的属性
System.out.println("外部类的实例属性 name:" + Outer03.this.name);
}
}
}
public class Test03 {
public static void main(String[] args) {
Outer03.Inner inner = new Outer03().new Inner();
inner.show();
}
}
2.7 代码示例四:演示特点四
public class Outer04 {
//成员内部类
class Inner{
//成员内部类不能包含静态成员,但是可以包含静态常量
private static int phone;
public static void test(){}
private static final int a = 1000;
}
}