Java学习之内部类--InnerClass

来源:互联网 发布:eai是什么软件 编辑:程序博客网 时间:2024/05/16 13:51
内部类

一、内部类介绍:


内部类(Nested Class) 嵌套类
  • 静态内部类
  • 非静态内部类
  • 普通内部类(也称为:成员内部类)
  • 在一个类(外部类)中直接定义的内部类
  • 匿名内部类
  • 方法内部类
  • 在一个方法(外部类的方法)或代码块中定义的内部类
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
内部类可以使用修饰符(public,protected,default,private)
demo01:
public class Demo01 {//静态内部类private static class StaticInnerClass{}//普通内部类class InnerClass{}void say(){//方法内部类class MethodClass{}//匿名内部类Runnable run = new Runnable(){@Overridepublic void run() {}};}}


二、静态内部类


静态内部类基本用法:

  • 静态内部类可以保护静态成员,非静态成员。
  • 静态内部类可以直接调用外部类的静态属性,静态方法,但不能调用外部类的普通属性,普通方法。
  • 在不相关类中,可以直接创建静态内部类的对象(不需要通过所在外部类)
  • 静态内部类实际上和外部类联系很少,也就是命名空间上的联系。
deom02:
import TestClass.InnerClass.StaticInnerClass;public class Demo02 {public static void main(String[] args) {//两种方式实例化//InnerClass.StaticInnerClass is = new InnerClass.StaticInnerClass();StaticInnerClass is = new StaticInnerClass();//导入包 TestClass.InnerClass.StaticInnerClass;}}class InnerClass{int a = 1;static int b =2;//静态内部类public static class StaticInnerClass{int c=3;static int d=4;public void test(){//System.out.println(a);静态内部类不能调用外部类的普通成员,只能调用静态成员。System.out.println(b);}}}


三、成员内部类(普通内部类)


1.成员内部类基本用法:

  • 成员内部类就像一个成员变量一样存在与外部类中。
  • 成员内部类可以访问外部类的所有成员(包含:private的)
  • 成员内部类的this值内部类对象本身。要拿到外部类的对象可以使用: 外部类名+this.
  • 成员内部类的对象是一定要绑定到一个外部类的对象上的,因此,创建成员内部类对象时需要持有外部类对象的引用。因此,要先有外部类对象,后有成员内部类对象。
  • 成员内部类不能有静态成员。

2.成员内部类对象的创建方式:

外部类内部
Inner in = new Inner();
外部类外部

Inner in = new Outer().new Inner();


demo03:
public class Demo03 {public static void main(String[] args) {//实例化Outer03 outer = new Outer03();InnerClass03 inner = outer.new InnerClass03();inner.test();}}class Outer03{private int a=1;int b=2;class InnerClass03{int c=3;//static int d=4;不能有静态属性final int e=5;//除非声明为final,并且只有编译器可以确定的值得常量表达式//如果这样可以的话,那oUTER03.InnerClass.in直接获得内部类对象,这是成员内部类的对象就完全脱离了外部类的控制!与设计初衷违背//static  InnerClass03 in= new InnerClass03();void test(){System.out.println(a);System.out.println("内部类对象:"+this);//成员内部类对象的创建,必须先有外部类对象System.out.println("外部类对象:"+Outer03.this);//引用了外部类的对象}}}

四、方法内部类(局部内部类)


方法类基本用法:

  • 方法内部类的地位和方法内的局部变量的位置类似。
  • 因此不能修饰局部变量的修饰符也不能修饰局部内部类,比如public,private,protected,static,transient等。
  • 方法内部类只能在声明的方法内是可见的
  • 因此定义局部内部类之后,想用的话就要在此方法内直接实例化,记住这里顺序不能反了,一定是要先声明后使用,否则编译器会说找不到。
  • 方法内部类不能访问定义它的方法内的局部变量,除非这个变量被定义为final.
  • 本质原因:局部变量和方法内部类生命周期不一致所致
  • 方法内部类只能包含非静态成员!
Demo04;
public class Demo04 {public static void main(String[] args) {}}class outer04{int c=2;void test(){//public int a=1;//错误不能有修饰符//static int b=20;方法内部类中只能定义非静态成员int d=3;final int e=4;class InnerClass04{void test(){//System.out.println(d);方法内部类不能使用所在方法的普通变量,除非是常量System.out.println(e);System.out.println(c);//可以引用外部类的变量}}InnerClass04 in = new InnerClass04();}}

五、匿名内部类


1.匿名内部类基本用法:


  • 匿名内部类的实例化方式:new InterfaceOrClass{};
  • 意思是创造一个实现(继承)了InterfaceOrClass的类的对象;

  • 根据声明的位置,判断匿名内部类是成员内部类还是方法内部类。
  • 注:一般是方法内部类,这是就具备方法内部类的特性。

三种使用方法:
继承式
接口式
参数式
public class Demo05 {public static void main(String[] args) {Outer05 outer =new Outer05();outer.test();}}class Outer05{public void test02(Father father){father.run();}public void test(){//匿名内部类,由于本内部类定义在方法中,也是方法内部类Runnable run = new Runnable(){@Overridepublic void run() {}};//匿名内部类,继承式Father father = new Father(){public void run(){System.out.println("子类");}};father.run();//参数式test02(new Father(){public void run(){System.out.println("参数式");}});}}class Father{public void run(){System.out.println("父类");}}
0 0