zoukankan      html  css  js  c++  java
  • Java 基础

    内部类分类

    匿名内部类

    特点:

    • 仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。
    • jdk1.8之前,当匿名内部类所在的方法的形参需要被匿名内部类里面使用时,该形参必须为final。原因:匿名内部类使用所在方法的变量时,是拷贝引用,并不是眼见的同一个变量。为了避免引用值发生改变,例如被外部类的方法修改等,而导致内部类得到的值不一致,于是用final来让该引用不可改变。故如果定义了一个匿名内部类,并且希望它使用一个其外部定义的参数,那么编译器会要求该参数引用是final的。
    • 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。

    详细请见:https://www.cnblogs.com/chenssy/p/3390871.html

    静态内部类

    如果一个类要被声明为static的,只有一种情况,就是静态内部类。
    

    java允许我们在一个类里面定义静态类。比如内部类(nested class)。把nested class封闭起来的类叫外部类。在java中,我们不能用static修饰顶级类(top level class)。只有内部类可以为static。因此,java中可以有

    • 静态实例变量
    • 静态方法
    • 静态块
    • 静态内部类 Static Nested Class 

    详细请见:https://www.cnblogs.com/chenssy/p/3390871.html

    成员内部类

     详细请见:https://www.cnblogs.com/chenssy/p/3390871.html

    局部内部类 

     详细请见:https://www.cnblogs.com/chenssy/p/3390871.html

    静态内部类 vs 非静态内部类

    1. 内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。
    2. 非静态内部类能够访问外部类的静态和非静态成员。静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。
    3. 一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。

    【必看】代码演示

    以下代码中,静态内部类 NestedStaticClass 和 非静态内部类 InnerClass 均是 public,因此可以在main函数里使用

    • OuterClass.NestedStaticClass
    • OuterClass.InnerClass

    如果这两个内部类被定义为private,就会编译报错。关于访问权限修饰符,请参考这里:Java 基础 - public、protected、friendly、private区别

    /* 下面程序演示如何在java中创建静态内部类和非静态内部类 */
    class OuterClass{
       private static String msg = "GeeksForGeeks";
    
       // 静态内部类
       public static class NestedStaticClass{
    
           // 静态内部类只能访问外部类的静态成员
           public void printMessage() {
    
             // 试着将msg改成非静态的,这将导致编译错误 
             System.out.println("Message from nested static class: " + msg); 
           }
        }
    
        // 非静态内部类
        public class InnerClass{
    
           // 不管是静态方法还是非静态方法都可以在非静态内部类中访问
           public void display(){
              System.out.println("Message from non-static nested class: "+ msg);
           }
        }
    } 
    
    class Main
    {
        // 怎么创建静态内部类和非静态内部类的实例
        public static void main(String args[]){
    
           // 创建静态内部类的实例
           OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass();
    
           // 创建静态内部类的非静态方法
           printer.printMessage();   
    
           // 为了创建非静态内部类,我们需要外部类的实例
           OuterClass outer = new OuterClass();        
           OuterClass.InnerClass inner  = outer.new InnerClass();
    
           // 调用非静态内部类的非静态方法
           inner.display();
    
           // 我们也可以结合以上步骤,一步创建的内部类实例
           OuterClass.InnerClass innerObject = new OuterClass().new InnerClass();
    
           // 同样我们现在可以调用内部类方法
           innerObject.display();
        }
    }
    

      

  • 相关阅读:
    86. Partition List
    2. Add Two Numbers
    55. Jump Game
    70. Climbing Stairs
    53. Maximum Subarray
    64. Minimum Path Sum
    122. Best Time to Buy and Sell Stock II
    以场景为中心的产品设计方法
    那些产品经理犯过最大的错
    Axure教程:如何使用动态面板?动态面板功能详解
  • 原文地址:https://www.cnblogs.com/frankcui/p/12433741.html
Copyright © 2011-2022 走看看