“Java内部类”总结

内部类:
将相关的类组织在一起,降低了命名空间的混乱,它是定义在小于一个包的范围内。
内部类可以定义在另外一个类里面,可以定义在一个方法里面,甚至可以作为一个表达式的一部分。

Java里面共有四种内部类:

1、静态内部类(static inner class): 只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为: OuterClass.InnerClass inner = new OuterClass.InnerClass();
它是定义在一个类的里面,而且这个类是由一个static关键字修饰的。

2、成员内部类(member inner class): 可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为: OuterClass.InnerClass inner = new OuterClass().new InnerClass();
它是定义在一个类的里面,但是没有static关键字修饰。
在一个外部类当中创建一个内部类的实例(例如在外部类里面定义的一个方法里面创建成员内部类的实例):this.new Innerclass();
在一个外部类的外面创建一个内部类的实例(例如在不是外部类的另一个类里面创建成员内部类的实例):(new Outerclass()).new Innerclass();
若想在局部成员内部类中访问外部类的成员变量,语法为:OuterClass.this.a;

3、局部内部类(Local inner class): 定义在方法当中,只能访问方法中声明的final类型的变量。像一个局部变量一样,不能被声明为一个public、protected、private、static的。【用的很少】

4、匿名内部类(Anonymous Inner Class):[color=red]匿名内部类会隐式地继承一个父类或实现一
个接口[/color]。它是一个没有名字的局部内部类,也没有关键字class,也没有关键字extends和implements,也没有构造方法。【用的比较多】


下面是各种内部类相关的一些实例:

package com.shengshiyuan.innerclass;

class StaticInner {
private static int a = 4;

/**
* 静态内部类,必须有static关键字修饰(static关键字不能修饰外部类,它也不可能去修饰外部类。static要想修饰类,只能修饰静态内部类)
* 类: Inner <br>
* 描述: TODO <br>
* 作者:
* 时间: Nov 6, 2013 7:38:41 PM
*/
public static class Inner {
public void test() {
System.out.println(a);
}
}
}

public class StaticInnerclassTest {
public static void main(String[] args) {
// 生成内部类的对象只能从外部类一层层深入去引用它去生成对象,不能直接写内部类
StaticInner.Inner inner = new StaticInner.Inner();
inner.test();
}
}


package com.shengshiyuan.innerclass;

class MemberInner {
private int a = 4;

/**
* 成员内部类
* 类: Inner2 <br>
* 描述: TODO <br>
* 作者:
* 时间: Nov 6, 2013 7:57:02 PM
*/
public class Inner2 {
private int a = 5;

public void doSomething() {
// 就近原则,访问类内部的变量
System.out.println(a);
// 这种情况下访问外部类的成员变量的方式
System.out.println(MemberInner.this.a);
}
}

public void method() {
// 在这里创建成员内部类实例的方式
Inner2 inner2 = this.new Inner2();
}
}

public class MemberInnerclassTest {
public static void main(String[] args) {
// 注意成员内部类生成对象的方式
MemberInner.Inner2 inner2 = new MemberInner().new Inner2();
inner2.doSomething();
}
}


package com.shengshiyuan.innerclass;

import java.util.Date;

public class AnonymousInnerclassTest {

@SuppressWarnings("deprecation")
public String get(Date date) {
return date.toLocaleString();
}

public static void main(String[] args) {
AnonymousInnerclassTest test = new AnonymousInnerclassTest();
// String str = test.get(new Date());
// System.out.println(str);
/**
* 匿名内部类
* 1、这里表示我自己定义了一个匿名的内部类
* 2、我自己定义的这个匿名的内部类它继承了Date这个类
* 3、它继承完之后重写了Date类里面的toLocalString()方法
* 4、注意:这里调用get方法的时候传递的不是一个Date类型的实例,而是传递的是这里定义的这个内部类(Date类的一个子类)的一个实例
*/
String str = test.get(new Date() {
public String toLocaleString() {
return "hello world";
}
});
System.out.println(str);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值