内部类(Inner Class)和静态内部类(Static Nested Class)的区别:

定义在一个类内部的类叫内部类,包含内部类的类称为外部类。内部类可以声明public、protected、private等访问限制,可以声明 为abstract的供其他内部类或外部类继承与扩展,或者声明为static、final的,也可以实现特定的接口。外部类按常规的类访问方式使用内部 类,唯一的差别是外部类可以访问内部类的所有方法与属性,包括私有方法与属性。

(1)创建实例

OutClass.InnerClass obj = outClassInstance.new InnerClass(); //注意是外部类实例.new,内部类:

AAA.StaticInner in = new AAA.StaticInner();//

注意是外部类本身,静态内部类

(2)内部类中的this

内 部类中的this与其他类一样是指的本身。创建内部类对象时,它会与创造它的外围对象有了某种联系,于是能访问外围类的所有成员,不需任何特殊条件,可理 解为内部类链接到外部类。 用外部类创建内部类对象时,此内部类对象会秘密的捕获一个指向外部类的引用,于是,可以通过这个引用来访问外围类的成员。

(3)外部类访问内部类

内部类类似外部类的属性,因此访问内部类对象时总是需要一个创建好的外部类对象。内部类对象通过‘外部类名.this.xxx’的形式访问外部类的属性与方法。如:

System.out.println("Print in inner Outer.index=" + pouter.this.index);

System.out.println("Print in inner Inner.index=" + this.index);

(4)内部类向上转型

内部类也可以和普通类一样拥有向上转型的特性。将内部类向上转型为基类型,尤其是接口时,内部类就有了用武之地。如果内部类是private的,只可以被它的外部类问,从而完全隐藏实现的细节。

(5)方法内的类

方法内创建的类(注意方法中也能定义类),不能加访问修饰符。另外,方法内部的类也不是在调用方法时才会创建的,它们一样也被事先编译了。

(6)静态内部类

定义静态内部类:在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。

通常称为嵌套类,当内部类是static时,意味着:

[1]要创建嵌套类的对象,并不需要其外围类的对象;

[2]不能从嵌套类的对象中访问非静态的外围类对象(不能够从静态内部类的对象中访问外部类的非静态成员);

嵌 套类与普通的内部类还有一个区别:普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段, 也不能包含嵌套类。但是在嵌套类里可以包含所有这些东西。也就是说,在非静态内部类中不可以声明静态成员,只有将某个内部类修饰为静态类,然后才能够在这 个类中定义静态的成员变量与成员方法。

另外,在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。普通非静态内部类的 对象是依附在外部类对象之中的,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。静态类和方法只属于类本身,并不属于 该类的对象,更不属于其他外部类的对象。

(7)内部类标识符

每个类会产生一个.class文件,文件名即为类名。同样,内部类也会产生这么一个.class文件,但是它的名称却不是内部类的类名,而是有着严格的限制:外围类的名字,加上$,再加上内部类名字。

(8)为何要用内部类?

1. 内部类一般只为其外部类使用;

2. 内部类提供了某种进入外部类的窗户;

3. 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。

package com.test.xml;

public class OutClassTest {

static int a;

int b;

public static void test() {

System.out.println("outer class static function");

}

public static void main(String[] args) {

OutClassTest oc = new OutClassTest();

// new一个外部类

OutClassTest oc1 = new OutClassTest();

// 通过外部类的对象new一个非静态的内部类

OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

// 调用非静态内部类的方法

System.out.println(no_static_inner.getKey());

// 调用静态内部类的静态变量

System.out.println(OutClassTest.InnerStaticClass.static_value);

// 不依赖于外部类实例,直接实例化内部静态类

OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

// 调用静态内部类的非静态方法

System.out.println(inner.getValue());

// 调用内部静态类的静态方法

System.out.println(OutClassTest.InnerStaticClass.getMessage());

}

private class InnerClass {

// 只有在静态内部类中才能够声明或定义静态成员

// private static String tt = "0";

private int flag = 0;

public InnerClass() {

// 三.非静态内部类的非静态成员可以访问外部类的非静态变量和静态变量

System.out.println("InnerClass create a:" + a);

System.out.println("InnerClass create b:" + b);

System.out.println("InnerClass create flag:" + flag);

//

System.out.println("InnerClass call outer static function");

// 调用外部类的静态方法

test();

}

public String getKey() {

return "no-static-inner";

}

}

private static class InnerStaticClass {

// 静态内部类可以有静态成员,而非静态内部类则不能有静态成员。

private static String static_value = "0";

private int flag = 0;

public InnerStaticClass() {

System.out.println("InnerClass create a:" + a);

// 静态内部类不能够访问外部类的非静态成员

// System.out.println("InnerClass create b:" + b);

System.out.println("InnerStaticClass flag is " + flag);

System.out.println("InnerStaticClass tt is " + static_value);

}

public int getValue() {

// 静态内部类访问外部类的静态方法

test();

return 1;

}

public static String getMessage() {

return "static-inner";

}

}

public OutClassTest() {

// new一个非静态的内部类

InnerClass ic = new InnerClass();

System.out.println("OuterClass create");

}

}

