Java 基础 - 静态内部类 vs 非静态内部类

回到顶部(go to top)

内部类分类

 

匿名内部类

特点:

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

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

 

静态内部类

1
如果一个类要被声明为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

 

回到顶部(go to top)

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

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

 

【必看】代码演示

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

  • OuterClass.NestedStaticClass
  • OuterClass.InnerClass

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* 下面程序演示如何在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();
    }
}

  

 

posted on   frank_cui  阅读(330)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2019-03-07 SQL Server - case when...then...else...end
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

levels of contents
点击右上角即可分享
微信分享提示