Inner class与匿名类相关问题汇总

1)如果存在3个类,一个是普通类A其中有个方法a(),接口B有个方法a(),这时,当类C既继承A又实现B的时候,会出现方法混乱现象。这样的情况在编译器中是不允许存在的。


2)内部类中无法定义static静态块。


3)匿名类对于接口的实现才有存在的实际价值,但是对于普通类,如果通过匿名类对其进行继承,顶多只是对现有类的复写,由于在向上转型的过程中会对实现类的接口按照父类的方法进行窄化处理,因此,即便匿名类对父类进行了功能的扩充,但事实上这些扩充的方法根本是没有机会使用到的。如果出现需要在匿名类对父类进行扩充的情况,可视情况将其定义成新独立类或者内部类。并且应该考虑类的命名以及方法的命名是否存在问题。


4)Inner class可以被protected、private、static甚至final进行修饰,但是,如果一个Inner class被修饰为一个final类型时,那么他就无法再进行派生子类

以下代码仅供参考:

java 代码
  1. package interfaceandinnerclass;   
  2.   
  3. public class FriendFatherImpl implements FriendFather, FriendFatherOther {   
  4.   
  5.     public void test() {   
  6.     }   
  7.   
  8.     protected static class A {   
  9.         void a() {   
  10.             System.out.println("A is called");   
  11.         }   
  12.   
  13.         void x() {   
  14.             System.out.println("XX is called");   
  15.         }   
  16.     }   
  17.   
  18.     private class B extends A {   
  19.         public B(){}   
  20.         void b() {   
  21.             System.out.println("A is called");   
  22.         }   
  23.     }   
  24.   
  25.     private interface C {   
  26.         void c();   
  27.     }   
  28.   
  29.     private interface D {   
  30.         void d();   
  31.   
  32.         void x();   
  33.     }   
  34.   
  35.     //  public abstract class S extends B implements C,D{   
  36.     //  }   
  37.     public static C mytest() {   
  38.         System.out.println("FriendFatherImpl is called");   
  39.         return new C() {   
  40.             public void c() {   
  41.                 System.out.println("C is called");   
  42.             }   
  43.         };   
  44.     }   
  45.     public static B myTest(){   
  46.         FriendFatherImpl friendFatherImpl=new FriendFatherImpl();   
  47.         return friendFatherImpl.new B(){   
  48.             public void first(){System.out.println("first is called");}   
  49.             public void second(){System.out.println("second is called");}   
  50.             public void thrid(){System.out.println("thrid is called");}   
  51.             public void fourth(){System.out.println("fourth is called");}   
  52.         };   
  53.     }   
  54.     public static void main(String[] args) {   
  55.         C c = mytest();   
  56.         c.c();   
  57.         B b=myTest();   
  58.         b.a();   
  59.         b.b();   
  60.         b.x();   
  61.     }   
  62. }   

 

注:请注意其中绿色注释部分:

java 代码
  1. //  public abstract class S extends B implements C,D{   
  2. //  }  

这段代码事实上是无法编译通过的,之所以放在这里,主要是为了说明第一点问题。

 

备注:此文档在9月将一直处于维护状态。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值