Java 是很多人一直在用的编程语言,但是有些 Java 概念是非常难以理解的,哪怕是一些多年的老手,对某些 Java 概念也存在一些混淆和困惑。所以,在这篇文章里,会介绍四个 Java 中最难理解的四个概念,去帮助大家更清晰的理解这些概念:

  1. 匿名内部类的用法
  2. 多线程
  3. 如何实现同步
  4. 序列化

由于篇幅有限,这里没有展示的很详细、全面,有需要完整版的朋友可以点一点下方链接免费领取!

链接:1103806531暗号:CSDN

匿名内部类

匿名内部类又叫匿名类,它有点像局部类(Local Class)或者内部类(Inner Class),只是匿名内部类没有名字,我们可以同时声明并实例化一个匿名内部类。

一个匿名内部类仅适用在想使用一个局部类并且只会使用这个局部类一次的场景。

匿名内部类是没有需要明确声明的构造函数的,但是会有一个隐藏的自动声明的构造函数。

创建匿名内部类有两种办法:

  1. 通过继承一个类(具体或者抽象都可以)去创建出匿名内部类
  2. 通过实现一个接口创建出匿名内部类

咱们看看下面的例子:

// 接口:程序员
interface Programmer {void develop();
}public class TestAnonymousClass {public static Programmer programmer = new Programmer() {@Overridepublic void develop() {System.out.println("我是在类中实现了接口的匿名内部类");}};public static void main(String[] args) {Programmer anotherProgrammer = new Programmer() {@Overridepublic void develop() {System.out.println("我是在方法中实现了接口的匿名内部类");}};TestAnonymousClass.programmer.develop();anotherProgrammer.develop();}
}

从上面的例子可以看出,匿名类既可以在类中也可以在方法中被创建。

之前我们也提及匿名类既可以继承一个具体类或者抽象类,也可以实现一个接口。所以在上面的代码里,我创建了一个叫做 Programmer 的接口,并在 TestAnonymousClass 这个类中和 main() 方法中分别实现了接口。

Programmer除了接口以外既可以是一个抽象类也可以是一个具体类。

抽象类,像下面的代码一样:

public abstract class Programmer {public abstract void develop();
}

具体类代码如下:

public class Programmer {public void develop() {System.out.println("我是一个具体类");}
}

OK,继续深入,那么如果 Programmer 这个类没有无参构造函数怎么办?我们可以在匿名类中访问类变量吗?我们如果继承一个类,需要在匿名类中实现所有方法吗?

public class Programmer {protected int age;public Programmer(int age) {this.age = age;}public void showAge() {System.out.println("年龄:" + age);}public void develop() {System.out.println("开发中……除了异性,他人勿扰");}public static void main(String[] args) {Programmer programmer = new Programmer(38) {@Overridepublic void showAge() {System.out.println("在匿名类中的showAge方法:" + age);}};programmer.showAge();}
}
  1. 构造匿名类时,我们可以使用任何构造函数。上面的代码可以看到我们使用了带参数的构造函数。
  2. 匿名类可以继承具体类或者抽象类,也能实现接口。所以访问修饰符规则同普通类是一样的。子类可以访问父类中的 protected 限制的属性,但是无法访问 private 限制的属性。
  3. 如果匿名类继承了具体类,比如上面代码中的 Programmer 类,那么就不必重写所有方法。但是如果匿名类继承了一个抽象类或者实现了一个接口,那么这个匿名类就必须实现所有没有实现的抽象方法。
  4. 在一个匿名内部类中你不能使用静态初始化,也没办法添加静态变量。
  5. 匿名内部类中可以有被 final 修饰的静态常量。

匿名类的典型使用场景:

  1. 临时使用:我们有时候需要添加一些类的临时实现去修复一些问题或者添加一些功能。为了避免在项目里添加java文件,尤其是仅使用一次这个类的时候,我们就会使用匿名类。
  2. UI Event Listeners:在java的图形界面编程中,匿名类最常使用的场景就是去创建一个事件监听器。比如:
button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {}
});

上面的代码中,我们通过匿名类实现了 setOnClickListener 接口,当用户点击按钮的时候,就会触发我们实现的 onClick 方法。

多线程

Java 中的多线程就是利用多个线程共同完成一个大任务的运行过程,使用多线程可以最大程度的利用CPU。

使用多线程的使用线程而不是进程来做任务处理,是因为线程比进程更加轻量,线程是一个轻量级的进程,是程序执行的最小单元,并且线程和线程之间是共享主内存的,而进程不是。

线程生命周期

由于篇幅有限,只为大家展示到这里,实在抱歉,不过完整版已经整理出文档,这边也整理了一份 架构师全套视频教程 和关于java的系统化资料,免费分享给大家~有需要的朋友可以点一点下方链接免费领取!

链接:1103806531暗号:CSDN

