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线程 线程是进程中的一个执行单元 ...
随机推荐
- [未解决:快速滑动collectionveiw请求数据崩溃]:unable to allocate 6553600 bytes for bitmap data
崩溃:unable to allocate 6553600 bytes for bitmap data
- 如何在Win10上永久禁用Windows Defender Antivirus
1.使用Windows键+ R键盘快捷键打开运行命令. 2.键入regedit,然后单击确定以打开注册表. 3.浏览以下路径: HKEY_LOCAL_MACHINE/SOFTWARE/Policies ...
- python之文件操作的函数
file=open("e:\\c.py","w",encoding="utf-8")date=file.close() ...
- JavaScript学习笔记--语法
代码风格: 每句结尾不用加分号: 单行注释用//,多行注释用/*...需要注释掉的代码....*/ 严格区分大小写 优雅的代码需要注意锁进 基础知识: Number:JavaScript不区分整数和浮 ...
- what's the python之异常处理
what's the 异常 python程序中会出现异常,即bug.若出现异常程序就报错,异常之后的代码就不会继续往下执行,这是一个正常程序不允许出现的,但是在某些程序交互的时候难免会因为用户输入问题 ...
- Spark History Server产生背景
以standalone运行模式为例,在运行Spark Application的时候,Spark会提供一个WEBUI列出应用程序的运行时信息:但该WEBUI随着Application的完成(成功/失败) ...
- POJ1611:The Suspects(模板题)
http://poj.org/problem?id=1611 Description Severe acute respiratory syndrome (SARS), an atypical pne ...
- Python 全栈开发四 python基础 函数
一.函数的基本语法和特性 函数的定义 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数 ...
- delete 删除对象属性
删除属性要直接删.
- 第一弹:超全Python学习资源整理(入门系列)
随着人工智能.大数据的时代到来,学习Python的必要性已经显得不言而喻.我经常逛youtube,发现不仅仅是以编程为职业的程序员,证券交易人员,生物老师,高级秘书......甚至许多自由撰稿人,设计 ...