1、内部类可以访问外部类的任何成员(直接写属性名或者方法名即可访问,实际上是通过外部类名+“.”+this+“.”+名称访问,如果是this+“.”+名称,此时访问不到外部类成员,访问的为内部类的成员)。
2、非静态内部类是不能含有静态成员的。
3、外部类中的方法访问内部类中的方法一共分为六种情况
1) 静态外部方法访问静态内部类静态方法,直接使用静态内部类名+ . +静态方法名。
2) 静态外部方法访问静态内部类非静态方法,需要创建静态内部类的实例再调用非静态方法。
3) 静态外部方法访问非静态内部类非静态方法,需要先创建外部类实例,再创建非静态内部类的实例最后调用非静态方法。
4) 非静态外部方法访问静态内部类静态方法,直接使用静态内部类名+ . +静态方法名。
5) 非静态外部方法访问静态内部类非静态方法,需要创建静态内部类的实例再调用非静态方法。
6) 非静态外部方法访问非静态内部类非静态方法,需要创建非静态内部类的实例再调用非静态方法。
测试代码如下(其中静态外部方法使用main方法方便测试输出):
public class innerClasstest {
public static void main(String[] args) {
staticInnerClass.staticInnerClassStaticmethod(); //静态外部方法访问静态内部类静态方法
new staticInnerClass().staticInnerClassmethod(); //静态外部方法访问静态内部类非静态方法
new innerClasstest().new innerClass().innerClassmethod(); //静态外部方法访问非静态内部类非静态方法
System.out.println("---------------");
new innerClasstest().outerMethod();
}
public void outerMethod() {
staticInnerClass.staticInnerClassStaticmethod(); //非静态外部方法访问静态内部类静态方法
new staticInnerClass().staticInnerClassmethod(); //非静态外部方法访问静态内部类非静态方法
new innerClass().innerClassmethod(); //非静态外部方法访问非静态内部类非静态方法
}
static class staticInnerClass{
public static void staticInnerClassStaticmethod() {
System.out.println("this is staticInnerClassStaticmethod");
}
public void staticInnerClassmethod() {
System.out.println("this is staticInnerClassmethod");
}
}
class innerClass{
public void innerClassmethod() {
System.out.println("this is innerClassmethod");
}
}
}
代码输出结果为:
补充:
一、在外部类外部使用内部类(不推荐这么做)
1) 访问静态内部类静态方法,直接使用静态外部类名+ . +静态内部类名+ . +静态方法名。
2) 访问静态内部类非静态方法,需要创建静态内部类的实例再调用非静态方法(并且需要import内部类)。
3) 访问非静态内部类非静态方法,需要先创建外部类实例,再创建非静态内部类的实例最后调用非静态方法。
import innertest.innerClasstest.staticInnerClass;
public class outerTest {
public static void main(String[] args) {
innerClasstest.staticInnerClass.staticInnerClassStaticmethod();//访问静态内部类静态方法
new staticInnerClass().staticInnerClassmethod();//访问静态内部类非静态方法
new innerClasstest().new innerClass().innerClassmethod();//访问非静态内部类非静态方法
}
}
二、内部类访问外部类若出现同名方法或者属性时如何区分
1) this+.+方法或属性名称访问的内部类的方法或属性,不加this默认访问内部类方法或者属性。
2) 外部类名+.+this+.+ 方法或属性名称访问的外部部类的方法或属性。
3) 由此可知在内部类方法中想要返回内部类的引用时可return this,当想要返回外部类的引用可return 外部类名+.+this。