`

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

    博客分类:
  • J2SE
阅读更多

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月将一直处于维护状态。

分享到:
评论

相关推荐

    Java中inner_class内部类

    1. 对于成员内部类和静态嵌套类,可以通过`new OuterClass().new InnerClass()`或`OuterClass.InnerClass inner = new OuterClass().new InnerClass();`来实例化。 2. 局部内部类和匿名内部类只能在定义它们的方法...

    匿名类/内部类/本地类 解读

    在Java编程语言中,匿名类...总结来说,匿名类主要用于简洁地实现接口或继承类,而内部类和本地类则提供了更复杂的封装和访问能力。在实际开发中,我们需要根据需求选择合适的类定义方式,以实现最佳的代码组织和复用。

    Java内部类(innerclass).docx

    内部类主要有两种类型:静态嵌套类(Static Nested Class)和非静态嵌套类(通常称为内部类,Inner Class)。 1. **静态嵌套类**: - 静态嵌套类通过`static`关键字声明,它们不直接与外部类的实例关联,而是像...

    内部类和匿名类大汇总

    例如,`InnerClass` 示例展示了如何使用匿名内部类来实现 `MouseListener`,以便在鼠标点击时更新文本框的内容。 总结来说,内部类和匿名类是Java中提高代码效率和模块化的强大工具。内部类可以封装复杂逻辑,提供...

    Java中的内部类和匿名类

    第二种方法是使用 outerObject.new InnerClass(Constructor Parameters) 语法格式创建非静态内部类对象。在创建非静态内部类对象时,一定要先创建起相应的外部类对象。 非静态内部类对象的特点 非静态内部类对象...

    内部类的相关知识-静态内部类,匿名内部类……

    ### 内部类的相关知识-静态内部类,匿名内部类…… #### 一、内部类概述 内部类(Inner Class)是 Java 中一种特殊类的定义方式,它允许在一个类的内部定义另一个类。这种设计模式提供了更为灵活的编程机制,可以...

    Android开发导入项目报错Ignoring InnerClasses attribute for an anonymous inner class的解决办法

    在Android开发过程中,有时会遇到导入项目时出现错误警告,比如"Ignoring InnerClasses attribute for an anonymous inner class"。...同时,保持对ProGuard规则的深入理解和适时调整也是避免这类问题的重要手段。

    java使用匿名类直接new接口.docx

    - **匿名内部类(Anonymous Inner Class)**: - 匿名内部类是在创建对象时没有明确给出类名的一种特殊类形式。 - 它通常用于创建接口或者抽象类的一个实例,而这个实例仅在当前作用域内使用。 - 匿名内部类可以...

    java面试问题汇总

    3. 匿名内部类(Anonymous Inner Class): - 匿名内部类是没有名称的内部类,通常用于简短的、一次性的实现,如事件监听器或回调接口。 - 匿名内部类可以继承一个类(但只能继承一个类)或实现一个或多个接口。 ...

    JAVA语法总结 - 内部类

    4. **匿名内部类**(Anonymous Inner Class) 这些内部类之间存在一些共性: - **编译后的文件格式**:内部类最终会被编译成独立的`.class`文件,文件名通常为外部类名称加上`$`符号和内部类名称。 - **访问控制**...

    Java匿名类,匿名内部类实例分析

    Java匿名类和匿名内部类实例分析 Java中的匿名类和匿名内部类是一种特殊的类,它们没有明确的名称,但它们可以继承父类的方法,访问外部类的成员变量和方法,并且可以重写父类的方法。下面将对Java中的匿名类和匿名...

    内部类介绍

    对于一个名为`OuterClass`的外部类和一个名为`InnerClass`的内部类,编译后会产生两个文件:`OuterClass.class`和`OuterClass$InnerClass.class`。其中`$`符号用于区分内部类与其外部类。 总结来说,内部类在Java中...

    Java语法总结 - 内部类

    成员内部类可以使用final、abstract、public和private四种修饰符,它们的作用与普通类的修饰符相同。 静态嵌套类 静态嵌套类是指使用static关键字定义的内部类。静态嵌套类不能访问外部类的非静态成员变量和方法,...

    Java内部类

    内部类分为两种主要类型:成员内部类(也称为静态内部类或非静态内部类)和局部内部类(包括匿名内部类)。此外,还有特殊的静态内部类。 #### 二、成员内部类 成员内部类是在外部类的一个成员位置上定义的类。...

    java内部类1

    这打破了传统的类与类之间完全独立的关系,使得内部类可以访问外部类的所有成员,包括私有(private)成员,而外部类只能通过内部类的实例来访问内部类的公共成员。 非静态内部类是内部类的一种形式,它与外部类有...

    全面了解Java中的内部类和匿名类

    创建静态内部类的实例不需要外部类的实例,可以直接通过`outerClass.InnerClass instance = new outerClass.InnerClass()`的方式创建。 匿名内部类是另一种特殊的内部类,它没有名称,通常用于快速实现接口或抽象类...

    java中的抽象类,接口和内部类 PPT

    - 匿名内部类:没有名称的内部类,通常用于快速实现简单的接口或抽象类。 - 静态内部类:可以独立于外部类的实例存在,但仍然保持对外部类的访问权限。 例如,一个包含成员内部类的例子: ```java class ...

    JAVA程序员面试32问

    OuterClass.InnerClass inner = outer.new InnerClass(); ``` - **Static Nested Class**:静态嵌套类(有时称为静态内部类)是一种特殊的内部类,它是用static关键字定义的。这意味着它不依赖于外部类的实例。...

    局部内部类和匿名内部类使用局部变量为什么要final1

    总结来说,局部内部类和匿名内部类只能访问final或等效final的局部变量,这是为了保证代码的可读性和内存管理的正确性。通过使用final关键字,我们可以确保内部类所使用的变量在创建后不会被意外地修改,从而避免了...

Global site tag (gtag.js) - Google Analytics