java-内部类

概念:在一个类的内部再定义一个完整的类。

1.特点:

  编译之后可分别生成独立的字节码文件

  内部类可以直接访问外部类的私有成员,而不破坏封装。

2.内部类在java中的类型:

  成员内部类,静态内部类,局部内部类,匿名内部类。

3.成员内部类:(在类的内部定义和成员变量、成员方法同级别的类,

package day13;

public class TestStaticClass {

	public static void main(String[] args) {
//		Outer2.StaticInner in3 =new Outer2.StaticInner();
//		in3.method();

	}

}

class Outer2 {
	private int a = 10;// 成员属性
	private static int b = 20;

	public Outer2(int a) {
		this.a = a;
	}

	public void m() {
		final int x = 20;
		class LocalInner {
			private int o = 30;
//			private static int p = 40;error!

			public void method() {
				System.out.println(o);// 30
//				System.out.println(p);
				System.out.println(a);// 0
				System.out.println(b);// 20
				System.out.println(x);// 50
			}
		}// 内部类的定义不算是该Outer2类的代码,因为他在编译时,单独形成一个.class文件
		LocalInner in = new LocalInner();
		in.method();
	}

	static class StaticInner {
		private int x = 10;

		public void method() {
			System.out.println(x);
//			System.out.println(a);
			System.out.println(b);
		}
	}
}

  

即是成员内部类)

  创建对象:先创建外部类对象,再通过外部类对象.new内部类类名() 创建内部类对象

  成员内部类依托于外部类而存在的。如Outer1.MemberInner in1=o1.new MemberInner();

  内部类可以直接访问外部类的私有属性,从而不破坏类的封装性。

内部类访问私有属性例子:

package day13;

public class demo {

	public static void main(String[] args) {
		Outer1 o1 = new Outer1(10);
		Outer1.MemberInner in1 = o1.new MemberInner();
		in1.method();//30
		Outer1 o2 = new Outer1(20);
		Outer1.MemberInner in2 = o2.new MemberInner();
		in2.method();//30
	}

}

class Outer1 {
	private int a;

	public Outer1(int a) {
		this.a = a;
	}

	public void m() {
	}

	class MemberInner {
		private int a=30;
		public void method() {
		int a=40;
			System.out.println(a);//40
			System.out.println(this.a);//30
			System.out.println(Outer1.this.a);//10  20
		}
	}
}

4.静态内部类

  静态内部类只能访问外部类的静态成员。它不依赖与外部类(更独立),用的时候比较方便。

 代码例子:

package day13;

public class TestStaticClass {

	public static void main(String[] args) {
		Outer2.StaticInner in3 =new Outer2.StaticInner();
		in3.method();
	}

}
class Outer2 {
	private int a = 10;// 成员属性
	private static int b=20;
	public Outer2(int a) {
		this.a = a;
	}

	public void m() {
		int x = 20;
		
	}
	static class StaticInner{
		private int x=10;
		public void method() {
			System.out.println(x);
//			System.out.println(a);
			System.out.println(b);
		}
	}
}

5.局部内部类:定义在方法的内部(出了生命期就无法使用)

局部变量:在方法范围之内定义的变量。

局部类:在方法里定义的类。在方法里定义后才能使用,出了该方法就无法使用。

  作用范围:从定义开始。到代码块结束。

  局部内部类不能定义静态成员

  局部内部类可以访问外部类的私有成员,还能访问外部类的局部变量,但是要加上final

代码例子

package day13;

public class TestTeacher {

	public static void main(String[] args) {
		Student1 t = new Student1();
		t.study();
	}

}

class School {
	public static Teacher getTeacher(int n) {
		class TeacherA implements Teacher {
			public void teach() {
				System.out.println("TeacherA 讲课");
			}
		}

		class TeacherB implements Teacher {
			public void teach() {
				System.out.println("TeacherB 讲课");
			}
		}
		if (n % 2 == 0)
			return new TeacherA();
		else
			return new TeacherB();
	}
}

class Student1 {
	public void study() {
//		TeacherA t = new TeacherA();
//		Teacher t =School.getTeacher();
//		t.teach();
//		Teacher t =new TeacherA();
		Teacher t = School.getTeacher(1);
//		Teacher t =new TeacherA();
		t.teach();
	}
}

interface Teacher {
	void teach();
}

 6.局部内部类访问外部类局部变量

package day13;

public class TestLocalInnerClass {

	public static void main(String[] args) {

	}

}
class A{
	public void method() {
		final int x=10;
		class B{
			public void print()
			{
				System.out.println(x);
			}
		}
	}
}

  虚拟机内存:

    堆空间(存的是对象)

    栈空间(存放的是局部变量)

    方法区:常量池,全局性的属性(如静态属性,全类公有)...

posted @ 2020-10-26 09:56  SpringChuXin  阅读(134)  评论(0编辑  收藏  举报