提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

内部类

  • 前言
  • 一、成员内部类
  • 二、静态内部类
  • 三、方法内部类
  • 四、匿名内部类

前言

内部类在Java的学习与应用中有着很大的作用,同时也起到了一定的封装作用。

一、成员内部类

内部类的使用方法:

a.内部类可以互相访问private属性

(1)内部类可以直接访问外部类的元素和方法(因为内部类隐藏了外部类的对象)所以在输出                val时,实际上是Test.this.val.

(2) 外部类必须通过内部类的对象来访问内部类的元素和方法,下列代码中student可以调用fun          ()方法和private属性的age。

public class Test {private int val=12;private String str;//-----------------------class Student{private int age;private String name;public Student(int age, String name) {this.age = age;this.name = name;}public void fun(){System.out.println(val);}}//-------------------------public void fun2(){Student student=new Student(12,"张三");student.fun();System.out.println(student.age);}public static void main(String[] args) {Test test=new Test();test.fun2();}
}

b.成员内部类的对象创建:

(1)外部类内部创建(此时的内部指的是Test这个类里面):

上述代码中fun2()方法,就创建了student对象。

(2)外部类的外部创建(此时就是在Test这个类的外面):

public class Test1 {public static void main(String[] args) {Test.Student student=new Test().new Student(45,"李四");//输出结果是12student.fun();}
}

注意:对此由于内部类的创建必须依赖于外部类,所以一定要使用Test这个外部类来一步步产生  student对象。由于Student这个成员内部类在Test中是包访问权限,Test1与Student在同一个包下,因此Test1是可以看到的,如果将Studnt这个类加上private,此时上述代码就不可实现了,其实和成员方法有着很大的相似。

c.成员内部类其它:

(1)成员内部类不可以定义静态变量,可以访问外部类的成员域、静态域:

对于不可以定义静态变量我自己的理解:对于成员内部类(类比成员变量),必须依赖于外部            类,若定义了静态变量,则没有外部类对象也可以访问了。所以就会产生矛盾!

(2) 对于外部类来说,不可以直接在静态方法中使用成员内部类:

public  static void fun2(){Student student=new Student(12,"张三");student.fun();System.out.println(student.age);}

此时上述代码是错误的:因为静态方法不需要产生外部类对象就可以通过类调用,而成员内部类必须依赖于外部类对象,所以是不可以的!

解决方法:可以在fun2()方法内部,通过外部类产生内部类对象。

 public  static void fun2(){Test.Student student=new Test().new Student(21,"阿娇");student.fun();System.out.println(student.age);}

好了到这里,这个问题已经变得很清楚了!!!

二、静态内部类

静态内部类:定义在类中,使用static修饰的内部类。

这里只需要在内部类加上static修饰就OK了!

public class Test {private  int val=12;private String str;//-----------------------static class Student{private int age;private  String name;public Student(int age, String name) {this.age = age;this.name = name;}public void fun(){//此时就不可以直接访问外部类的成员变量val,当然如果val被static修饰就可以//此时就要产生一个外部类对象System.out.println(new Test().val);}}//-------------------------//此时如果是public static void fun2(),也可以直接使内部类。public void fun2(){Student student =new Student(45,"阿花");student.fun();}public static void main(String[] args) {Test test=new Test();test.fun2();}
}

所以只要那个成员内部类懂了,这个静态方法大同小异! 但还有以下值得注意的:

(1)静态内部类可以拥有成员变量。

(2)静态内部不可以直接外部类的成员变量,但可以new出来一个外部类的对象访问,上述代码fun      (),方法中就体现出来了。

(3)在外部类的外部创建内部类的对象:

public class Test1 {public static void main(String[] args) {Test.Student student=new Test.Student(45,"小花");student.fun();}}

此时相对于 成员内部类在外部类的外部创建内部类对象,有差点差别,因为静态内部类不需要产生对象,只需要使用类名称即可。

三、方法内部类

定义:定义在方法内部的类,不允许使用任何访问修饰符,对外部完全隐藏(出了这个方法就没了)


public class Test {private int age = 10;public void fun(int num) {// 方法内部类,不能出现任何访问修饰符和staticclass Inner {public void test() {System.out.println(age);System.out.println(num);}}// 此时Inner使用num这个变量,num就变为了隐式的final,值不能修改Inner inner = new Inner();inner.test();}public static void main(String[] args) {Test test=new Test();Test.fun(10);}
}

