Java基础总结
来源:互联网 发布:sdrsharp linux 编辑:程序博客网 时间:2024/05/16 12:43
Java基础总结 - 内部类
这篇文章只是把大学记的笔记整理到博客,方便自己查看,不保证权威性(•̀ᴗ•́)و ̑̑
1.内部类种类
1.成员内部类:类(外部类)中直接定义的内部类
1.成员内部类
2.方法内部类:在一个方法中定义的内部类2.静态成员内部类
3.匿名内部类:(我认为这个也可以算一种方法内的类)
2.成员内部类
作为外部类的一个成员存在,与外部类的属性、方法并列。
1.成员内部类:
需要外部类对象才能实例化,可以通过 外部类名.this.外部类成员
成员内部类可以访问外部类的静态与非静态成员,而自己只能声明非静态成员(对外啥都行,对内不行)
2.静态成员内部类: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方法这是外部类静态变量*/不需要需要外部类对象实例化,可以通过 外部类名.外部类成员
成员内部类可以访问外部类的非静态成员,而自己只能声明静态和非静态成员(对外不行,对内啥都行)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的,谁都别想改。
阅读全文
0 0
- 【总结】Java基础总结⑵
- 【总结】Java基础总结⑶
- 【总结】Java基础总结⑷
- 【总结】Java基础总结⑸
- 【总结】Java基础总结⑹
- 【总结】Java基础总结⑺
- java基础的总结
- java基础总结知识点
- JAVA基础总结
- java基础总结
- Java基础小小总结
- Java基础概念总结
- Java语言基础总结
- java基础总结
- Java基础学习总结
- java基础总结
- java 基础语法总结
- java基础--线程总结
- 用Python实现概率编程与贝叶斯推断
- javaFX使用synchronized(obj)导致的一个异常
- LINUX(2)
- Serializable接口官方doc
- 洛伦兹力实验------阴极射线管在磁场中的偏转
- Java基础总结
- 从关系型数据库到非关系型数据库
- RecyclerView中单个item里面的子视图的点击监听
- 欢迎使用CSDN-markdown编辑器
- zab协议流程图总结
- 切换效果
- annaconda python 和Ubuntu根目录中Python并存下cannot import _caffe,不能make pycaffe的解决办法。
- Atcoder CODE FESTIVAL 2017 qual C D
- 数据库表快速更新