java使用内部类
⑴ java为什么要用内部类
1.内部类能访问外围类的所有成员,包括私有成员。
当生成一个内部类对象时,此对象与制造它的外围类对象之间就有了一种联系,所以它能访问其外围类对掘雹薯象的所有成肆和员,而不需要任何特殊的条件。如下面代码所示:
[java]view plain
classOutterClass{
privateinti=1;
classInnerClass{判者
publicvoiddisplayPrivate(){
System.out.println(i);
}
}
}
publicclassMainClass{
publicstaticvoidmain(String[]args){
OutterClassoutter=newOutterClass();
OutterClass.InnerClassinner=outter.newInnerClass();
inner.displayPrivate();
}
}
由上面的代码可以看出,内部类能够访问外部类的私有成员变量。在这段代码中,还需要注意的是
①生成内部类对象,必须要先有外围类对象,具体的做法请见代码;
②内部类能访问外围类的私有成员这一点,C++中的嵌套类是没有这个特性的。
2.内部类与static
①内部类不能含有static方法;
②内部类不能含有static数据成员,除非是static final;
③内部类可以继承含有static成员的类。
3.匿名内部类
匿名内部类,看起来非常奇怪。因为它太简洁了,但这也带来一个好处,用匿名内部类写出来的代码通常比较简洁啦!
⑵ 一个java内部类有几个分类
共有四种内部类,分别是:
1.常规内部类
2.静态内部类
3.局部内部类
4.匿名内部类
⑶ java的内部类与匿名内部类
public interface Contents {
int value();
}
激御public interface Destination {
String readLabel();
}
明则岩public class Goods {
private class Content implements Contents {
private int i = ;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
class TestGoods {
public static void main(String[] args) {
Goods p = new Goods();
Contents c = nt();
Destination d = p dest( Beijing );
}
}
在这个例子里类Content和GDestination被定义在了类Goods内部 并且分别有着protected和private修饰符来控制访问级别 Content代表着Goods的内容 而GDestination代表着Goods的目的地 它们分别实现了两个接口Content和Destination 在后面的main方法里 直接用 Contents c和Destination d进行操作盯物 你甚至连这两个内部类的名字都没有看见!这样 内部类的第一个好处就体现出来了——隐藏你不想让别人知道的操作 也即封装性
同时 我们也发现了在外部类作用范围之外得到内部类对象的第一个方法 那就是利用其外部类的方法创建并返回 上例中的cont()和dest()方法就是这么做的 那么还有没有别的方法呢?当然有 其语法格式如下
outerObject=new outerClass(Constructor Parameters);
outerClass innerClass innerObject=outerObject new InnerClass(Constructor Parameters);
注意在创建非静态内部类对象时 一定要先创建起相应的外部类对象 至于原因 也就引出了我们下一个话题——
非静态内部类对象有着指向其外部类对象的引用
对刚才的例子稍作修改
public class Goods {
private valueRate= ;
private class Content implements Contents {
private int i = *valueRate;
public int value() {
return i;
}
}
protected class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public Destination dest(String s) {
return new GDestination(s);
}
public Contents cont() {
return new Content();
}
}
修改的部分用蓝色显示了 在这里我们给Goods类增加了一个private成员变量valueRate 意义是货物的价值系数 在内部类Content的方法value()计算价值时把它乘上 我们发现 value()可以访问valueRate 这也是内部类的第二个好处——一个内部类对象可以访问创建它的外部类对象的内容 甚至包括私有变量!这是一个非常有用的特性 为我们在设计时提供了更多的思路和捷径 要想实现这个功能 内部类对象就必须有指向外部类对象的引用 Java编译器在创建内部类对象时 隐式的把其外部类对象的引用也传了进去并一直保存着 这样就使得内部类对象始终可以访问其外部类对象 同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因
有人会问 如果内部类里的一个成员变量与外部类的一个成员变量同名 也即外部类的同名成员变量被屏蔽了 怎么办?没事 Java里用如下格式表达外部类的引用
outerClass this
有了它 我们就不怕这种屏蔽的情况了
静态内部类
和普通的类一样 内部类也可以有静态的 不过和非静态内部类相比 区别就在于静态内部类没有了指向外部的引用 这实际上和C++中的嵌套类很相像了 Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上 当然从设计的角度以及以它一些细节来讲还有区别
除此之外 在任何非静态内部类中 都不能有静态数据 静态方法或者又一个静态内部类(内部类的嵌套可以不止一层) 不过静态内部类中却可以拥有这一切 这也算是两者的第二个区别吧
局部内部类
是的 Java内部类也可以是局部的 它可以定义在一个方法甚至一个代码块之内
public class Goods {
public Destination dest(String s) {
class GDestination implements Destination {
private String label;
private GDestination(String whereTo) {
label = whereTo;
}
public String readLabel() { return label; }
}
return new GDestination(s);
}
public static void main(String[] args) {
Goods g= new Goods ();
Destination d = g dest( Beijing );
}
}
上面就是这样一个例子 在方法dest中我们定义了一个内部类 最后由这个方法返回这个内部类的对象 如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部 就可以这样做 当然 定义在方法中的内部类可以使设计多样化 用途绝不仅仅在这一点
下面有一个更怪的例子
public class Goods {
private void internalTracking(boolean b) {
if(b) {
class TrackingSlip {
private String id;
TrackingSlip(String s) {
id = s;
}
String getSlip() { return id; }
}
TrackingSlip ts = new TrackingSlip( slip );
String s = ts getSlip();
}
}
public void track() { internalTracking(true); }
public static void main(String[] args) {
Goods g= new Goods ();
g track();
}
}
你不能在if之外创建这个内部类的对象 因为这已经超出了它的作用域 不过在编译的时候 内部类TrackingSlip和其他类一样同时被编译 只不过它由它自己的作用域 超出了这个范围就无效 除此之外它和其他内部类并没有区别
匿名内部类
java的匿名内部类的语法规则看上去有些古怪 不过如同匿名数组一样 当你只需要创建一个类的对象而且用不上它的名字时 使用内部类可以使代码看上去简洁清楚 它的语法规则是这样的
// 有点js中 return function(){ };的意思
new interfacename(){ }; 或 new superclassname(){ };
// 接口的名字或者父类的名字
下面接着前面继续举例子
public class Goods {
public Contents cont(){
return new Contents(){
private int i = ;
public int value() {
return i;
}
};
}
}
这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象 看上去的确十分简洁
在java的事件处理的匿名适配器中 匿名内部类被大量的使用 例如在想关闭窗口时加上这样一句代码
frame addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System exit( );
}
});
有一点需要注意的是 匿名内部类由于没有名字 所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类 创建它的时候必须带上这些参数 并在实现的过程中使用super关键字调用相应的内容) 如果你想要初始化它的成员变量 有下面几种方法
如果是在一个方法的匿名内部类 可以利用这个方法传进你想要的参数 不过记住 这些参数必须被声明为final
将匿名内部类改造成有名字的局部内部类 这样它就可以拥有构造函数了
在这个匿名内部类中使用初始化代码块
为什么需要内部类?
java内部类有什么好处?为什么需要内部类?
首先举一个简单的例子 如果你想实现一个接口 但是这个接口中的一个方法和你构想的这个类中的一个方法的名称 参数相同 你应该怎么办?这时候 你可以建一个内部类实现这个接口 由于内部类对外部类的所有内容都是可访问的 所以这样做可以完成所有你直接实现这个接口的功能
不过你可能要质疑 更改一下方法的不就行了吗?
的确 以此作为设计内部类的理由 实在没有说服力
lishixin/Article/program/Java/hx/201311/26601
⑷ Java,内部类有什么特别的好处吗
提起Java内部类(Inner Class)可能很多人不太熟悉明埋饥,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比。内部类从表面上看,就是在类中又定义了一个类(下文会看到,内部类可以在很多地方定义),而实际上并没有那么简单,乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显着,但是随着对它的深入了解,你会发现Java的设计者在内部类身上的确是用心良苦。学会使用内部类,是掌握Java高级编程的一部分,它可以让你更优雅地设计你的程序结构。下面从以下几个方面来介绍:
publicinterfaceContents{
intvalue();
}
publicinterfaceDestination{
StringreadLabel();
}
publicclassGoods{
{
privateinti=11;
publicintvalue(){
returni;
}
激返}
{
privateStringlabel;
privateGDestination(StringwhereTo){
label=whereTo;
}
publicStringreadLabel(){
returnlabel;
}
}
publicDestinationdest(Strings){
returnnewGDestination(s);
}
publicContentscont(){
returnnewContent();
}
}
classTestGoods{
publicstaticvoidmain(String[]args){
Goodsp=newGoods();
Contentsc=p.cont();
Destinationd=p.dest("Beijing");
}
}
在这个例子里类Content和GDestination被定义在了类Goods内部,并且分别有着protected和private修饰符来控制访问级别。Content代表着Goods的内容,而GDestination代表着Goods的目的地。它们分别实现了两个接口Content和Destination。在后面的main方法里,直接用 Contents c和Destination d进行操作,你甚至连这两个内部类的名字都没有看见!这样,内部类的第一个好处就体现出来了 隐藏你不想让别人知道的操作,也即封装性。
同时,我们也发现了在外部类作用范围之外得到内部类对象的第一个方法,那就是利用其外部类的方法创建并返回。上例中的cont()和dest()方法就是这么做的。那么还有没有别的方法呢?当然有,其语法格式如下:
outerObject=new outerClass(Constructor Parameters);
outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);
注意在创建非静态内部类对象时,一定要先创建起相应的外部类对象。至于原因,也就引出了我们下一个话题 非静态内部类对象有着指向其外部类对象的引用,对刚才的例子稍作修改:
publicclassGoods{
privateintvalueRate=2;
{
privateinti=11*valueRate;
publicintvalue(){
returni;
}
}
{
液告privateStringlabel;
privateGDestination(StringwhereTo){
label=whereTo;
}
publicStringreadLabel(){
returnlabel;
}
}
publicDestinationdest(Strings){
returnnewGDestination(s);
}
publicContentscont(){
returnnewContent();
}
}
在这里我们给Goods类增加了一个private成员变量valueRate,意义是货物的价值系数,在内部类Content的方法value()计算价值时把它乘上。我们发现,value()可以访问valueRate,这也是内部类的第二个好处 一个内部类对象可以访问创建它的外部类对象的内容,甚至包括私有变量!这是一个非常有用的特性,为我们在设计时提供了更多的思路和捷径。要想实现这个功能,内部类对象就必须有指向外部类对象的引用。Java编译器在创建内部类对象时,隐式的把其外部类对象的引用也传了进去并一直保存着。这样就使得内部类对象始终可以访问其外部类对象,同时这也是为什么在外部类作用范围之外向要创建内部类对象必须先创建其外部类对象的原因。
有人会问,如果内部类里的一个成员变量与外部类的一个成员变量同名,也即外部类的同名成员变量被屏蔽了,怎么办?没事,Java里用如下格式表达外部类的引用:
outerClass.this
有了它,我们就不怕这种屏蔽的情况了。
静态内部类
和普通的类一样,内部类也可以有静态的。不过和非静态内部类相比,区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套类很相像了,Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用这一点上,当然从设计的角度以及以它一些细节来讲还有区别。
除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。
局部内部类
是的,Java内部类也可以是局部的,它可以定义在一个方法甚至一个代码块之内。
publicclassGoods1{
publicDestinationdest(Strings){
{
privateStringlabel;
privateGDestination(StringwhereTo){
label=whereTo;
}
publicStringreadLabel(){
returnlabel;
}
}
returnnewGDestination(s);
}
publicstaticvoidmain(String[]args){
Goods1g=newGoods1();
Destinationd=g.dest("Beijing");
}
}
上面就是这样一个例子。在方法dest中我们定义了一个内部类,最后由这个方法返回这个内部类的对象。如果我们在用一个内部类的时候仅需要创建它的一个对象并创给外部,就可以这样做。当然,定义在方法中的内部类可以使设计多样化,用途绝不仅仅在这一点。
下面有一个更怪的例子:
publicclassGoods2{
privatevoidinternalTracking(booleanb){
if(b){
classTrackingSlip{
privateStringid;
TrackingSlip(Strings){
id=s;
}
StringgetSlip(){
returnid;
}
}
TrackingSlipts=newTrackingSlip("slip");
Strings=ts.getSlip();
}
}
publicvoidtrack(){
internalTracking(true);
}
publicstaticvoidmain(String[]args){
Goods2g=newGoods2();
g.track();
}
}
你不能在if之外创建这个内部类的对象,因为这已经超出了它的作用域。不过在编译的时候,内部类TrackingSlip和其他类一样同时被编译,只不过它由它自己的作用域,超出了这个范围就无效,除此之外它和其他内部类并没有区别。
匿名内部类
java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:
new interfacename(){......}; 或 new superclassname(){......};
下面接着前面继续举例子:
publicclassGoods3{
publicContentscont(){
returnnewContents(){
privateinti=11;
publicintvalue(){
returni;
}
};
}
}
这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象,看上去的确十分简洁。
在java的事件处理的匿名适配器中,匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码:
frame.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:
如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
在这个匿名内部类中使用初始化代码块。
为什么需要内部类?
java内部类有什么好处?为什么需要内部类?
首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口。由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能。
不过你可能要质疑,更改一下方法的不就行了吗?
的确,以此作为设计内部类的理由,实在没有说服力。
真正的原因是这样的,java中的内部类和接口加在一起,可以的解决常被C++程序员抱怨java中存在的一个问题 没有多继承。实际上,C++的多继承设计起来很复杂,而java通过内部类加上接口,可以很好的实现多继承的效果。
⑸ Java内部类有几种
Java中的几种内部类:
成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。当某个类除了他的外部类,不会被其他类使用时应该选择使用成员内部类。
局部内部类:局部内部类定义在外部类的某个代码块或方法块中。如果只会在某个方法或块中创建这个类的对象,就可以使用局部内部类。
匿名内部类:匿名内部类一般定义在需要传递接口或回调的的地方,一个匿名内部类一定是在new的后面,用其隐含实现一个接口或继承一个类。假如只需要创建这个类的一个对象不需要知道其实际类型(不需要使用到类名),那么就可以使用匿名内部类。
静态内部类:和成员内部类一样,作为外部类的一个成员存在,与外部类的属性、方法并列,只不过在声明类的时候加入了static关键字。有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类对象。这时可以使用静态内部类,以便取消产生对外部类的引用。
⑹ Java为什么要使用内部类
1.内部类提供进入其外围类的绿色通道;
2.一般来说,内部类继承自某个类或实现某个接口让改指,和接口一起实现java中多重继承;
3.private内部类给类的坦配设计者提供了一种途径,通过这种方式可以完全阻止任何依赖于类型的编码,并且完全隐藏了歼做实现的细节;
4.匿名内部类可以使得代码更加地灵活。
⑺ 使用内部类让Java实现“多继承”
使用内部类让Java实现 多继承
众所周知 Java没有像c++那样支持多继承 但是我们可以使用接口或内部类来模拟实现多继承
我们使用内部类来实现一个继承自消费者笑禅 又继承自生产者的派生类
实际上Java之所以设计出内部类这个概念 一方面是为了更好的封装性 另一方面就是借助内部类模拟实现多继承
首先我们定义一个消费者抽象基类
view plainprint?
/** * Consumer Class *@author androidyue *Last Modified 上午 */ public abstract class Consumer { protected float buyPrice protected abstract void buyGoods() }
迹升吵以下是生产者抽象基类
view plainprint?
/** * Procer Class *@author androidyue *Last Modified 上午 */ public abstract class Procer { protected float cost protected abstract void proce() }
使用内部类实现 多继承 的派生子类
view plainprint?姿侍
/** *Java实现 多继承
*@author androidyue *Last Modified 上午 */ public class InnerClassDemo extends Procer { private ConsumerBuyer buyer
public void desribeMySelf(){ System out println( 使用Java模拟多继承 ) this proce() this buyer=new ConsumerBuyer() this buyer buyGoods()
}
@Override protected void proce() { st= f System out println( 我是生产者 我以每件 +st+ RMB的成本生产一件产品 然后以 元价格对外出售 ) }
class ConsumerBuyer extends Consumer{
@Override protected void buyGoods() { this buyPrice= f System out println( 我是消费者 我以 +this buyPrice+ RMB 买了一件售价 元的商品 不信吧 因为我也是生产者!^_^ )
}
}
}
在程序入口调用
view plainprint?
/** * the entrance of application *@author androidyue *Last Modified 上午 */ public class AppMain { public static void main(String[] args){ InnerClassDemo demo=new InnerClassDemo() demo desribeMySelf() }
lishixin/Article/program/Java/hx/201311/25912
⑻ java中内部类
在java语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在其他类的内部。内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部类的数据和方法。只不过相比较外部类只有public和默认的修饰符不同,内部类作为一个成员,可以被任意修饰符修饰。编译器在编译时,内部类的名称为OuterClass$InnerClass.class 。
1、内部类访问数据变量
当在某些时候,内部类中定义的变量与外部类中变量名称相同时,如何确保正确地访问每一个变量呢?
1.1在main中直接从外部类调用内部类的方法
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
System.out.println(this); // the object created from the Inner
System.out.println(Outer.this); // the object created from the Outer
System.out.println(index); // output is 30
System.out.println(this.index); // output is 20
System.out.println(Outer.this.index); // output is 10
}
}
void print()
{
Inner inner = new Inner();//得到内部类的引用
inner.print();
}
}
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
outer.print();
}
}
在这里内部类Inner中关键字this指向内部类Inner的对象,如果要想指向外部类的对象,必须在this指针前加上外部类名称,表示this是指向外部类构造的碎屑,如Outer.this 。
1.2在main中显式返回内部类引用
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
}
Inner getInner()
{
return new Inner();//返回一个内部类的引用
}
}
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.getInner();
inner.print();
}
}
Inner是Outer的内部类,所以在类Test中必须用属性引用符来标识出内部类。
1.3当main方法在Outer类内部
class Outer
{
private int index = 10;
class Inner
{
private int index = 20;
void print()
{
int index = 30;
System.out.println(index);
System.out.println(this.index);
System.out.println(Outer.this.index);
}
}
Inner getInner()
{
return new Inner();//返回一个内部类的引用
}
public static void main(String[] args)
{
Outer outer = new Outer();
Inner inner = outer.getInner(); // 注意此处变化
inner.print();
}
}
因为main方法在Outer内部,故可以直接引用,不需要属性引用符。
1.4在main方法中直接产生内部类对象
class Test
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); // 注意此处变化
inner.print();
}
}
在利用new构造方法构造一个外部类对象时,并没有连带着构造一个内部类对象,故需要访问内部类方法时,必须使用new操作符为这个外部类对象再构造一个内部类对象。
2、局部内部类
在方法中定义的内部类是局部内部类,它只能访问方法中的final类型的局部变量,因为用final定义的局部变量相当于是一个常量,延长了其生命周期,使得方法在消亡时,其内部类仍可以访问该变量。另外,它同样也可以引用定义在外部类的变量和方法。而且方法体中的局部内部类不允许有访问修饰符。
class Outer
{
int num=10;
public void print(final int aArgs)
{
class Inner
{
int num=20;
public Inner()
{
System.out.println("This is Inner.");//此句可看出它与匿名内部类用法的不同。
}
public void print()
{
int num=30;
System.out.println(this); // the object created from the local Inner
System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
System.out.println(aArgs);
}
}
Inner inner=new Inner();//此句必须放在定义类Inner的后面
inner.print();
}
public static void main(String[] args)
{
Outer outer=new Outer();
outer.print(40);
}
}
对于局部类的命名,不管是在一个方法中定义多个类还是在几个方法中分别定义类,其编译后命名是:OuterClass$1InnerClass.class
3、匿名内部类
匿名内部类作为一种特殊的内部类,除了具有普通内部类的特点,还有自己的一些独有特性:
匿名内部类必须扩展一个基类或实现一个接口,但是不能有显式的extends和implements子句;
匿名内部类必须实现父类以及接口中的所有抽象方法;
匿名内部类总是使用父类的无参构造方法来创建实例。如果是实现了一个接口,则其构造方法是Object();
匿名内部类编译后的命名为:OuterClass$n.class,其中n是一个从1开始的整数,如果在一个类中定义了多个匿名内部类,则按照他们的出现顺序从1开始排号。
abstract class A
{
abstract public void sayHello();
}
class Outer
{
public static void main(String[] args)
{
new Outer().callInner(new A()
{
public void sayHello()
{
System.out.println(this); // the object created from the anonymous Inner
System.out.println("Hello!");
}
});
}
public void callInner(A a)
{
a.sayHello();
}
}
4、静态内部类
和非静态内部类相比,区别就在于静态内部类没有了指向外部类的引用。除此之外,在任何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套可以不止一层)。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。一个静态的内部类,才可以声明一个static成员,静态内部类可以访问外围类的静态方法、成员(包括private static的成员)。静态内部类实例化的时候不必先实例化外围类,可以直接实例化内部类。而对于非静态内部类则必须先实例化其外部类,才能再实例化本身。
5.内部类的继承
当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:
class WithInner
{
class Inner
{
public void sayHello()
{
System.out.println("Hello.");
}
}
}
public class Test extends WithInner.Inner
{
Test(WithInner wi)
{
wi.super();
}
public static void main(String[] args)
{
WithInner wi=new WithInner();
Test test=new Test(wi);
test.sayHello();
}
}
因为每一个内部类都有一个指向外部类的引用,在继承一个内部类,必须先创建一个外部类,通过这个外部类引用来调用其内部类的构造方法。如果继承的内部类是一个静态内部类,则就不需要这样,直接super()调用即可;
6、内部类的2种特殊用法
一个类从另一个类派生出来,又要实现一个接口。但在接口中定义的方法与父类中定义的方法的意义不同,则可以利用内部类来解决这个问题。
interface Machine
{
void run();
}
class Person
{
void run()
{
System.out.println("run");
}
}
class Robot extends Person
{
private class MachineHeart implements Machine
{
public void run()
{
System.out.println("heart run");
}
}
Machine getMachine()
{
return new MachineHeart();
}
}
class Test
{
public static void main(String[] args)
{
Robot robot = new Robot();
Machine m = robot.getMachine();
m.run();
robot.run();
}
}
在Robot类内部使用内部类MachineHeart来实现接口Machine的run方法。同时Robot类又继承了父类Person的run方法。如果不使用内部类MachineHeart而使Robot直接实现接口Machine,则该如何调用父类的run方法?
利用内部类可解决c++中多重继承所解决的问题
class A
{
void fn1()
{
System.out.println("It' s fn1.");
}
}
abstract class B
{
abstract void fn2();
}
class C extends A
{
B getB()
{
return new B()
{
public void fn2()
{
System.out.println("It' s fn2.");
}
};
}
}
class Test
{
public static void main(String[] args)
{
C c = new C();
c.fn1();
c.getB().fn2();
}
}
类C既要继承类A又要继承类B,则可将类B的定义放入类C内部,使之成为内部类。
一般情况下 当我们需要在某一情形下实现一个接口,而在另一情形下又不需要实现这个接口时,我们可以使用内部类来解决这一问题。让内部类来实现这个接口。另外一个很好的理由是java内部类加上接口可以有效地实现多重继承。
⑼ Java 语言中使用内部类有什么好处
一个类,要实现两个接口,分别是接口A和接口B,接口A和接口B都有一个名字一样的方法f();
此时就可以使用内部类实现接口B,外部类实现接口A。写程序的时候内部类使用还是比较少的,这里只是举个例子而已.内部类的用法还有很多,一般来说,内部类继承自某个类或实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口!
⑽ java内部类怎么使用
1.内部类的方法可以访问它所在的外部类中的所有域,包括私有型别的;
2.对于同一个包中的其它类它是隐藏的;
3. 匿名的内部类可以让我们很方便的定义事件响应(call back),这在GUI编程中很常见
interface OutInterface{ //定义一个接口 public void f(); } public class InterfaceInner { //主类 public static void main(String args[]){ OuterClass2 out=new OuterClass2(); OutInterface outinter=out.doit(); outinter.f(); } } class OuterClass2{ //定义一个内部类,并且接口OutInterface private class InnerClass implements OutInterface{ InnerClass(String s){ System.out.println(s); } public void f(){ System.out.println("访问内部类中的f()方法"); } } public OutInterface doit(){ //方法返回接口 return new InnerClass("访问内部类构造方法"); } }