Java 静态内部类与非静态内部类 学习记录.

目的

  为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填。于是就会有这篇文章啦。

  常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方。

注意

  这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习。Java语法知识其实是很复杂很容易错的,特别是在细节方面。所以我的观点可能会有各种错误。

  另外我的JDK版本是1.7。JDK1.8的版本貌似对内部类的规则有一些修改,所以请大家注意。

非静态非匿名内部类

不能拥有static成员

网上大部分文章的说法大致是这样的,就是告诉你这种内部类不能拥有static的方法,属性。其实这句话有那么点小问题。非静态内部类也可以拥有static的属性的(static区块不行),但是要求这个static属性必须是常量,这个地方经过我的研究,我觉得和 “调用类的static属性,但却不会初始化这个类的static区块和其他static变量” 有点相似。什么意思?就是说

1 class Outter{
2     class Inner{
3         final static int a = 9;
4     }
5 }

这样是没有编译错误的。要求静态变量a必须是final类型的,且是基本类型,且是字面值

1 class Outter{
2     class Inner{
3         final static int a = get();
4     }
5
6     static int get(){
7         return 1;
8     }
9 }

这样就会报错,因为a不是字面值。

这里我想请大家看一下我的另外一篇学习记录,这种变量是不会触发类初始化的。

地址:http://www.cnblogs.com/abcwt112/p/4567332.html 分析标题下面的第二小点。

当然,这种字面值貌似没什么卵用啊。。。。所以说这种内部类不能有static成员大致上好像也算对吧。。

为什么不能拥有static成员?

我觉得道理是这样的(个人理解)。非静态的内部类是和普通成员一样的,是隶属于外部类对象的,创建这种内部类对象需要先创建外部类对象。也就是说这种内部类是不能单独于外部类对象存在的。这个道理大家都明白,一个成员变量怎么能脱离于类的对象独立存在呢。那假设这种内部类可以拥有static的属性,比如static int a = 1;那这个a数据存在哪里呢?根据前面的分析,应该是存在于分配给外部类对象拥有的内存中的,那么等外部类对象呗销毁以后,这个a分配的内存也会被销毁。这样的话修改这个a毫无意义,因为每次都是重新分配内存,每次值都是1。所以这个static没什么用,并不是全局的。

这个问题我是这么理解的。我觉得等我看完JVM虚拟机(我觉得有可能final static int与static int变量值存的地方可能不一样)或者学习汇编(可以观察数据是怎么存储的)以后再看它可能会有更深的理解。

静态内部类

只能调用外部类的静态方法与属性

这点蛮好理解,就像静态方法main里不能调用非静态的属性,方法一样。但是这并不代表静态内部类就不能定义 非静态的方法和属性。它不能调用外部类的非静态的成员,但是却可以在自己内部定义。毕竟它是个类。。。。

 1 public class StaticTest {
 2     static int a = 9;
 3
 4     private static class Inner{
 5         public static void main(String[] args) {
 6             System.out.println(StaticTest.a);
 7         }
 8
 9         public void doSomething(){
10
11         }
12     }
13     public static class Inner2{
14     }
15 }

这里代码就没有什么问题,能编译通过(doSomething方法)。

用途(废话)

  静态内部类是没有指向外部类的引用的,所以说它和外部类并没有什么关系,因此,即使没有外部类的对象,也可以直接创建静态内部类的对象。但是我觉得如果是这样使用的话,那完全没必要把类弄成静态内部的,直接创建外部类一般的类就OK了。所以说静态内部类肯定有它自己独特的作用。既然是个内部类,我觉得应该会声明成private,不然还不如创建一个外部类呢。。。。那private static的class有啥用处呢?我也不清楚。。。现在我唯一觉得有用的地方就是可以把测试代码main方法写在里面。因为是private的类,外接不能调用它,也就不能调用写的main函数了。。但是如果只是测试的话可以使用junit test呀。。。不可能为了测试就准们搞这么一个语法。。。这点值得日后研究,等我代码看得多了,说不定会有新体会。

