必须掌握的重点知识.docx
- 文档编号:782287
- 上传时间:2022-10-13
- 格式:DOCX
- 页数:36
- 大小:363.61KB
必须掌握的重点知识.docx
《必须掌握的重点知识.docx》由会员分享,可在线阅读,更多相关《必须掌握的重点知识.docx(36页珍藏版)》请在冰豆网上搜索。
必须掌握的重点知识
2面向对象基础
封装的好处:
将变化隔离;便于使用;提高重用性;安全性。
封装原则:
将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问。
单例设计模式:
★★★★★(必问的)
解决的问题:
保证一个类在内存中的对象唯一性。
比如:
多程序读取一个配置文件时,建议配置文件封装成对象。
会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
Runtime()方法就是单例设计模式进行设计的。
如何保证对象唯一性呢?
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。
(作用:
可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
//饿汉式 class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s; }
} //懒汉式:
延迟加载方式。
Class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s; } }
饿汉式,static修饰,随着类的加载而加载,会损耗性能,但是方法相对简单
懒汉式第一次用的时候相对较慢,因为需要加载!
线程,不安全!
二 继承 ★★★★★ 好处:
1:
提高了代码的复用性。
2:
让类与类之间产生了关系,提供了另一个特征多态的前提。
注意:
子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();
如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。
如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。
final特点:
1:
这个关键字是一个修饰符,可以修饰类,方法,变量。
2:
被final修饰的类是一个最终类,不可以被继承。
3:
被final修饰的方法是一个最终方法,不可以被覆盖。
4:
被final修饰的变量是一个常量,只能赋值一次。
抽象类的特点:
1:
抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。
2:
抽象方法只定义方法声明,并不定义方法实现。
3:
抽象类不可以被创建对象(实例化)。
4:
只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。
否则,该子类还是一个抽象类。
5:
抽象类只能单继承。
抽象类的细节:
1:
抽象类中是否有构造函数?
有,用于给子类对象进行初始化。
2:
抽象类中是否可以定义非抽象方法?
可以。
其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。
所以抽象类和一般类在定义上,都是需要定义属性和行为的。
只不过,比一般类多了一个抽象函数。
而且比一般类少了一个创建对象的部分。
3:
抽象关键字abstract和哪些不可以共存?
final , private , static
Final修饰的不能被重写
Private修饰的不能访问
Static修饰的随着类的加载而加载,此时还没有对象
4:
抽象类中可不可以不定义抽象方法?
可以。
抽象方法目的仅仅为了不让该类创建对象。
接 口:
★★★★★
抽象类和接口的区别:
(问的比较多,概念性的问题)
1:
抽象类只能被继承,而且只能单继承。
接口需要被实现,而且可以多实现。
2:
抽象类中可以定义非抽象方法,子类可以直接继承使用。
接口中都是抽象方法,需要子类去实现。
3:
抽象类使用的是 is a 关系。
接口使用的 like a 关系。
4:
抽象类的成员修饰符可以自定义。
接口中的成员修饰符是固定的。
全都是public的。
三 多态
多 态★★★★★(面向对象特征之一):
函数本身就具备多态性,某一种事物有不同的具体体现。
体现:
父类引用或者接口的引用指向了自己的子类对象。
//Animal a = new Cat();
多态的好处:
提高了程序的扩展性。
多态的弊端:
当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。
(前期不能使用后期产生的功能,即访问的局限性)
多态的前提:
1:
必须要有关系,比如继承、或者实现。
2:
通常会有覆盖操作。
匿名内部类:
没有名字的内部类。
就是内部类的简化形式。
一般只用一次就可以用
这种形式。
匿名内部类其实就是一个匿名子类对象。
想要定义匿名内部类:
需要前提,内部类必须继承一个类或者实现接口。
匿名内部类的格式:
new 父类名&接口名(){ 定义子类成员或者覆盖父类方法 }.方法。
匿名内部类的使用场景:
当函数的参数是接口类型引用时,如果接口中的方法不超过3个。
可以通过匿名内部类来完成参数的传递。
其实就是在创建匿名内部类时,该类中的封装的方法不要过多,最好两个或者两个以内。
枚举类
使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;
枚举类的对象是固定的,实例个数有限,不可以再new(),枚举对象后可以跟()。
枚举元素必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔。
枚举类的构造方法的权限修饰符默认是private;
一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;
所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
所有枚举类都提供一个静态的valueOf(Stringname)方法,返回枚举类中对象名等于name的对象。
Eg:
publicenumColor{
RED(),GREEN(){},BLUE{};
}
异 常:
★★★
异常处理原则:
功能抛出几个异常,功能调用如果进行try处理,需要与之对应的catch处理代码块,这样的处理有针对性,抛几个就处理几个。
特殊情况:
try对应多个catch时,如果有父类的catch语句块,一定要放在下面。
throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在函数内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开。
throws用在函数上。
3多线程
线程的2种创建方式(必问)
创建线程的第一种方式:
继承Thread ,由子类复写run方法。
步骤:
1,定义类继承Thread类;
2,目的是复写run方法,将要让线程运行的代码都存储到run方法中;
3,通过创建Thread类的子类对象,创建线程对象;
4,调用线程的start方法,开启线程,并执行run方法。
线程状态:
新建:
start()
运行:
具备执行资格,同时具备执行权;
冻结:
sleep(time),wait()—notify()唤醒;线程释放了执行权,同时释放执行资格;
临时阻塞状态:
线程具备cpu的执行资格,没有cpu的执行权;
消亡:
stop()
创建线程的第二种方式:
实现一个接口Runnable。
(Runnable)
步骤:
1,定义类实现Runnable接口。
2,覆盖接口中的run方法(用于封装线程要运行的代码)。
3,通过Thread类创建线程对象;
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。
为什么要传递呢?
因为要让线程对象明确要运行的run方法所属的对象。
5,调用Thread对象的start方法。
开启线程,并运行Runnable接口子类中的run方法。
Ticket t = new Ticket();
直接创建Ticket对象,并不是创建线程对象。
因为创建对象只能通过new Thread类,或者new Thread类的子类才可以。
所以最终想要创建线程。
既然没有了Thread类的子类,就只能用Thread类。
*/
Thread t1 = new Thread(t); //创建线程。
/*
只要将t作为Thread类的构造函数的实际参数传入即可完成线程对象和t之间的关联
为什么要将t传给Thread类的构造函数呢?
其实就是为了明确线程要运行的代码run方法。
多线程安全问题的原因:
通过图解:
发现一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据。
导致到了错误数据的产生。
涉及到两个因素:
1,多个线程在操作共享数据。
2,有多条语句对共享数据进行运算。
原因:
这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他线程执行了。
解决安全问题的原理:
只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。
如何进行多句操作共享数据代码的封装呢?
java中提供了一个解决方式:
就是同步代码块。
格式:
synchronized(对象) { // 任意对象都可以。
这个对象就是锁。
需要被同步的代码;
}
Synchronized(自己得会写得出)
wait和sleep区别:
分析这两个方法:
从执行权和锁上来分析:
wait:
可以指定时间也可以不指定时间。
不指定时间,只能由对应的notify或者
notifyAll来唤醒。
sleep:
必须指定时间,时间到自动从冻结状态转成运行状态(临时阻塞状态)。
wait:
线程会释放执行权,而且线程会释放锁。
Sleep:
线程会释放执行权,但不是不释放锁。
什么时候产生死锁,该怎么办?
一般造成死锁必须同时满足如下4个条件:
1,互斥条件:
线程使用的资源必须至少有一个是不能共享的;
2,请求与保持条件:
至少有一个线程必须持有一个资源并且正在等待获取一个当前被其它线程持有的资源;
3,非剥夺条件:
分配资源不能从相应的线程中被强制剥夺;
4,循环等待条件:
第一个线程等待其它线程,后者又在等待第一个线程。
因为要产生死锁,这4个条件必须同时满足,所以要防止死锁的话,只需要破坏其中一个条件即可
4 集合框架
自己能画出来,并且附带方法和步骤以及特性以及各自的遍历方式.
常用的ArrayList HashSet
Collection:
|--List:
有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。
元素可以重复。
|--Set:
无序(存入和取出顺序有可能不一致),不可以存储重复元素。
必须保
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 必须 掌握 重点 知识