 注意:方法的内部类若使用了方法的形参,则该形参为隐式的声明,则该参数不可被修改。

四 、匿名内部类

定义:是方法内部类的特殊版本,直接不写类名称;遵从方内部类的所有要求,匿名内部类会默认继承一个类或接口。


public class Test {public static void fun(IMessage msg) {msg.printMsg();}public static void main(String[] args) {fun(new IMessage() {// 这就是一个匿名内部类// 等同于创建了一个类实现了Imessage接口,创建该类的对象@Overridepublic void printMsg() {System.out.println("匿名内部类的用法");}});
//       上面的使用就等同于下面两行
//        IMessage msg = new IMessageImpl();
//        fun(msg);}
}
interface IMessage {void printMsg();
}
class IMessageImpl implements IMessage {@Overridepublic void printMsg() {System.out.println("普通用法");}
}

这个是自己写的接口,自己实现的,上面显示了普通用法和匿名用法。通过比较很容易发现里面的关系。

但我们平时做题时,也经常会用到JDK自带的各种接口,例如comparator接口,也叫比较器。

 Queue<Freq> queue=new PriorityQueue<>(new Comparator<Freq>() {@Overridepublic int compare(Freq o1, Freq o2) {return o2.times-o1.times;}});

这个就是采用匿名内部类实现了一个基于最大堆的优先级。


总结

这是我第一次尝试些博客,可能对排版啥的有些欠缺,希望大家伙理解哈。接下来那我一定还会将其他的一些知识,以一个比较容易理解的方式,呈现给大家,希望大家可以喜欢哦。滴  滴滴~~

Java内部类的认识与应用相关推荐

  1. 看到如此详细的Java内部类,我泪目了

    Java内部类 介绍 定义 成员内部类 语法格式 使用说明 代码示例 局部内部类 语法格式 使用说明 代码示例 匿名内部类 语法格式 使用说明 代码示例 静态内部类 语法格式 使用说明 代码示例 介绍 ...

  2. Java内部类作用全解

    提起Java内部类(Inner Class)可能很多人不太熟悉,实际上类似的概念在C++里也有,那就是嵌套类(Nested Class),关于这两者的区别与联系,在下文中会有对比.内部类从表面上看,就 ...

  3. netBeans调试时不进入java内部类(jdk源码)的方法 转载

    初次使用netbeans的调试功能时,会发现调试中,进入了java的内部类运行,具体情况,如下图所示: 对于我这样的一个新手,完全弄不懂啊. 后来我去论坛问了,同时自己研究,发现经过以下设置,就可以跳 ...

  4. Java内部类(Inner Class)小记

    一.引子 看到Trinea的博文Junit单测代码中java序列化失败的解决,让我想到Java内部类的一些小Gocha,初学Java时很迷惑.这里记录一下. 就以Trinea的博文中的序列化失败的例子 ...

  5. Java内部类简介.

    一, 什么是内部类 Java中所谓内部类, 就是定义在另1个类内的类. 例如: class A{int a;class B{int b;} } 上面类B就是类A的一个内部类. 但是下面的写法, B只是 ...

  6. java内部类文件,Java内部类学习

    Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...

  7. 在Java内部类中使用外部类的成员方法以及成员变量

    http://blog.csdn.net/zhongyili_sohu/article/details/8975947 众所周知,在定义成员方法或者成员变量的时候,可以给其加上一些权限的修饰词,以防止 ...

  8. Java内部类引用外部类中的局部变量为何必须是final问题解析

    Java内部类引用外部类中的局部变量为何必须是final问题解析 今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来 ...

  9. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  10. 如何新建java内部类_java内部类-1(内部类的定义)

    小胖从官网出发,研究下为什么我们需要些内部类,内部类的区别和联系. 思考三个问题: (1)为什么需要内部类?静态内部类和非静态内部类有什么区别: (2)为什么内部类可以无条件访问外部类成员: (3)为 ...

最新文章

  1. 如何快速融入团队(二)
  2. 对抗样本无法被重建!CMU提出通用的无监督对抗攻击检测方法
  3. HP Webinspect 10 访问wap的url
  4. 20165334 《java程序设计》第2周学习总结
  5. XXX管理平台系统——概要
  6. 文献学习(part74)--Data Clustering: 50 Years Beyond K-means
  7. 为今天的光纤检测选择光纤示波器
  8. 计算机游戏50关,YELLOW游戏全50关攻略
  9. [转载] java程序员快速学c++
  10. 删除一个非空的无用表空间
  11. 【LeetCode】剑指 Offer 24. 反转链表
  12. easyUI 设置datagrid的行高 + 文字超宽换行
  13. 5G及移动边缘计算(MEC)学习笔记(1)
  14. 微信表情存入mysql
  15. SQL注入的严重危害之拖库实例
  16. elasticsearch版本介绍
  17. C#中Skip和Take的用法
  18. android闹钟报告分析,Android AlarmClock 闹钟应用 简单分析
  19. 关于Android studio Translation插件提示“更新 TKK 失败,请检查网络连接”问题
  20. LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。

热门文章

  1. XML(EXtensible Markup Language)
  2. Java 函数优雅之道
  3. Windows下配置 jerryScript 的交互命令行
  4. 2022-08-20-网易笔试题
  5. 数据仓库 DataWareHouse
  6. 宝塔忘记账号密码解决办法
  7. 死磕synchronized五:系统剖析轻量级锁
  8. 欢迎关注异贝!异贝是中国8000万中小微企业忠实的朋友,与您一起成长。今天与您一起分享:刘润老师的5分钟商学院营销案例~客户生命周期
  9. 2020年压力管道巡检维护考试申请表及压力管道巡检维护模拟考试题库
  10. 阿里钉钉架构师,20页ppt讲透2亿用户的钉钉系统架构实践