/**

* 总结:

* 1.静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)。

* 2.静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)。

* 3.实例化一个非静态的内部类的方法:

* a.先生成一个外部类对象实例

* OutClassTest oc1 = new OutClassTest();

* b.通过外部类的对象实例生成内部类对象

* OutClassTest.InnerClass no_static_inner = oc1.new InnerClass();

* 4.实例化一个静态内部类的方法:

* a.不依赖于外部类的实例,直接实例化内部类对象

* OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();

* b.调用内部静态类的方法或静态变量,通过类名直接调用

* OutClassTest.InnerStaticClass.static_value

* OutClassTest.InnerStaticClass.getMessage()

*/

java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...相关推荐

  1. java中属性是什么意思啊_Java中的字段和属性到底有什么区别?

    Java中的字段和属性到底是什么?他们的含义真的是相同的吗?如果不同,那他们到底又分别是何含义呢? 相信上面的问题,对于很多Java初学者都是相当困惑的,但是好像把他们理解为一个含义也没啥问题,很多J ...

  2. java final f的区别_Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)...

    简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的子类,不能作为父类 ...

  3. java 堆内存和栈内存的区别_java中栈内存和堆内存有什么区别

    栈内存和堆内存的区别: 1.栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中. (视频教程推荐:java视频 ...

  4. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别

    对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...

  5. java中怎么调用非静态方法有哪些_java中 静态方法和非静态方法的调用

    静态方法里面不能调用非静态方法 package com.zqz.image; public class HellowWord { public void say(String word){// 非静态 ...

  6. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

  7. java 静态变量和非静态_Java中静态和非静态变量之间的区别

    变量为我们提供了程序可以操纵的命名存储.Java中的每个变量都有一个特定的类型,该类型确定变量的内存大小和布局.可以存储在该内存中的值的范围:以及可以应用于该变量的一组操作. 静态变量 静态变量也称为 ...

  8. java 抽象类与接口区别是什么_JAVA中抽象类与接口的区别,分别在什么情况下使用它们...

    在网上看到很多人问关于"抽象类与接口的区别",因此本人想通过自己多年对JAVA开发的经验来总结一下抽象类与接口的区别以及分别在什么情况下使用它们. 在Java语言中, abstra ...

  9. java io流区别_Java中IO流的分类和BIO,NIO,AIO的区别

    到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...

最新文章

  1. SAP MM 盘点流程中上不了台面却很实用的方案建议
  2. linux脚本多个条件比较大小,shell脚本-比较两个整数大小
  3. Android 8.0学习(28)--- 解决OkHttp问题
  4. asp.net 窗体关闭事件_关于滁州一地煤气爆炸事件!最新消息来了!
  5. JAVA加密解密→术语、密码分类、OSI与TCP/IP安全体系、Base64、消息摘要算法MD/SHA/MAC、对称加密算法DES/AES/PBE、非对称加密算法DH/RSA/EIGamaI
  6. html如何与js链接,链接index.html client.js和server.js
  7. 我在华为写了13年代码的一些感悟
  8. winform获取appconfig配置文件得配置
  9. java.io.FileWriter class doesn’t use UTF-8 by default
  10. QR码与DM码的对比
  11. 系统、驱动相关软件下载
  12. 强化学习——Sarsa算法
  13. Python开发——函数【迭代器、生成器、三元表达式、列表解析】
  14. 已经开工三天的软件测试工程师:被女足和谷爱凌感动到了
  15. java生成短信验证码_Java随机生成手机短信验证码的方法
  16. word段落操作快捷键(一)
  17. c# 开发winform控件
  18. 网球目标检测——基于Python-OpenCV
  19. 老马的技术博客 android系统通过图片绝对路径获取URI的三种方法
  20. LeetCode算法刷题目录 (Java)

热门文章

  1. 洛谷 P1968 美元汇率
  2. KNNClassifier
  3. pip3 install requests Cannot open D:\Python35\Scripts\pip3-script.py
  4. OC之OBJC2_UNAVAILABLE
  5. 【java】对象变成垃圾被垃圾回收器gc收回前执行的操作:Object类的protected void finalize() throws Throwable...
  6. python 编码问题之终极解决
  7. linux raw socket 例子,raw socket编程例子
  8. python亲密度_859. 亲密字符串(Python)
  9. docker 数据库 mysql_在Docker中体验数据库之MySql
  10. 数据库备份 java jar_Java实现数据库备份并利用ant导入SQL脚本