什么?听说很多Java老司机都栽在了这四个概念上?相关推荐

  1. 聊聊身边的嵌入式,为什么老司机都爱后视镜

    为什么老司机都爱后视镜 有句话形容我们老司机的成长过程,叫:一年虎,二年狼,三年变成小绵羊.如果你不懂这句话的意思,证明你还不是一个合格的老司机.如果没和别人发生过亲(Gua)密(Ceng)接(Shi ...

  2. 天不知道地知道你不知道我知道谜底_冷门还免费!宝鸡这几个小众红叶观赏地,资深老司机都不一定知道...

    宝鸡一年中最美的红叶季 到来啦! 不仅是黄叶和红枫 更有赤橙黄绿青蓝紫 .... 这样的季节如油彩画般被时光渲染! 说到宝鸡的红叶 你只晓得黄柏塬.灵官峡.青峰峡 ...... 下面这些小众红叶观赏地 ...

  3. 老司机都懂的x件事,一般人我不告诉他

    临近双十一, 小编还寻思着不知道买点啥的时候, 室友忽然告诉我ta!买!车!了! ? 忽然间脑海里就闪现过秋名山车神的种种名场面-- <头文字D> 来源:知乎@飞隅 开始盘算哪天一起出去自 ...

  4. 3dvary灯光材质为什么不亮_为什么老司机都不把卤素车灯升级?听老司机说完,后悔升级了...

    为什么老司机都不把卤素车灯升级?听老司机说完,后悔升级了!随着汽车行业的发展,汽车的车灯也在不停地更换,从最早的卤素大灯到氙气灯,最后到现在的LED灯,灯光效果也是越来越好了.但是仍有不少的车型还在采 ...

  5. 老司机都在用的浏览器,体积小功能齐全,直呼内行

    现在市面上的浏览器简直是多不胜数,虽然数量多,但是好用的并不多.尤其是某些大厂的浏览器,无用的功能越来越多,越来越臃肿,体积也越来越大,使用体验还不好,有时候甚至不如一些小众浏览器.今天给大家安利2款 ...

  6. maya中英文切换插件_老司机都在用的30款maya常用插件

    插件介绍 maya是我们经常打交道的三维软件,涉及到了影视游戏特效的各个模块,本次给大家带来的福利是30个maya最常用的插件,无论你是行业新人还是资深会开车的老司机都可以帮助大家快速提高工作效率,获 ...

  7. Dism++ 一款传说中“老司机”都爱用的系统工具,使用简介

    前言 如果让热爱搞机的"老司机"为你推荐几款装机必备软件,那么它的推荐列表中大概率都会出现一款叫Dism++的系统优化工具. 说实话这个工具初次使用会让人有些迷茫,但如果能花上一点 ...

  8. 为什么很多Java程序员都转行做大数据了?

    如今大数据发展的越来越成熟.各大企业纷纷成立大数据部门.尤其BAT等一线互联网公司每天处理的数据量都是TB级别.大数据部门已成为这些企业的核心部门,数据已成为企业最核心的资产. 但是大数据人才缺口巨大 ...

  9. Java 老司机总结的代码风格指南(下)

    前言 之前我们讲了代码风格中函数.类多大才合适,一行代码多长最合适和善用空行分割单元块,今天我们继续讲解代码风格. 1. 四格缩进还是两格缩进? "PHP 是世界上最好的编程语言?代码换行应 ...

最新文章

  1. 降低云计算成本的方法总结
  2. 【MATLAB】变量 ( 特殊变量和常量 | 关键字 | 调用优先级 | 数值显示格式 )
  3. zigbee 协议栈的时钟和定时器分频
  4. 前端学习(3198):jsx语法规则2
  5. h5与小程序服务器如何辨别,小程序丨教你六招,快速区分H5页面还是APP页面
  6. 姚期智:算法将推动下一波AI浪潮,现有革新将达极限
  7. MySQL双主高可用架构之MMM实战
  8. JavaScript高级程序
  9. java 使用JEP 进行节点计算
  10. 海马扫描Linux,海马扫描公式识别软件
  11. 【C++心路历程25】课堂讲义【dp加单调队列】
  12. ElasticSearch搜索引擎详解-持续更新中
  13. sorted 实现部分排序
  14. Python-opencv:将文件夹中的图片序列按顺序转化为视频
  15. ios中在app应用内刷新小组件数据
  16. 计算机社团活动教学计划,趣味科学社团教学计划记录、总结.doc
  17. 嵌入式Linux--驱动ST7789驱动芯片的TFT屏(一)
  18. 数字基带信号及其频谱特性
  19. 零知识证明系列之一——初探零知识证明
  20. DUN连接完成后,pc与手机进行LCP协商

热门文章

  1. 医院信息化-3 医院场景的评测和标准
  2. 【已解决】怎么修改mysql最大连接数
  3. 英特尔cpu发布时间表_英特尔10代桌面级处理器最大睿频突破5GHz,发布时间是否有所暗示...
  4. (转)iptables设置Linux全局代理
  5. 阿里云——前端暑期实习一面面经( 2022-03-18 )
  6. python 100行代码实现 12306 自动抢票
  7. 清理C盘内存:电脑C盘飘红了,那么如何清理垃圾文件,总结几种亲测方案
  8. USB协通讯议--深入理解
  9. 华为PK传统厂商 引领新ICT背后的实力是什么?
  10. ios13与android 10流畅度,iPhone6S分别运行iOS13与iOS10是什么体验 结果很出乎意料