Java_十万个为什么之内部类

常规内部类

Q:常规内部类能否使用外部类的属性和方法?
A: 可以。本质还是因为常规内部类对象依赖于创建好的外部类对象。

Q:外部类能否使用常规内部类的属性和方法?
A:可以,但必须创建内部类对象,通过内部类对象使用内部类的属性和方法,包括private权限的。

Q:如何创建一个常规内部类对象?
A:

Outter o=new Outter();
OUtter.Inner i=o.new Inner();

Q:常规内部类可是定义静态属性吗?
A:不可以。

public class Outter{
	public class Inner{
		public static Inner innerInstance=new Inner();
	}
}

内部类对象的创建必须依附外部类对象,而上面这个例子,在调用内部类static属性时,内部类加载并初始化,这时就将创建一个内部类对象,这和定义是违背的,所以常规内部类中不可以定义静态属性。

Q:外部类加载时会加载内部类吗?
A:不会。包括静态内部类也不会。

静态内部类

Q:静态内部类与常规内部类的区别
A:

  • 静态内部类创建不依赖外部类对象,可直接创建内部类对象
  • 静态内部类只能访问外部类的静态属性和方法
  • 静态内部类可以静态和非静态的属性和方法

局部内部类

Q:局部内部类能在方法外创建对象吗?
A:不能。局部内部类对象只能在当前方法中创建,但可以在外部获取到创建的对象。

Q:局部内部类有权限修饰吗?
A:没有。因为局部内部类对象只能在当前方法中创建,所以不涉及权限问题。

Q:局部内部类可以使用外部类对象和方法吗?
A:可以。

Q:如何创建局部内部类对象?
A:

  • 在局部方法中创建局部内部类对象:
package com.inner.local;

public class Outter {

	public static void main(String[] args) {
		Outter o = new Outter();
		o.show();
	}

	public void show() {
		class Inner {
			public void showInner() {
				System.out.println("Inner");
			}
		}
		Inner i = new Inner();
		i.showInner();
	}
}

  • 在外部获取局部内部类对象,通过接口回调:
package com.inner.local;

public interface UseInner {
	void showInner();
}

package com.inner.local;

public class Outter {

	public static void main(String[] args) {
		UseInner ui = new Outter().show();
		ui.showInner();
	}

	/**
	 * 定义一个方法返回UseInner接口对象
	 * @return	返回一个Inner对象
	 */
	public UseInner show() {
		/**
		 * 局部内部类实现UseInner接口
		 * @author 83998
		 *
		 */
		class Inner implements UseInner {

			@Override
			public void showInner() {
				System.out.println("Inner");
			}
		}
		return new Inner();
	}

}

Q:为什么局部内部类可以访问方法中的局部变量但不能进行修改?
A:为什么局部内部类可以访问方法中的局部变量但不能进行修改?

匿名内部类

new class|interface|abstractClass(){
	@Override
}
发布了340 篇原创文章 · 获赞 23 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Chill_Lyn/article/details/103649202