//外部类
public class Out{
    private int yes = 0;
    int data = 1 ;
	//内部类
	public class In{
		int yes = 2 ;
		public void print() { 
			System.out.println("外部类yes:" + Out.this.yes );//调用外部类和内部类同名变量或属性的方法
			System.out.println("外部类中data:" + data);  //调用外部变量
			System.out.println("内部类中yes:" +  yes );
			
		}
	}
    

	public static void main(String[] args) {
        
        //创建外部类的对象,利用外部类对象创建内部类对象,调用内部类对象的方法
		//第一种调用方式
		Out outObject = new Out(); 
		In inMethod1 =   outObject.new In()  ;
		inMethod1.print(); 
		//第二种调用方式
		Out.In inMethod2= new Out().new In() ;
		inMethod2.print();	
	}
}




输出:

外部类yes:0

外部类中data:1

内部类中yes:2

外部类yes:0

外部类中data:1

内部类中yes:2



tips:

1. 定义内部类后,须用外部类对象来创建内部类对象,而不能是:内部类 对象名 = new 内部类( );,只能先创建外部类对象再 通过外部类对象引用内部类的方法、属性等:

内部类 对象名 = 外部类对象.new 内部类( ) ;

或   外部类.内部类 对象名 = new 外部类().new 内部类();

即访问成员内部类的唯一途径就是通过外部类的对象!

2.内部类内不允许有任何静态声明!

3.如果外部类和内部类具有相同的成员变量或方法,内部类成员变量或方法具有更高的优先级,如果要访问外部类的成员变量可以使用关键字this 

4.内部类可以看做外部类的一个成员变量的位置,内部类可以使用任意访问控制符,如 public 、private 等

5. 内部类可以直接访问外部类中的数据,而不受访问控制符的影响

6.内部类也是独立的类,在编译过程中会产生独立的.class文件,但其命名方式为:外部类名$内部类名.class(普通类:类名.class)

7.静态内部类不能直接访问外部类的非静态成员,而是通过 new外部类().成员 访问 ; 访问同名外部类静态成员通过 类名.静态成员  

8.定义在外部类的方法中的类称为方法内部类,方法内部类只在该方法内有效,且方法内部类不能有访问控制符和static修饰,在方法内引用直接用 方法内部类 对象名 = new 方法内部类()