3.2 内部类

非静态内部类

特点

  1. 非静态内部类必须寄存于一个外部类对象里。因此如果有一个非静态内部类对象,那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象
  2. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
  3. 非静态内部类不能有静态方法、静态属性和静态初始化块。
  4. 外部类的静态方法、静态代码块不能访问非静态内部类。
  5. 成员变量访问:内部类里方法的局部变量:变量名;内部类属性:this.变量名;外部类属性:外部类名.this.变量名。
    代码
/**
 * 测试非静态内部类
 * 1. 非静态内部类必须寄存于一个外部类对象里。因此,如果有一个非静态内部类对象,那么一定存在
 * 对应的外部类对象。非静态内部类对象单独属于外部类的某个对象
 * 2. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员
 * 3. 非静态内部类不能有静态方法、静态属性和静态初始化块
 * 4. 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,
 * 创建实例
 * 5. 成员变量访问:内部类里方法的局部变量:变量名;内部类属性:this.变量名;外部类属性:外
 * 部类名.this.变量名。
 * @author dxt
 *
 */
public class TestInnerClass {
	public static void main(String[] args){
		//创建内部类对象
		Outer.Inner inner = new Outer().new Inner();
		inner.printAge1();
	}
}

class Outer{
	private int age = 10;
	public void printAge(){
		System.out.println(age);
	}
	/**
	 * 内部类
	 * 类似于属性存在于外部类中,编译时会生成对立的文件
	 * 可以使用外部类的属性
	 * @author dxt
	 *
	 */
	class Inner{
		private int age = 20;
		public void printAge1(){
			System.out.println("外部类属性age = "+Outer.this.age);
			System.out.println("内部类属性age = "+this.age);
			System.out.println("内部类属性age = "+age);
			
			
		}
	}
}

静态内部类

特点

  1. 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法不能直接访问外部类的实例方法。
  2. 静态内部类可看作外部类的一个静态成员
    代码
/**
 * 测试静态内部类
 * 1. 当一个静态内部类对象存在,并不一定存在对应的外部类对象。因此,静态内部类的实例方法
 * 不能直接访问外部类的实例方法。
 * 2. 静态内部类可看作外部类的一个静态成员
 * @author dxt
 *
 */
public class TestStaticInnerClass {
	public static void main(String[] args){
		//创建静态内部类对象
		Outer2.Inner2 inner2 = new Outer2.Inner2();
	}
}

class Outer2{
	
	static class Inner2{
		
	}
}

匿名内部类

特点

  1. 适合只是需要使用一次的类,比如键盘监听等
  2. 匿名内部类无构造方法
    代码
/**
 * 测试匿名内部类
 * 1. 适合只是需要使用一次的类,比如键盘监听等
 * @author dxt
 *
 */
public class TestAnonymousInnerClass {
	public static void test01(A a){
		a.aa();
	}
	
	public static void main(String[] args){
		TestAnonymousInnerClass.test01(new A(){
			public void aa(){
				System.out.println("TestAnonymousInnerClass.main().new A().aa()");
			}
		});
	}
}

interface A{
	void aa();
}

局部内部类

代码

/**
 * 测试局部内部类
 * 1. 方法内部的类
 * @author dxt
 *
 */
public class TestLocalInnerClass {
	public void show(){
		class Want{
			public void myWant(){
				System.out.println("I want to take a break.");
			}
		}
		new Want().myWant();
	}
	public static void main(String[] args){
		new TestLocalInnerClass().show();
	}
}
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页