内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类

如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相当于其中的某个器官之一,例如心脏:它也有自己的属性和行为(血液、跳动)

显然,此处不能单方面用属性或者方法表示一个心脏,而需要一个类

而心脏又在人体当中,正如同是内部类在外部内当中

实例1:内部类的基本结构

//外部类
class Out {private int age = 12;//内部类class In {public void print() {System.out.println(age);}}
}public class Demo {public static void main(String[] args) {Out.In in = new Out().new In();in.print();//或者采用下种方式访问/*Out out = new Out();Out.In in = out.new In();in.print();*/}
}

运行结果:12

从上面的例子不难看出,内部类其实严重破坏了良好的代码结构,但为什么还要使用内部类呢?

因为内部类可以随意使用外部类的成员变量(包括私有)而不用生成外部类的对象,这也是内部类的唯一优点

如同心脏可以直接访问身体的血液,而不是通过医生来抽血

程序编译过后会产生两个.class文件,分别是Out.class和Out$In.class

其中$代表了上面程序中Out.In中的那个 .

Out.In in = new Out().new In()可以用来生成内部类的对象,这种方法存在两个小知识点需要注意

  1.开头的Out是为了标明需要生成的内部类对象在哪个外部类当中

  2.必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变

实例2:内部类中的变量访问形式

class Out {private int age = 12;class In {private int age = 13;public void print() {int age = 14;System.out.println("局部变量:" + age);System.out.println("内部类变量:" + this.age);System.out.println("外部类变量:" + Out.this.age);}}
}public class Demo {public static void main(String[] args) {Out.In in = new Out().new In();in.print();}
}

运行结果:

局部变量:14
内部类变量:13
外部类变量:12

从实例1中可以发现,内部类在没有同名成员变量和局部变量的情况下,内部类会直接访问外部类的成员变量,而无需指定Out.this.属性名

否则,内部类中的局部变量会覆盖外部类的成员变量

而访问内部类本身的成员变量可用this.属性名,访问外部类的成员变量需要使用Out.this.属性名

实例3:静态内部类

class Out {private static int age = 12;static class In {public void print() {System.out.println(age);}}
}public class Demo {public static void main(String[] args) {Out.In in = new Out.In();in.print();}
}

运行结果:12

可以看到,如果用static 将内部内静态化,那么内部类就只能访问外部类的静态成员变量,具有局限性

其次,因为内部类被静态化,因此Out.In可以当做一个整体看,可以直接new 出内部类的对象(通过类名访问static,生不生成外部类对象都没关系)

实例4:私有内部类

class Out {private int age = 12;private class In {public void print() {System.out.println(age);}}public void outPrint() {new In().print();}
}public class Demo {public static void main(String[] args) {//此方法无效/*Out.In in = new Out().new In();in.print();*/Out out = new Out();out.outPrint();}
}

运行结果:12

如果一个内部类只希望被外部类中的方法操作,那么可以使用private声明内部类

上面的代码中,我们必须在Out类里面生成In类的对象进行操作,而无法再使用Out.In in = new Out().new In() 生成内部类的对象

也就是说,此时的内部类只有外部类可控制

如同是,我的心脏只能由我的身体控制,其他人无法直接访问它

实例5:方法内部类

class Out {private int age = 12;public void Print(final int x) {class In {public void inPrint() {System.out.println(x);System.out.println(age);}}new In().inPrint();}
}public class Demo {public static void main(String[] args) {Out out = new Out();out.Print(3);}
}

运行结果:

3
12

在上面的代码中,我们将内部类移到了外部类的方法中,然后在外部类的方法中再生成一个内部类对象去调用内部类方法

如果此时我们需要往外部类的方法中传入参数,那么外部类的方法形参必须使用final定义

至于final在这里并没有特殊含义,只是一种表示形式而已

6、匿名内部类

首先回顾下之前的匿名内部类:  

匿名内部类的格式:
  new 接口或者接口名(){
        重写方法
    };

本质:是该类或者接口的子类对象

匿名内部类方式使用多线程
1、new Thread(){代码…}.start();
2、new Thread(new Runnable(){代码…}).start();

注意://在jdk 1.8以前匿名内部类调用外部类对象的属性或者方法时外部类需要使用final修饰 如下面代码所示:

public class Test1 {public void studay(){System.out.println("进入外部类的方法");}//定义一个内部类class Main {public int i = 10;public synchronized void operationSup(){System.out.println("进入内部类的方法");try {i--;System.out.println("Main print i = " + i);Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {//        final SyncException se=new SyncException();final Test1 a=new Test1();//在jdk 1.8以前匿名内部类调用外部类对象的属性或者方法时外部类需要使用final修饰//定义一个匿名内部类Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {a.studay();}},"t1");t1.start();}
}

当:jdk版本换成1.8以下 final Test1 a=new Test1(); 没有使用final修饰及 Test1 a=new Test();

此时调用外部类方法a.studay();就会报错 所以此时一个内部类中用外部类中的对象,该对象必须要final修饰才能通过;

就那这个代码来说,内部类thread在main方法执行完后不会随着方法被GC回收,而方法中的a(Test1)对象可以看做是一个局部变量,在方法执行完后就会被回收,

而在内部类中却还有继续用这个a对象,所以要用final修饰该对象,使其会在内部类中复制一份副本给内部类使用。当然它的值是不会改变的。

转载于:https://www.cnblogs.com/a8457013/p/8080707.html

java中的内部类总结相关推荐

  1. java 为什么有匿名类_全面了解Java中的内部类和匿名类

    Java内部类(Inner Class),类似的概念在C++里也有,那就是嵌套类(Nested Class),乍看上去内部类似乎有些多余,它的用处对于初学者来说可能并不是那么显著,但是随着对它的深入了 ...

  2. Java学习笔记二十:Java中的内部类

    Java中的内部类 一:什么是内部类: (1).什么是内部类呢? 内部类( Inner Class )就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. (2).那为什么要将一个类定 ...

  3. JAVA中的内部类(二)成员内部类

    Java中的成员内部类(实例内部类):相当于类中的一个成员变量,下面通过一个例子来观察成员内部类的特点 public class Outer {//定义一个实例变量和一个静态变量private int ...

  4. JAVA中的内部类(一)静态内部类

    Java中的静态内部类:在定义的内部类前加static修饰符,此时的内部类就是静态内部类.通过一个例子来了解静态内部类都有哪些特点. public class Outer {//定义一个实例变量和一个 ...

  5. Java中的内部类和匿名类

    内部类 Java中的类有两种重要的成员,即成员变量和方法.其实Java还允许类有一种成员,即在一个类中声明另一个类,这就是内部类,而包含内部类的类叫做外嵌类. 内部类和外嵌类之间的关系如下: 1.内部 ...

  6. 深入理解Java中为什么内部类可以访问外部类的成员

    内部类简介 虽然Java是一门相对比较简单的编程语言,但是对于初学者, 还是有很多东西感觉云里雾里, 理解的不是很清晰.内部类就是一个经常让初学者感到迷惑的特性. 即使现在我自认为Java学的不错了, ...

  7. java 中的内部类学习小记

    什么是内部类 一个类的内部又完整的嵌套另外一个类的结构,被嵌套的类就被称为内部类. 嵌套其它的类的类被就是外部类.内部类是类的五大成员之一. 类的五大成员: 属性.方法.构造器.代码块.内部类. 内部 ...

  8. 8、java中的内部类

    根据类定义时所在的位置不同可以将内部类分为四大类:成员内部类.方法内部类.静态内部类.匿名内部类. 成员内部类 顾名思义成员内部类定义在外部类的成员变量位置,相当于外部类的一个成员.将成员内部类当成当 ...

  9. java 什么是内部类_讨论Java中的内部类是什么?

    前言 内部类,讲完前面的特性,今天就讲下内部类这个用的比较多,出现频率挺高的知识点. what is that? 首先,顾名思义,内部类就是在类的内部,也就是类的类,嵌套在里面的.直接代码介绍,现一般 ...

  10. java中继承内部类的方法_Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接在 ...

最新文章

  1. 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  2. 沈阳航空航天大学 计算机学院 罗,沈阳航空航天大学计算机学院院长率队来校交流考察...
  3. 010 Android之逆向入门
  4. 搭建集群 RabbitMQ SHELL脚本实战_03
  5. ElementUI项目优化上线
  6. 《Google软件测试之道》告诉你什么是测试
  7. angular 居中_垂直居中的N种方法
  8. 2022年玻璃包装容器行业市场发展环境分析预测及下游需求规模增长率研究预测
  9. ybc_art打印艺术字
  10. idv和vdi的优劣势_VDI与IDV真正的含义是什么?
  11. 《简单法则》读书笔记
  12. Chrome浏览器首次打开后未响应较长时间
  13. RMAN crosscheck command作用
  14. VB Dim的初识与相关用法
  15. 设计软件大合集,看看有你用过的吗
  16. pwm控制电机转速原理浅析
  17. 用计算机如何画柳条,柳条简笔画
  18. 离散数学_九章:关系(2)
  19. 决策树总结(个人学习体会)
  20. ISO27001LA 学友联盟再次来袭

热门文章

  1. 曲线行驶最后什么时候回正_曲线行驶总压线?老教练给你支支招,看完觉得太简单了……...
  2. 深度学习之循环神经网络(11-b)GRU情感分类问题代码
  3. 『ACM-算法-ST算法』信息竞赛进阶指南--区间最值问题的ST算法
  4. CF思维联系–CodeForces -224C - Bracket Sequence
  5. [开源]基于姿态估计的运动计数APP开发(三)
  6. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)
  7. [机器学习] --- Getting Started With MachineLearning
  8. Python中的str与unicode处理方法
  9. Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
  10. 机器学习基本算法的sklearn接口