在成员内部类中要注意两点

第一:成员内部类中不能存在任何static的变量和方法;

第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类。

接下来是两个例子(关键字:.this .new 内部类隐藏)

[.this] 用于内部类生成[对当前创建该内部类的外部类对象]的引用

[.new] 用于必须使用外部类的对象来创建内部类对象的场合

 class Test001Sub {
public Test001Sub(String s) {
System.out.println(s);
} void f() {
System.out.println("Test001->f()");
} // 一个内部类
public class Test001Inner {
public Test001Sub callOuter() {
return Test001Sub.this;
}
}
} public class Test001 {
public static void main(String[] args) {
Test001Sub t1 = new Test001Sub("new Test001"); // new Test001
Test001Sub.Test001Inner t1Inner = t1.new Test001Inner();
Test001Sub t2 = t1Inner.callOuter();
t2.f(); // Test001->f()
System.out.println(t1.equals(t2)); // true
}
}

protected及private的访问规则依然适用于内部类,外部通过引用不能访问protected及private对象(内部类隐藏)。

可以在外部类内部创建getInstance()方法获得内部类对象。一般推荐这种方法来创建内部类对象。

 interface Contents {
int value();
} interface Destination {
String readLabel();
} class Test002Sub {
protected class Test002Inner1 implements Destination {
private String s; private Test002Inner1(String s) {
this.s = s;
} @Override
public String readLabel() {
return s;
}
} private class Test002Inner2 implements Contents {
private int i = 11; @Override
public int value() {
return i;
}
} public Test002Inner1 instanceInner1(String s) {
return new Test002Inner1(s);
} public Test002Inner2 instanceInner2() {
return new Test002Inner2();
}
} public class Test002 {
public static void main(String[] args) {
Test002Sub test002 = new Test002Sub();
Destination test002Impl1 = test002.instanceInner1("Test002Inner1");
Contents test002Impl2 = test002.instanceInner2();
System.out.println(test002Impl1.readLabel()); // Test002Inner1
System.out.println(test002Impl2.value()); // 11
// 外部通过引用不能访问protected及private对象
// Test002Sub.Test002Inner1 a = test002.new Test002Inner1("a");
// Test002Sub.Test002Inner2 b = test002.new Test002Inner2();
}
}

Java内部类(2):普通的成员内部类的更多相关文章

  1. java 内部类2(成员内部类)

    成员内部类: 特点:在其所在的外部类,的成员函数中,的类. 难点:看注释(涉及到jvm) /*test()执行完毕时,x2从内存中消失,inner的声明周,比x2长,inner还在访问,给人的感觉好像 ...

  2. java内部类和匿名内部类

    内部类即是包含在类里面的又一个类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.clas ...

  3. java java 内部类

    java 内部类 一.java内部类: java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性: (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.c ...

  4. 【转】Java 内部类总结

    Java内部类 一. 含义 在Java编程语言里,程序是由类(class)构建而成的.在一个类的内部也可以声明类,我们把这样的类叫做内部类. 二. 作用 实现了更好的封装,我们知道,普通类(非内部类) ...

  5. Java内部类小程序(成员内部类,静态内部类,匿名内部类)

    /** * 测试java内部类(成员内部类,静态内部类,匿名内部类) * 局部内部类不常用,就不写了. * @package :java05 * @author shaobn * @Describe ...

  6. JAVA内部类有关

    最近在看单例模式的实现,看到有一种利用JAVA静态内部类的特性来实现,对于内部类我还真是不了解,遂了解了一下,代码贴上. /** * 内部类分为:成员内部类.局部内部类.匿名内部类和静态内部类. */ ...

  7. Java内部类详解

    Java内部类详解 说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉.原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法.今天我们就 ...

  8. [转] Java内部类详解

    作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置 ...

  9. Java内部类的一些总结

    作为刚入门Java的小白,这两天看到内部类,这里做一个总结,若有错误,欢迎指正~ 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类分为: 成员内部类.局部内部类.静态嵌套类. ...

  10. Java内部类的使用小结

    转载:http://android.blog.51cto.com/268543/384844/ Java内部类的使用小结 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可 ...

随机推荐

  1. c#客户端自动更新模块

    一.概述 将需要更新的文件上传到服务器端,然后客户端从服务器下载更新文件并覆盖本地文件. 二.功能模块 1.将更新文件放入指定文件夹,检测更新,生成更新配置文件,并上传到服务器 2.获取服务器的更新配 ...

  2. 点击a链接防止滚动条滚动

    href="javascript:void(0)"而不是 href="#"

  3. 冒泡排序Bubble_Sort

    基本原理:对于冒泡排序来说,基本思想是从第一个元素开始,数组中的数据依次和它后面相邻的数据进行比较,即1和2比较,2和3比较,a和a+1比较,直到倒数第二位和倒数第一位的比较,如果顺序不对就进行交换, ...

  4. HDU 6052 - To my boyfriend | 2017 Multi-University Training Contest 2

    说实话不是很懂按题解怎么写,思路来源于 http://blog.csdn.net/calabash_boy/article/details/76272704?yyue=a21bo.50862.2018 ...

  5. linux 下python进程查看及关闭

    查看进程 ps -ef |grep python 关闭进程 kill -9 26879 其中26879为进程号. linux下后台执行某个python脚本 nohup python -u xxx.py ...

  6. 【ArcCatalog】

    1.添加文件夹链接文件夹链接的添加删除操作 2.新建/删除数据库(1)新建个人地理数据库(.mdb)(2)新建文本地理数据库(.gdb) 3.新建/删除要素数据集(1)要素数据集属性: 常规--XY坐 ...

  7. Laravel中Contracts的理解和使用

    Laravel 的 Contracts 是一组定义了框架核心服务的接口.说白了就是一组接口.使用它就是为了降低耦合性. 即便如此,是不是也有同学会搞不清楚Contracts在lavarel体系中的到底 ...

  8. Ecplilse使用

    0 注意版本 新版本对JDK的支持是有限的,如果Ecplise版本过高,而JDK版本低的话可能会不支持JDK 1.快捷键 右键-->source中可快速生成get set  重写方法 2.Deb ...

  9. Linux之动态库

    命令规则 lib + 名字 + .so 制作步骤 1)生成与位置无关的代码(生成与位置无关的代码) 2)将.o打包成共享库(动态库) 发布和使用共享库 动态库运行原理: 生成动态库: gcc -fPI ...

  10. [Shell]常用语法

    赋值 FILE=$1 //=两边不能有空格 echo $FILE 逻辑判断 表达式 .if [ expression ]; then ... fi //[]两边必须有空格 . if [[ expres ...