
1、内部类可以直接访问外类的元素(成员变量、成员方法,私有的也可以访问),外部类访问内部类的元素(成员变量、成员方法)必须实例内部类的对象进行访问。
2、外部类和内部类同名的调用方式:
//内部类调用外部类的变量和方法
public class Test5 {
public static void main(String[] args) {
//实例化内类的对象
//第一种方式
outer outer=new outer();//实例化外部类的对象
outer.inner inner1=outer.new inner();
//第二种方式
outer.inner inner=new outer().new inner();
inner.show();
}
}
class outer{
private int a=10;//外部类的成员变量
private int b=20;//外部类的成员变量
public class inner{
int a=11;//内部类的成员变量
int b=30;//内部类的成员变量
public void show(){
System.out.println(a);//打印外部类的成员变量
System.out.println(b);//就近原则打印内部类的成员变量
System.out.println(this.a);//打印内部类的成员变量
System.out.println(outer.this.b);//打印外部类的成员变量
}
}
}
3.1.2 外部类调用内部类的方法和变量
public class Test6 {
public static void main(String[] args) {
Outer outer=new Outer();
outer.outshow();
}
}
class Outer{
private int a=10;//外部类的成员变量
private int b=20;//外部类的成员变量
//外部类的成员方法(内部类的成员变量a和b相加)
public void outshow(){
//实例化内部类的对象
Inner inner=new Inner();
int c=inner.a+inner.b;
System.out.println(c);
inner.show();
}
public class Inner{
int a=11;//内部类的成员变量
int b=30;//内部类的成员变量
public void show(){
System.out.println("这个内部类的成员方法");
}
}
}
4 静态内部类
package com.xiaozeng;
public class Test7 {
public static void main(String[] args) {
//调用静态内部类的方法
outer.inner inner=new outer.inner();
String abc = inner.abc;
System.out.println(abc);
inner.show();
}
}
class outer{
public static class inner{
String abc="我是静态的成员变量";
public void show(){
System.out.println("我是静态内部类的方法");
}
}
}
4.2 静态内部类访问外部变量和方法
package com.xiaozeng;
public class Test7 {
public static void main(String[] args) {
//调用静态内部类的方式
Outer.inner staticinner=new Outer.inner();
staticinner.show();
}
}
class Outer{
public static String abc="我是外部类的静态变量";
public String cde="我是外部类的普通变量";
public static void abc1(){
System.out.println("我是外部类的静态方法");
}
public void cde1(){
System.out.println("我是外部类的普通方法");
}
public static class inner{
public void show(){
//调用外部类的静态方法/变量
System.out.println(Outer.abc);
Outer.abc1();
//调用外部类的普通方法/变量
Outer outer=new Outer();
System.out.println(outer.cde);
outer.cde1();
}
}
}
4.3 静态内部类使用
package com.xiaozeng;
public class Test8 {
public static void main(String[] args) {
OuterOne outerOne=new OuterOne();
outerOne.inner();
}
}
class OuterOne {
private String a="外部类的成员变量";
private void outshow(){
System.out.println("外部类的成员方法");
}
//定义一个方法并在里面定义一个内部类并打印
public void inner(){
//定义外部类的局部变量
String bc="方法中的局部变量";
bc="方法中的局部变量2";
//被final修饰的局部变量
final String c="外部类的局部变量";
final String a="方法中的局部变量";
//内部类
class Inner{
//打印变量
public void print(){
//打印外部的类的成员方法和变量
System.out.println(a);
System.out.println(OuterOne.this.a);
outshow();
//打印方法内部的成员变量
// System.out.println(bc);//编译错误,因为bc被修饰过2次所以,不能被访问
System.out.println(c);
}
}
new Inner().print();
}
}
6 匿名内部类
6.1 什么是匿名内部类
package com.xiaozeng;
public interface Test9 {
void show();
}
class inner{
public static void main(String[] args) {
Test9 test9 =new Test9(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
test9.show();
}
}