jav内部类

1. 普通内部类
•普通内部类的一个最简单的例子:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
// 外部类
class OutterClass {
// 内部类
public class InnerClass {
private int i = 0;
public int getInt(){
return i;
}
}
public void proc(){
InnerClass inClass = new InnerClass();
System.out.println(inClass.getInt());
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.proc();
}
}
•外部类可以访问内部类的私有成员,内部类也可以访问外部类的私有成员:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mOut = 10;
// 内部类
public class InnerClass {
private int mIn = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(mOut);
}
}
public void printInPrivate(){
InnerClass inClass = new InnerClass();
// 直接打印内部类的私有成员
System.out.println(inClass.mIn);
}
public void printOutPrivate(){
InnerClass inClass = new InnerClass();
inClass.printOutPrivate();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
outClass.printInPrivate();
outClass.printOutPrivate();
}
}
•如果外部类的成员变量与内部类的成员变量名字相同,当内部类要访问外部类的该成员时,可以使用“OutClass.this.mem”来区分:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}
•要创建普通内部类,必须先创建相应的外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.new InnerClass();
inClass.printOutPrivate();
}
}
也可以用下面的方式:


view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 10;
// 内部类
public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 直接打印外部类的成员
System.out.println(OutterClass.this.mMem);
}
}
public InnerClass newInnerClass() {
return new InnerClass();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
OutterClass.InnerClass inClass = outClass.newInnerClass();
inClass.printOutPrivate();
}
}
2. 静态内部类
普通内部类前面加上static修饰符,就成为静态内部类,静态内部类类似于C++的嵌套类,与普通内部类相比有如下区别:
•静态内部类没有指向外部类的引用,外部类对于它来说更像一个名字空间。
•普通内部类不能有静态成员,静态方法,或另一个静态内部类;而静态内部类可以有这一切。
•静态内部类可以直接创建,不必先创建外部类:
view plaincopy to clipboardprint?
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
// 外部类
class OutterClass {
private int mMem = 0;
// 静态内部类
static public class InnerClass {
private int mMem = 0;
public void printOutPrivate(){
// 这是错误的
// System.out.println(OutterClass.this.mMem);
}
}
public void printInPrivate() {
InnerClass inClass = new InnerClass();
// 可以直接访问静态内部类的成员
System.out.println(inClass.mMem);
}
}
public class Main {
public static void main(String[] args) {
// 直接创建静态内部类
OutterClass.InnerClass inClass = new OutterClass.InnerClass();
inClass.printOutPrivate();
}
}
从上面描述可以看出,静态内部类与一般类没有太大区别,只不过它是放在一个类的里面,这个类相当于它的名字空间,可以防止命名冲突。
3. 局部内部类
Java可以把一个类定义在一个方法里面,甚至是一个{}块里面,它的作用域就在这个块里面:

view plaincopy to clipboardprint?
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
// 外部类
class OutterClass {
public void testLocalInner() {
if (true)
{
class LocalInner {
public void proc() {
System.out.println("hello");
}
}
// 可以创建使用
LocalInner localInner = new LocalInner();
localInner.proc();
}
// 错误:超出类定义的作用域
LocalInner localInner = new LocalInner();
localInner.proc();
}
}
局部内部类的一般用途是实现某个接口,并作为这个接口传出方法被使用:

view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}

// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
// 接口
interface Talker {
public void Talk();
}

// 外部类
class OutterClass {
public Talker getTalker() {
// 现实该接口的局部内部类
class SomeTalker implements Talker {
public void Talk() {
System.out.println("hello");
}
}
// 创建类实例并作为Talker返回
SomeTalker talker = new SomeTalker();
return talker;
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
Talker talker = outClass.getTalker();
talker.Talk();
}
}
4. 匿名内部类
匿名内部类的语法如下:

view plaincopy to clipboardprint?
new InterfaceName(){......}; 或 new SuperclassName(){......};
new InterfaceName(){......}; 或 new SuperclassName(){......};

它被认为是InterfaceName的实现者,或是SuperclassName的继承类,匿名内部类没有构建函数,如果SuperclassName有带参数的构造函数,必须在创建匿名内部类时带上这些参数,下面是匿名内部类最常见的使用场合:

view plaincopy to clipboardprint?
// 接口
interface Talker {
public void Talk();
}

// 外部类
class OutterClass {
public void Talk(Talker talker) {
talker.Talk();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
// 直接生成一个匿名内部类
outClass.Talk(new Talker(){
public void Talk() {
System.out.println("hello");
}
});
}
}
// 接口
interface Talker {
public void Talk();
}

// 外部类
class OutterClass {
public void Talk(Talker talker) {
talker.Talk();
}
}

public class Main {
public static void main(String[] args) {
OutterClass outClass = new OutterClass();
// 直接生成一个匿名内部类
outClass.Talk(new Talker(){
public void Talk() {
System.out.println("hello");
}
});
}
}


本文来自CSDN博客:http://blog.csdn.net/linzhengqun/archive/2011/03/24/6275586.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值