java中inner的用法_Java——内部类(inner class)

packagecy.内部类.静态内部类;public classStaticOuter {private static String name = "Outer";private int age = 10;public static classStaticInner {

@SuppressWarnings("unused")private static String name = "Inner";public voidsayOuterName() {

System.out.println("inner:" +StaticOuter.name);

}/** 错误,静态内部类不能访问外部类的非静态成员。

public void sayOuterAge() {

System.out.println(age);

}*/}public voidsayName() {

System.out.println(name);

}public voidsayAge() {

System.out.println(age);

}

}

packagecy.内部类.静态内部类;public classTestMain {public static voidmain(String[] args) {

StaticOuter staticOuter= newStaticOuter();

staticOuter.sayAge();

staticOuter.sayName();

StaticOuter.StaticInner staticInner= newStaticOuter.StaticInner();

staticInner.sayOuterName();

}

}

运行结果:

10

Outer

inner:Outer

由此可以看出,静态内部类的对象处了没有对外围类对象的应用特权外,与其他所有内部类完全一样。

成员内部类member inner class

packagecy.内部类.成员内部类;public classOuter {private static String name = "Outer";private int age = 10;public classInner {private final static String name = "Inner";private int age = 11;public voidsayOuterName() {//内部类中引用外部类对象的静态成员

System.out.println("inner:" +Outer.name);

}public voidsayInnerName() {

System.out.println("inner:" +Inner.name);

}public voidsayInnerAge() {

System.out.println("inner:" + this.age);

}public voidsayOuterAge() {//内部类中引用外部类对象的非静态成员

System.out.println(Outer.this.age);

}publicOuter createOuter() {//内部类中创建外部类。

return newOuter();

}

}public voidsayName() {

System.out.println(name);

}public voidsayAge() {

System.out.println(age);

}publicInner createInner() {//外部类中创建内部类对象。

return this.newInner();

}

}

public classTestMain {public static voidmain(String[] args) {

Outer outer= newOuter();

outer.sayAge();

outer.sayName();//区别于静态内部类的创建方法

Inner inner = outer.newInner();

inner.sayOuterName();

}

}

运行结果:

10

Outer

inner:Outer

局部内部类local inner class

局部类不能用public,protected或者private访问说明符进行声明。它的作用域是被限定在这个局部类的块中。

局部类有一个优势,即对外世界可以完全隐藏起来,其他类中的代码不能访问它。

packagecy.内部类.局部内部类;public classOuter {private static String name = "Outer";private int age = 10;public voiddoSomeThing() {//局部内部类,局部内部类,不允许带有 public,protected,private//public class Inner {//protected class Inner {//private class Inner {

classInner {//private static String name;//private final static String name;

public voidsayInnerName() {

System.out.println(name);

}public voidsayOuterName() {

System.out.println(Outer.name);

}

}

Inner inner= newInner();

inner.sayInnerName();

inner.sayOuterName();

}public voiddoSomeThingA() {if (this.age > 0) {//这个Inner与上一个Inner没有任何关系

classInner {public voidsayInnerName() {

System.out.println(name);

}public voidsayOuterName() {

System.out.println(Outer.name);

}

}

Inner inner= newInner();

inner.sayInnerName();

inner.sayOuterName();

}

}public voidsayName() {

System.out.println(name);

}public voidsayAge() {

System.out.println(age);

}

}

匿名内部类anonymous inner class

假设这创建某个类的一个对象,就不必命名了,这种类成为“匿名内部类”。

packagecy.内部类.匿名内部类;public classOuter {public static voidmain(String[] args) {//内部类引用外部类对象,使用final。

final String name = "name";//接口直接创建对象。类名称并没有直接定义。Java编译器会自动给一个类名称。//注意匿名内部类的重要使用场景。“线程”

Say s = newSay() {

@Overridepublic voidsay() {

System.out.println("hello world " +name);

}

};

s.say();

}

}interfaceSay {voidsay();

}

这种语法有点难理解,它的含义是:创建一个实现Say接口的类的新对象,需要实现的方法say定义在{}中。

由于构造器的名字必须跟类名相同,而匿名类没有名称,所以匿名类不能有构造器。取而代之的是,构造器参数传递给超类(superclass)构造器。尤其是在内部类实现接口的时候,不能有任何构造参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值