Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2218字,纯文字阅读大概需要4分钟。
内容图文
声明:本博客为原创博客。未经同意,不得转载。原文链接为 http://blog.csdn.net/bettarwang/article/details/27012421。
我们都知道。非静态内部类能够訪问外部类的私有成员(包含私有变量和方法),这也正是使用非静态内部类与普通类的一个重要差别:非静态内部类是依赖于外部类对象而存在的,这样的依赖就包含它要能自由地訪问外部类对象的全部成员(由于private成员都能够訪问了,其它权限的成员更不在话下。只是一般来说一个内部类仅仅会訪问外部类的部分成员而不是全部)。比方心脏作为单独的一个类存在可能没有太大的意义,它必须依附于详细的Person对象存在才有意义。并且心脏它要能够自由地訪问Person对象的一些成员,如血液、营养等。
显然,外部类对于非静态内部类而言是全然透明的。可是实际上,外部类与非静态内部类的还有一个特征尽管不经常使用。却也值得注意,那就是非静态内部类事实上跟外部类的其它成员相似。仅仅是它的一个成员而已,因而即使非静态内部类的修饰符为private、即使非静态内部类的构造器修饰符为private,外部类也能够新建非静态内部类的对象。例如以下例所看到的:
import java.util.*;
class Car
{
private float gasAmount;
private String gasType;
public Car(float gasAmount,String gasType)
{
this.gasAmount=gasAmount;
this.gasType=gasType;
new Engine();
}
private void print(String msg)
{
System.out.println(msg);
}
private class Engine
{
private int rotateSpeed;
private Engine()
{
if(gasType=="93#"&&gasAmount>0)
{
rotateSpeed=1500;
print("Gas amount is "+String.valueOf(gasAmount)+" gallon now.Engine starts successfully");
}
else if(gasType=="93#"&&gasAmount<=0)
{
rotateSpeed=0;
print("Engine starts failed! Please add fuel first!");
}
else
{
rotateSpeed=0;
print("Gas type is not correct!");
}
}
}
}
public class OuterSample
{
public static void main(String[]args)
{
new Car(2.0f,"93#");
new Car(0.0f,"93#");
}
}
输出结果例如以下图所看到的:
显然,由输出结果可看出:第一。尽管非静态内部类的修饰符和构造器均为private,可是外部类仍然能够创建内部类对象。第二,非静态内部类能够使用外部类的private成员(如此处的private成员变量gasType及gasAmount);
还有一个经常被人忽略的地方是:在外部类的方法中,也能够通过创建非静态内部类的对象来訪问内部类包含private成员在内的全部成员,只是注意必须是外部类的实例成员才行,而不能在外部类的静态成员(包含静态方法和静态初始化块)中使用非静态内部类。原因非常easy:非静态内部类可看作是外部类的一个实例成员。而静态成员不能訪问实例成员。
内容总结
以上是互联网集市为您收集整理的Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“全部内容,希望文章能够帮你解决Java中内部类揭秘(一):外部类与非静态内部类的”相互可见性“所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。