2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread;
//注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法
public class TemplateThread {
//如果这个方法不想被子类或者别人随意改动[这样子类就不能覆写该方法了],这里方法就要设置为final方法
public final void println(String message){
System.out.println("#######################");
wrapPrint(message);
System.out.println("#######################");
}
//这个方法只允许被子类或者自身所覆盖,所以这里我们用protected关键字!
protected void wrapPrint(String message){ } public static void main(String[] args) {
//这里用TemplateThread类的匿名子类创建了一个对象,并覆盖了这个TemplateThread类的wrapPrint()方法!
TemplateThread t1 = new TemplateThread(){
@Override
protected void wrapPrint(String message) {
// TODO Auto-generated method stub
System.out.println("*"+message+"*");
}
};
t1.println("哈哈"); //这里实际上是TemplateThread类的匿名子类创建了一个匿名对象,然后调用这个匿名对象的println()方法!只不过在这里
//用匿名子类的时候,覆盖了父类中的wrapPrint方法,同时需要提醒大家的是,如果父类【TemplateThread】中的方法如果
//是抽象方法的话,那么子类就必须实现这个抽象方法,而如果父类中的这个方法只是一个空方法体的话,子类可以选择覆盖,也可以
//选择不覆盖!!
new TemplateThread(){
@Override
protected void wrapPrint(String message) {
// TODO Auto-generated method stub
System.out.println("======="+message+"=====");
}
}.println("哈哈");
}
}
我想我们上面的这段代码已经很好的阐释了我们的标题要讲的知识点,这里要好好体悟,再一个就是:这个通过匿名类创建的匿名对象,然后调用这个匿名对象的println()方法实际上是仿照我们的Thead线程类的start()方法实现的,也就是说:我们多线程Thread类的start()方法的源码中大家可以看到实际上是调用了start0()方法,而这个方法是native修饰的,也就是由C++写的,在这个方法内部实际上又调用了我们Thread类的run()方法,这就很像我们在上面代码中父类TemplateThread中的println()方法中调用了wrapPrint()方法,而这里的wrapPrint()方法只是一个空实现,也就是说子类可以实现也可以不实现,实际上是和我们调用Thead创建子类的时候是一致的,我们可以覆盖这个Thead类的run()方法,yekeyi 不覆盖,这是因为Thead/类本身已经为我们实现了这个run()方法,如果必须要子类覆盖或者实现的话,可以将这个方法设置为抽象方法!也就在TemplateThread中我们可以将wrapPrint设置为抽象方法,那么TemplateThread的子类就必须实现这个方法了,然后子类的对象也就可以直接调用println()方法了!就javaapi给我们提供的这个Thread类而言,我们是可以覆写它的start()方法的,因为这个方法不是final类型的,但是如果我们覆写了start()方法,那么它就不会有源码中的start0()方法来调用c++的程序了!所以我们这个说明了,为什么我命名调用的是run()方法而我们在运行程序的时候却是调用的是start()方法呢?原因就是Thead类这里用的是模板方法的一个技巧,就是和上面我们自己写的代码类似,在一个方法1中调用另一个方法2,我们需要覆写的是方法2,但是我们运行代码的时候调用的却是方法1,因为方法1为我们调用了方法2,而且在调用方法2的前后还做了其它工作!
2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理的更多相关文章
- private,protected,public和default的区别
private,protected,public和default的区别 除了default以外,其他都是Java语言的关键字.default代表的是对类成员没有进行修饰的情况.它本身也代表了一种访问控 ...
- @private@protected@public@package
@private@protected@public@package 为了强制一个对象隐藏其数据,编译器限制实例变量范围以限制其在程序中的可见性 但是为了提供灵活性,苹果也让开发者显式设置范围(四选一) ...
- 探Java多线程Thread类和Runnable接口之间的联系
首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说 有如下两种情 ...
- 【Java】abstract,final,static,private,protected,public的区别
[abstract]抽象的 1. abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的类一定是 ...
- 对private protected public的详解:
#include <iostream> #include <stack> #include <queue> #include <exception> # ...
- java: private, protected, public
这三个 「可访问修饰符」,是一个老生常谈的话题了.在 C++ 中也有类似的概念. 按其修饰对象的不同,分为几种用法小记一下: 用于类 只有 public 可以修饰类:private 和 protect ...
- oc 中四种实例变量的范围类型@private@protected@public@package
To enforce the ability of an object to hide its data, the compiler limits the scope of instance vari ...
- iOS中四种实例变量的范围类型@private@protected@public@package
文档上记录是这样的 The Scope of Instance Variables Toenforce the ability of an object to hide its data, the c ...
- 多线程----Thread类,Runnable接口,线程池,Callable接口,线程安全
1概念 1.1进程 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 任务管理器中: 1.2线程 线程是进程中的一个执行单元 ...
随机推荐
- LeetCode 476 Number Complement 解题报告
题目要求 Given a positive integer, output its complement number. The complement strategy is to flip the ...
- LeetCode 973 K Closest Points to Origin 解题报告
题目要求 We have a list of points on the plane. Find the K closest points to the origin (0, 0). (Here, ...
- idea tomcat控制台system.out.println是乱码
配置一下tomcat的信息.然后设置VM options.添加:-Dfile.encoding=UTF-8
- 我的grunt学习笔记
什么是grunt? Grunt是一个JavaScript任务运行器,用于自动执行频繁任务(如压缩,编译,单元测试)的工具.它使用命令行界面来运行在文件中定义的自定义任务(这个文件称为Gruntfil ...
- 20165336 2017-2018-2 《Java程序设计》第7周学习总结
20165336 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 查询操作:向数据库发送SQL查询语句,处理查询结果,关闭连接. 顺序查询:next()方法向 ...
- nodemcu使用心得1
1.简介 最近迷上了性价比超高的模块nodemcu,它是基于esp8266-12E的非常易用的模块.他可以用lua语言编程,带有丰富的库. 2.硬件 1)esp8266-12E单元模块原理图 经本人实 ...
- 贪吃蛇java版
主要的蛇的类 import java.awt.Color; import java.awt.Graphics; import java.awt.HeadlessException; import ja ...
- DVD租赁系统
跟着网上的视频学的,还有个别地方写的不够好,主要学习dao模式,这里其中的BaseUtil类不错 DVD.java package com.dvd.entiy; public class DVD { ...
- MongoDB与关系型数据库 区别
mysql mongodb 表 table Collection 字段 Colum Fields 行 row Document Mongo中的一些概念 ------------- ...
- 组合覆盖与PICT的使用
组合覆盖法是一种有效减少测试用例个数的测试用例设计方法.根据覆盖程度的不同,可以分为单因素覆盖.成对组合覆盖.三三组合覆盖等.其中又以成对组合覆盖最常用. 关于组合覆盖的更多内容,参考:http:// ...