Java基础总结

来源:互联网 发布:sdrsharp linux 编辑:程序博客网 时间:2024/05/16 12:43
Java基础总结 - 内部类
这篇文章只是把大学记的笔记整理到博客,方便自己查看,不保证权威性(•̀ᴗ•́)و ̑̑
1.内部类种类

1.成员内部类:类(外部类)中直接定义的内部类

1.成员内部类

2.静态成员内部类

2.方法内部类:在一个方法中定义的内部类

3.匿名内部类:(我认为这个也可以算一种方法内的类)

2.成员内部类

作为外部类的一个成员存在,与外部类的属性、方法并列。

1.成员内部类:

需要外部类对象才能实例化,可以通过 外部类名.this.外部类成员

成员内部类可以访问外部类的静态与非静态成员,而自己只能声明非静态成员(对外啥都行,对内不行)

class Testin {private String s ="这是外部类实例变量";private static String s1="这是外部类静态变量";class B{//private static String s1="papapa";报错private  String s1="papapa";public void go(){System.out.println("这是内部类B的go方法"+s1);System.out.println("这是内部类B的go方法"+Testin.this.s);System.out.println("这是内部类B的go方法"+Testin.this.s1);}} }public class Test {    public static void main(String[] args) {           (new Testin()).new B().go();//需要外部对象创建内部对象    }}/*      这是内部类B的go方法papapa      这是内部类B的go方法这是外部类实例变量      这是内部类B的go方法这是外部类静态变量*/
2.静态成员内部类:

不需要需要外部类对象实例化,可以通过 外部类名.外部类成员
成员内部类可以访问外部类的非静态成员,而自己只能声明静态和非静态成员(对外不行,对内啥都行)

class Testin {      private String s ="这是外部类实例变量";      private static String s1="这是外部类静态变量";      static class B{          private static String s="papapa";          private  String s1="papapa";          public void go(){              System.out.println("这是内部类B的go方法"+s);              System.out.println("这是内部类B的go方法"+s1);              //System.out.println("这是内部类B的go方法"+Testin.this.s);报错              System.out.println("这是内部类B的go方法"+Testin.s1);          }      }         }  public class 括号匹配 {      public static void main(String[] args) {             new Testin.B().go();//需要外部对象创建内部对象      }  }  /*     这是内部类B的go方法papapa     这是内部类B的go方法papapa     这是内部类B的go方法这是外部类静态变量 */  

3.局部内部类

作为方法局部变量存在,不能被public, protected, private和static修饰,只能访问方法中定义的final类型的局部变量(原因在最后)。

public class Test { private String s ="全局变量";final String s1 ="全局final变量";final int n=4;public void method(){final String s2 ="局部final变量";//方法内的变量只有final变量才能被方法内部类访问String s3 = "局部变量";class B{public void show(){System.out.println(s);System.out.println(s1);System.out.println(s2);//System.out.println(s3);报错}}new B().show();    }    public static void main(String[] args) {new Test().method();    }}/* 全局变量全局final变量局部final变量*/
4.匿名内部类

它也是在方法中使用,所以我喜欢把它也归在局部内部类里面...他是在我们new 对象时,new接口或者抽象类,然后直接在{}块里重写抽象方法,这样的类没有名字且只使用这一次,23点了代码就偷下懒就不贴了。我们创建线程时常用。

5.为什么局部内部类和匿名内部类需要用到的外部变量得用final修饰

因为其实内部类和外部类编译之后,实际上是生成了两个.class文件, 一个out.class 一个out$inner.class,那内部类如何访问外部类成员呢?其实内部类实际上保存了一个外部内的引用,可以反编译内部类class文件看,当(局部内部类和匿名内部类)使用外部类成员变量或者方法局部变量时,会有方法内修改了外部类成员变量或者方法局部变量,而(局部内部类和匿名内部类)并不能获取到修改情况,反之亦然,会导致外部与局部之间变量值的不匹配,所以干脆简单粗暴的要求必须是final的,谁都别想改。

原创粉丝点击