什么是内部类
一个类定义在另一个类中,就称为内部类。内部类可以调用外嵌类的所有成员,不需要任何条件
class PlanManageGUI{
class EndTime implements KeyListener{
//
}
}
内部类有以下几个特点:
1、内部类任然是一个独立的类,在编译之后,会生成独立的class文件,但是前面会有外嵌类的类名和$符号。
2、内部类不能用普通的方式来访问,内部类的外嵌类的一个成员,因此内部类可以无限制的访问外嵌类的成员,无论他是否为private。
3、如果内部类声明成static,则只能访问外嵌类的static成员。
内部类的种类:
1、成员内部类(定义在类中的内部类)
class Outer{
class Inner{
//
}
}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
2、方法内部类(类定义在方法中)
class Outer {
public void doSomething(){
class Inner{
public void seeOuter(){
}
}
}
}
方法内部类,只能在定义该类的方法中被实例化,方法外无法实例化;方法内部类无法使用该方法的非final局部成员变量。
因为方法的局部变量位于栈上,只存在于该方法的生命期内。当一个方法结束,其栈结构被删除,局部变量成为历史。但是该方法结束之后,在方法内创建的内部类对象可能仍然存在于堆中!例如,如果对它的引用被传递到其他某些代码,并存储在一个成员变量内。正因为不能保证局部变量的存活期和方法内部类对象的一样长,所以内部类对象不能使用它们。
public class InnerClassDemo {
public void doSomething(){
final int a=10;
int b=10;//非final,系统会报错
class Inner{
public void seeOuter(){
System.out.println(a);
//Cannot refer to a non-final variable b inside an inner class
//defined in a different method
//System.out.println(b);
}
}
Inner in=new Inner();
in.seeOuter();
}
public static void main(String[] args){
new InnerClassDemo().doSomething();
}
}
2、匿名内部类(没有名字的内部类)
匿名内部类就是没有名字的内部类。什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
~只用到类的一个实例。
~类在定义后马上用到。
~类非常小(SUN推荐是在4行代码以下)。
~给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
~匿名内部类不能有构造方法。
~匿名内部类不能定义任何静态成员、方法和类。
~匿名内部类不能是public,protected,private,static。
~只能创建匿名内部类的一个实例。
~一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
~·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
A:继承式的内部类
public class InnerClassDemo {
String aName="sevend";
public void drive(){
System.out.println(aName+"Driving a car");
}
public static void main(String[] args){
InnerClassDemo car=new InnerClassDemo(){
//只能override subclass的method
public void driv(){
//此处继承了subclass的variable
System.out.println(aName+"Driving a new car");
}
public void ride(){
System.out.println(aName+"riding a bike");
};
};
//car.driv();//The method driv() is undefined for the type InnerClassDemo
car.drive();//调用的方法可定是override之后的方法
//car.ride();//The method ride() is undefined for the type InnerClassDemo
}
}
B:接口是的匿名内部类
interface Vehicle{
public void drive();
}
public class InnerClassDemo {
public static void main(String[] args){
Vehicle v=new Vehicle(){//接口式的匿名类其实是实现了这个接口,而且只能实现一个接口
public void drive(){//没有implement,而是直接实现了这个接口的drive方法
System.out.println("Driving a car");
}
};
v.drive();
}
}
接口式的匿名内部类是实现了一个接口的匿名类。而且只能实现一个接口。
C:参数式的匿名内部类
class Bar{
public void doStuff(Foo f){
};
}
interface Foo{
void foo();
}
public class InnerClassDemo {
static void go(){
Bar b=new Bar();
b.doStuff(new Foo(){
public void foo(){
System.out.println("foo");
}
});
}
}
3、静态嵌套类
静态内部类中可以定义静态或者非静态的成员。
从技术上讲,静态嵌套类不属于内部类。因为内部类与外部类共享一种特殊关系,更确切地说是对实例的共享关系。而静态嵌套类则没有上述关系。它只是位置在另一个类的内部,因此也被称为顶级嵌套类。
静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类不能访问外部类的成员和方法。
class Outer{
static class Inner{
public void say(){
System.out.println("I'm inner");
}
}
}
public class InnerClassDemo {
public static void main(String[] args){
Outer.Inner n=new Outer.Inner();
n.say();
}
}
为什么需要内部类
典型的情况是,内部类继承自某个类或实现某个接口,内部类的代码操作创建其的外围类的对象。所以你可以认为内部类提供了某种进入其外围类的窗口。使用内部类最吸引人的原因是:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。从这个角度看,内部类使得多重继承的解决方案变得完整。接口解决了部分问题,而内部类有效地实现了“多重继承”。
分享到:
相关推荐
Java内部类是Java言语的一个很重要的概念,《Java编程思想》花了很大的篇幅来讲述这个概念。但是我们在实践中很少用到它,虽然我们在很多时候会被动的使用到它,但它仍然像一个幕后英雄一样,不为我们所知,不为我们...
java内部类详解
Java内部类总结 学习java的资源
从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论。其实任何优秀的语言特性用得不好就是滥用,内部类用得不好就会导致代码像迷宫一样,导致出现毫无重用的综合征。...本文档讲述Java内部类的规则及应用
12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类.zip12.java内部类...
这里是自己对java内部类整理的一篇文章,有可执行的源代码
java内部类使用例子,可以运行
谈Java内部类的四个应用场景
java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用java 内部类应用
Java 的使用 分别介绍了 成员内部类、方法内部类、静态内部类
Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类Java内部类
java 内部类 实例内部类 局部内部类 匿名类 静态内部类 实例代码
详细介绍JAVA内部类的用法,用途,基本语法,及匿名类用法
Java内部类的作用
JAVA内部类的一些总结
对内部类不错的讲解,以及如何应用并且还帮你归了类,不错的选择
Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;Java 干货之深入理解Java内部类;
java基础java内部类