概念:在一个类的内部再定义一个完整的类。
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);
}
}
}
}
虚拟机内存:
堆空间(存的是对象)
栈空间(存放的是局部变量)
方法区:常量池,全局性的属性(如静态属性,全类公有)...