java内部类
2015-11-01 10:21
501 查看
java内部类分类:成员内部类,方法内部类,静态内部类,匿名内部类
因为内部类是外部类的一部分,它的访问级别和外部类的方法和变量是一样的,因此内部类可以自由的访问外部类的成员。
静态内部类,如同静态函数一样,它只能访问外部类的静态成员变量
同时大家切记没有静态外部类这么一说。
![](https://img-blog.csdn.net/20151101101502098)
参考链接
成员内部类
![](https://img-blog.csdn.net/20151101102217687)
那现在有个问题,如果一个内部类被声明为private,我们可以在外部类中访问内部类的成员吗?
![](https://img-blog.csdn.net/20151101102950951)
虽然内部类声明为了private ,内部类的成员也声明为了private,但是我们依旧可以在外部类中访问内部类的静态成员变量。因此得出一个结论[b]外部类和内部类并没有java常见的访问限制(private,默认,protected,public)[/b]
#
先在这里留下一些疑问,内部类是否可以被其他的访问,如果可以,那又是什么样的访问形式?
方法内部类
![](https://img-blog.csdn.net/20151101105310743)
注意两点:
1成员变量只可以在方法内部实例化,不可以在方法外部实例化
2方法内部类对象只能使用该内部类所在方法的final局部变量。
这个解释需要大家对jvm的内存模型有一定的了解:
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
同样注意方法中的变量不可以使用static
![](https://img-blog.csdn.net/20151101110619405)
方法内部类访问final变量
![](https://img-blog.csdn.net/20151101111031266)
匿名内部类
匿名内部类顾名思义:就是没有名字的内部类。或者说那个表面上的名字并不是的它的名字。
这里很重要, 匿名内部类的名字都是父类的名字,因此有时会就会出现接口的名字
![](https://img-blog.csdn.net/20151101191152724)
匿名内部类的引用范围:
1你现在需要立即用到一个类的实例
2匿名内部类的代码很短,一般不要超过四行(sun的建议)
匿名内部类的注意事项:
1匿名内部类不能有构造方法
2不能有静态成员
静态嵌套类
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
内部类的共性:
内部类是一个类,因此在编译之后会生成一个.class文件,只不过类的名称前面会有外部类名和$符号。因为内部类是外部类的一部分,它的访问级别和外部类的方法和变量是一样的,因此内部类可以自由的访问外部类的成员。
静态内部类,如同静态函数一样,它只能访问外部类的静态成员变量
同时大家切记没有静态外部类这么一说。
public static class StaticTest{ }
参考链接
成员内部类
public class Out{ class In{ } }
那现在有个问题,如果一个内部类被声明为private,我们可以在外部类中访问内部类的成员吗?
public class Out{ public static void main(String[] argv){ Out out=new Out(); out.out(); } public void out(){ In in=new In(); System.out.print(in.num); } private class In{ private int num=100; } }
虽然内部类声明为了private ,内部类的成员也声明为了private,但是我们依旧可以在外部类中访问内部类的静态成员变量。因此得出一个结论[b]外部类和内部类并没有java常见的访问限制(private,默认,protected,public)[/b]
#
先在这里留下一些疑问,内部类是否可以被其他的访问,如果可以,那又是什么样的访问形式?
方法内部类
public class OutMethod{ public void out(){ class MethodIn{ public void show(){ System.out.print("hello"); } } MethodIn in=new MethodIn(); in.show(); } public static void main(String[] argv){ OutMethod out=new OutMethod(); out.out(); } }
注意两点:
1成员变量只可以在方法内部实例化,不可以在方法外部实例化
2方法内部类对象只能使用该内部类所在方法的final局部变量。
这个解释需要大家对jvm的内存模型有一定的了解:
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
同样注意方法中的变量不可以使用static
public class MethodStatic{ public void out(){ static int a=5; } }
方法内部类访问final变量
public class OutMethod{ public void out(){ final String str="world"; class MethodIn{ public void show(){ System.out.print("hello "+str); } } MethodIn in=new MethodIn(); in.show(); } public static void main(String[] argv){ OutMethod out=new OutMethod(); out.out(); } }
匿名内部类
匿名内部类顾名思义:就是没有名字的内部类。或者说那个表面上的名字并不是的它的名字。
new ParentName(){ }
这里很重要, 匿名内部类的名字都是父类的名字,因此有时会就会出现接口的名字
public class Car{ public void drive(){ System.out.println("Driving a car"); } public static void main(String[] argv){ Car myCar=new Car(){ public void drive(){ System.out.println("Driving myCar"); } }; myCar.drive(); } }
匿名内部类的引用范围:
1你现在需要立即用到一个类的实例
2匿名内部类的代码很短,一般不要超过四行(sun的建议)
匿名内部类的注意事项:
1匿名内部类不能有构造方法
2不能有静态成员
静态嵌套类
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
class InOut{ static class In{ void show(){ System.out.println("hello"); } } } public class Test{ public static void main(String[] argv){ InOut.In in=new InOut.In(); in.show(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统