java的内部类有什么作用和特点

 我来答
samismiling
推荐于2017-10-05 · 知道合伙人软件行家
samismiling
知道合伙人软件行家
采纳数:1340 获赞数:5603

向TA提问 私信TA
展开全部
Java中的内部类共分为四种:
  静态内部类static inner class (also called nested class)
  成员内部类member inner class
  局部内部类local inner class
  匿名内部类anonymous inner class

静态内部类Static Inner Class
  最简单的内部类形式。
  类定义时加上static关键字。
  不能和外部类有相同的名字。
  被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。
  只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
  生成静态内部类对象的方式为:
  OuterClass.InnerClass inner = new OuterClass.InnerClass();
示例代码:
package com.learnjava.innerclass;
class StaticInner
{
private static int a = 4;
// 静态内部类
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();
}
}

成员内部类Member Inner Class
  成员内部类也是定义在另一个类中,但是定义时不用static修饰。
  成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。
  成员内部类就像一个实例变量。
  它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
  在外部类里面创建成员内部类的实例:
  this.new Innerclass();
  在外部类之外创建内部类的实例:
  (new Outerclass()).new Innerclass();
  在内部类里访问外部类的成员:
  Outerclass.this.member
示例代码:
package com.learnjava.innerclass;
class MemberInner
{
private int d = 1;
private int a = 2;
// 定义一个成员内部类
public class Inner2
{
private int a = 8;
public void doSomething()
{
// 直接访问外部类对象
System.out.println(d);
System.out.println(a);// 直接访问a,则访问的是内部类里的a
// 如何访问到外部类里的a呢?
System.out.println(MemberInner.this.a);
}
}
}
public class MemberInnerClassTest
{
public static void main(String[] args)
{
// 创建成员内部类的对象
// 需要先创建外部类的实例
MemberInner.Inner2 inner = new MemberInner().new Inner2();
inner.doSomething();
}
}

局部内部类Local Inner Class
  局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
  像局部变量一样,不能被public, protected, private和static修饰。
  只能访问方法中定义的final类型的局部变量。
  局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
示例代码:
package com.learnjava.innerclass;
class LocalInner
{
int a = 1;
public void doSomething()
{
int b = 2;
final int c = 3;
// 定义一个局部内部类
class Inner3
{
public void test()
{
System.out.println("Hello World");
System.out.println(a);
// 不可以访问非final的局部变量
// error: Cannot refer to a non-final variable b inside an inner
// class defined in a different method
// System.out.println(b);
// 可以访问final变量
System.out.println(c);
}
}
// 创建局部内部类的实例并调用方法
new Inner3().test();
}
}
public class LocalInnerClassTest
{
public static void main(String[] args)
{
// 创建外部类对象
LocalInner inner = new LocalInner();
// 调用外部类的方法
inner.doSomething();
}

}

匿名内部类Anonymous Inner Class
  匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements, 没有构造方法。
  匿名内部类隐式地继承了一个父类或者实现了一个接口。
  匿名内部类使用得比较多,通常是作为一个方法参数。
  生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。
示例代码:
package com.learnjava.innerclass;
import java.util.Date;
public class AnonymouseInnerClass
{
@SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args)
{
AnonymouseInnerClass test = new AnonymouseInnerClass();
// 打印日期:
String str = test.getDate(new Date());
System.out.println(str);
System.out.println("----------------");
// 使用匿名内部类
String str2 = test.getDate(new Date()
{
});// 使用了花括号,但是不填入内容,执行结果和上面的完全一致
// 生成了一个继承了Date类的子类的对象
System.out.println(str2);
System.out.println("----------------");
// 使用匿名内部类,并且重写父类中的方法
String str3 = test.getDate(new Date()
{
// 重写父类中的方法
@Override
@Deprecated
public String toLocaleString()
{
return "Hello: " + super.toLocaleString();
}
});
System.out.println(str3);
}
}
spell413
2012-12-21 · TA获得超过2577个赞
知道大有可为答主
回答量:3115
采纳率:0%
帮助的人:1294万
展开全部
给你举个例子,你看看如果不用内部类实现起来要麻烦多少,还有封装性的问题。import java.io.bufferedreader;保证内部类与外部类的同步 synchronized(mutex){try{mutex.wait();}catch(interruptedexception e){e.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
samletwu
2012-12-20
知道答主
回答量:53
采纳率:0%
帮助的人:29.7万
展开全部
变量域比较特别
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
8206GD
推荐于2017-10-02 · TA获得超过1.2万个赞
知道大有可为答主
回答量:5520
采纳率:65%
帮助的人:4553万
展开全部
内部类分为: 成员内部类、静态嵌套类、方法内部类、匿名内部类。
(1)、内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。
(2)、内部类不能用普通的方式访问。内部类是外部类的一个成员,因此内部类可以自由地访问外部类的成员变量,无论是否是private的。
(3)、内部类声明成静态的,就不能随便的访问外部类的成员变量,仍然是只能访问外部类的静态成员变量。

参考资料: http://baike.baidu.com/view/7942850.htm

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式