一.java的二十三中设计模式:
1.单列设计模式(就是保证类对象的唯一性)
步骤:(1.)将本类的构造函数私有化。
(2.)在本类实例化一个静态的,私有的本类对象。
(3.)在本类提供一个共有的的,以本类为返回值的方法,在方法中返回一个本类对象的引用。
二.当子类和父类中的成员,完全相同时,怎么进行区分?
可以在要调用的父类成员前加上:super.进行与子类成员区分。
三.super与this关键字的区别:
this:代表一个本类对象的引用
super:代表一个父类空间
四.什么时候使用覆盖操作?
当对一个类进行子类扩展时,子类需要保留父类的功能声明,
但是要定义子类中该功能的特有功能时,就使用覆盖操作完成。
五.子类的实例化过程:
子类中所有的构造函数默认都会访问父类中的空参数的构造函数。
原因是:在子类的构造函数中第一行有一个默认的隐式语句:super();
注意:在子类的构造函数中super关键字与this关键字,只能存在一个。
六.常用的方法
toCharArray();//将字符串转换成字符,通常用字符型数组储存
七.final修饰符:
1.用final修饰的变量(通常称为常量),不能被改变。
注意:
写法规范:
一般常量名为全大写字母,变量名为全小写的字母。
2.用final修饰的方法,不能被覆盖。
3.用final修饰的类,不能被继承。
八.abstract修饰符 //抽象:
1.用abstract修饰的类是抽象类,抽象类是对事物的不具体、大致的描述,抽象类不能被实例化,因为没有
意义。和一般类一样抽象类可以有构造函数,可以用子类对象对它实例化。
2.在abstract修饰的类和方法中,不能共存的修饰符有:
1.static
2.private
3.final
九.interface关键字定义接口与
implements关键字实现接口:
1.接口中的方法都是公共的,抽象的方法,只有公共的,静态的常量。
2.接口不能实例化,只能通过实现接口的子类,覆盖的接口中的所有方法后才可以实例化。
3.在其他类中调用接口中的成员时,可以通过接口名.(点),子类名.(点),实例子类的对象.(点)调用。
4.接口与接口之间的关系只有继承关系,并且接口不同于类,可以继承多个接口。
(接口与接口中没有实现,这一说法!)
十.写程序的常用思想:
1.在开始写一个程序的之前,先考虑程序的规则(接口),为了在以后的更新程序中扩展功能(对象)时可以
更方便,更随意!只有符合了规则(接口)才能在程序中使用新键的功能(对象)。
2.具体实现:1.先创建一个接口,在这个接口中定义一些抽象方法。
2.然后创建运行的类,在这个类的方法(最开始的功能)中的参数写一个这个接口类的变量。
3.在将你要添加的功能,通过实现接口的子类(新功能对象),并覆盖了接口中所有的方法(新
功能),在方法体中编写你需要的功能。
4.最后将实例化实现了接口的子类,设置为运行类中的方法的参数。
十一.使用多态的前提:
1.要存在继承,实现关系。
2.要有覆盖
多态的好处:通过父类的引用指向不同的子类(隐式向上转型),然后就可以通过父类的引用同时调用子类中
从父类继承过来的方法。
多态的缺点:不能通过父类的引用调用子类中的特有方法。如果你想调用子类中的特有方法,你可以通过该子
类的引用指向父类的引用(强制向下转型),然后就可以通过子类的引用调用子类中的特有方法。
instanceof关键字:用于判断对象的具体类型,通常只用于引用数据类型判断。
十二.内部类的特点
1.内部类:内部类可以直接访问外部类的成员。如果内部类中定义了静态成员,那么该内部类必须是静态的。
换而言之非静态内部类中不能存在静态成员。
2.外部类:外部类要想访问内部类的成员,需要同过内部类的实例对象来调用。
3.局部内部类:局部内部类如果想要访问局部内部类以外的成员就必须把为该成员修饰为最终成员(也就
是用final修饰)。
4.匿名内部类:是内部类的简写。条件:必须要继承一个类或实现一个接口。其实匿名内部类就是一个子
类对象!
十三.异常:
1.异常分为两大类:
(1.)一般不可处理的。Error
(2.)可以处理的。Exception
2.自定义异常类:
如果想自己把类定义成异常类,就必须把这个类继承父类Exception,这样这个类才具有抛出
的特性,才可以在发生异常的代码块中抛出自定义异常类。
3.异常语法:
如果在一个方法内抛出(throw)了一个异常,那么在该方法的后面声明(throws)一个异常
类或者捕获(try——catch)异常代码块,否则编译失败。
4..使用try捕获异常:
用try捕获发生多个异常的代码块时,可以使用多个catch针对式的处理这多个异常,注意:
在使用多个catch处理异常的是,异常类的父类必须放在catch代码块的最后一位。
5.finally{ }:
不管在try{ }的代码块中发不发生异常,finally{ }中的代码必须会执行,除非在该代码块之前
使用System.exit(0)方法退出了虚拟机(jvm)。通常适用于关闭(释放)资源。
6.异常中的注意事项:
1.子类在覆盖父类方法时,如果父类的方法抛出了异常,那么在覆盖父类的方法时只能抛出
父类中抛出的异常或者异常的子类。
2.如果父类抛出了多个异常,那么子类只能抛出父类异常的子集(就是父类已经抛出了异
常的其中几种)。
3.如果父类中的方法没有抛出异常,那么子类再覆盖时绝对不可以抛出异常!
十四.Object类
equals()方法,返回值是boolean类型,用于比较两个对象的地址,如果想要比较两个对象中某个成员内
容,通常需要重写该方法,语法格式:public boolean equals(Object obj){ }
十五.线程
1.概述:线程就是一个进程中负责程序执行的控制单元(执行路径)
一个进程可以执行多个路径,称为多线程。
2.要求:一个进程中至少要有一个线程。开启多线程是为了执行多部分代码。
3.线程的创建:
方式一:
1.定义一个类继承Thread类。
2.覆盖Thread类中的run()方法。
3.直接创建Thread的子类对象创建线程。
4.调用start方法开启线程并调用线程的任务run()方法执行。
方式二:
1.定义一个类实现Runnable接口
2.覆盖接口中的run()方法,将线程的任务代码封装到run方法中。
3.通过Thread类创建线程对象,并将Runnable接口的子类对象作为Thread类的构造函数
的参数进行传递。
4.调用线程对象的start方法开启线程。
4.线程中常用的的方法:
1.getName()方法;//获取线程的名称
2.currentThread()方法;//返回当前正在执行的线程对象的引用
3.因为在Thread类中的构造函数的参数有提供的给线程起名的功能,所以如果想给Thread类的子
类线程起名,可以在子类线程的构造方法中调用super(参数)方法,并在该方法的参数传入字符串的类型的名
称。那么该名称就是这个子类线程的名称。
5.线程的四种状态:
1.被创建
说明:使用new关键字创建继承Thread类的一个线程。
2.就绪
说明:当一个进程执行多线程,而CUP又只能处理一个线程,这个被CPU执行的线程就
具备着CUP的执行资格和CPU的执行权,而其他没被CUP处理的线程只具备CUP的执行资格,没有执行权,就处于等
待的状态,只有CUP处理到该线程时,该线程才具备CUP的执行权。
3.运行
说明:线程调用start()方法,开启线程的运行
4.冻结
说明:当该线程调用sleep(time)方法时,那么该线程将处于休眠状态,就是说该
线程停止运行,但是并没有消亡,当达到sleep(参数)方法中的参数的时间(通常以毫秒计算时间)后,线程
继续运行。或者调用wait()方法使线程处于休眠状态,但是线程就无法自己继续运行,需要手动调用notify()
方法唤醒线程,线程才能继续运行。
5.消亡
说明:run方法结束,那么该线程也就结束了,或者掉用stop()方法强制结束该线程。
十六.多线程的安全隐患
(1.)产出隐患的条件:
1.多个线程在操作共享数据
2.操作共享数据的代码有多条
产生隐患的原因:
1.当一个线程在操作共享的数据的多条代码时,有其他的线程参与的运算就会导致线程安全问题
的产生。
(2.)使用同步代码块解决多线程的安全隐患
1.同步代码块的的格式:
synchronized(对象){ //思想:其中的对象就好比时一把锁,如果在同步的代码中存在线程那么
// 其他的线程就不能进入同步的代码块中。
需要被同步的代码;
}
解决问题的思想:在一个线程操作一段共享代码时,不允许其他的线程参与进来。
2.同步的前提:
必须要让多个线程使用同一个锁(对象),不能让多个线程都具备着自己的锁(对象)。
(3.)同步函数
1.就是的将同步关键字作为普通函数的修饰符,那么该函数就是同步函数。
2.同步函数使用的锁是this(调用该函数的对象类)。
(4.)静态的同步函数使用的锁是,该函数所属字节码文件对象,可以用getClass()方法获取,
也可以用当前 类名.class表示。
(5.)死锁:通常发生在同步代码块的嵌套中。
十七.多线程之间的通讯
思想:多线程在处理同一个资源,但是每个线程的任务不同。
(1.)多线程的等待唤醒机制
在多线程的不同的任务处理同一个资源时,希望可以两个线程的执行权都轮流执行一次!我们可以在
第一个线程的里面使用逻辑判断都判断一次,如果为真那么就执行该线程的任务,如果为假就让该线程进入休眠
状态,并将逻辑判断的值赋值与它相反的值。然后在第二个线程里面也判断一次,如果为假就执行该线程的任务
,如果为真就使该线程进入休眠状态,并将逻辑判断的值赋值与他相反的值.
十八.lock接口
1.jdk1.5以后将同步和锁封装成了对象,并将操作锁的隐式方式定义到了该对象中,将隐式动作
变成了显示动作。同时更加的灵活,可以一个锁上加上多组监视器。
语法:
lock l=ReentrantLock();
l.lock(); //获取锁
try{
//需要同步的代码块
}
finally{
l.unlock; //释放锁
}
2.Condition接口:
替代了Object中的wait notify nottifyAll