时间: 2024-10-18 07:04:18

Java 静态内部类与非静态内部类 学习记录.的相关文章

静态内部类和非静态内部类的区别

静态内部类和非静态内部类的区别: 1. 静态内部类不持有外部类的引用 在普通内部类中,可以直接访问外部类的属性.方法,即使是private类型也可以,这是因为内部类持有外部类的引用,可以自由访问.而静态内部类只能访问外部类的静态方法和静态属性,如果是private也能访问,其他则不能访问. 2. 静态内部类不依赖外部类 普通内部类与外部类之间是相互依赖关系,内部类实例不能脱离外部类实例,也就是说他们会同生共死,一起声明,一起被垃圾回收.而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还

《java入门第一季》之面向对象静态内部类和非静态内部类的区别

很感谢在内部类章节,"开心阳"先生给与的建议.使用静态内部类.这里就简单说一下静态内部类的使用. package com.devin; public class MyMain{ private static String name = "woobo"; private String num = "X001"; // 静态内部类可以用public,protected,private修饰 static class Person { // 静态内部类中

静态内部类与非静态内部类之间的访问

package cn.hncu.day3.inner; public class Outer { private int size; public void aa(){ size++; System.out.println(size); } public void bb(){ //共用this对象,不需要另外再new一个Outer对象去调用aa() aa(); //相当于this.aa(); } //非静态的内部类1---演示一个非静态内部类的基本用法 //可理解为外部类的一个成员,跟一个方法一

java String部分源码学习记录

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /**char数组用于字符的存储 */ private final char value[]; /** 缓存string的hash码 */ private int hash; // Default to 0 public String() {/**无参构造函数,打印值为""*/ this.

黑马程序员——————&gt;非静态内部类

------- android培训.java培训.期待与您交流! ---------- 大部分时候,类被定义成一个独立的程序单元.在某些情况下,也会把一个类放在另一个人类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类,内部类主要有如下作用: 1:内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. 2:内部类成员可以直接访问外部类的私有数据,因为内部类被当成其成员,同一个类的成员之间可以互相访问.但外部类不能访问内部类的实现细

java笔记--匿名内部类和静态内部类的理解和使用

匿名内部类 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3889467.html  "谢谢-- 1.由于局部内部类并不可见,因此不如使用匿名内部类替代. 只有当需要定义或重写类的构造方法,或者需要多个类的对象时,才建议使用局部内部类.2.由于构造方法必须与类名相同,而匿名内部类没有类名,因此不能为其定义构造方法. 如果程序代码非常简单,则使用匿名内部类会使结构比价清晰.反之则不推荐使用匿名内部类.3.匿名内部类常用于Swing中

Java内部类(4):静态内部类&amp;接口内部类

使用static修饰的内部类我们称之为静态内部类,不过我们更喜欢称之为嵌套内部类.静态内部类与非静态内部类之间存在一个最大的区别,我们知道非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有.没有这个引用就意味着: 1. 它的创建是不需要依赖于外围类的. 2. 它不能使用任何外围类的非static成员变量和方法. 1 interface Contents { 2 int value(); 3 } 4 5 interface Destination {

java静态与非静态区别

这里的静态,指以static关键字修饰的,包括类,方法,块,字段. 非静态,指没有用static 修饰的. 静态有一些特点: 1.全局唯一,任何一次的修改都是全局性的影响 2.只加载一次,优先于非静态 3.使用方式上不依赖于实例对象. 4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束. 可参考 :http://blog.csdn.net/zhandoushi1982/article/details/8453522/. 关于静态内部类(嵌套类)和非静态内部类的区别,可参考: http:/

“全栈2019”Java第七十六章:静态、非静态内部类访问权限

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第七十六章:静态.非静态内部类访问权限 下一章 "全栈2019"Java第七十七章:抽象内部类与抽象静态内部类详解 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"J