黑马程序员-基础知识梳理4

------- android培训java培训、期待与您交流! ----------

finally 代码块:定义一定执行的代码块


第一种格式:try{}catch(){}

第二种格式:try{}  catch(){} finally{}

第三种格式:try{} finally{}

重点:catch是用于处理异常,如果没有catch就代表异常没有被处理,如果该异常是检测时异常,那么必须声明

异常在子父类覆盖中的体现:

1.子类在覆盖父类时,如果父类的方法抛出异常;那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类

2.如果父类抛出多个异常,那么子类在覆盖方法时,只能抛出父类方法的子集;

3如果父类或者接口的方法中,没有抛出异常,那么子类在覆盖方法时,也不可以抛出异常。如果子类发生异常必须try处理,绝对不能抛;


异常总结:

定义;将问题进行描述,将问题进行对象的封装

异常体系:

Throwalbe

|----Error

|----Exception

      |------RuntimeException


一般的异常在函数内抛,必须在函数上声明,否则编译失败。
RuntimeException 及其子类在函数内抛,不需要在函数上声明,编译一样通过。如果在函数上声明了该异常,调用可以不用进行处理。


为什么不声明?就是为了让他不处理这个异常。当该异常发生,希望该程序停止,在运行时,出现了无法处理的问题,希望程序停止后,程序员修正代码.



异常体系的特点:

异常体系中的所有类以及简历的对象都具备可抛性,均可以被throw和throws关键字操作,只有异常体系具备这些特点


当函数内容有throw抛出异常对象,并未进行try处理,必须要在函数上声明,否则编译失败,RuntimeException除外


异常处理分为throws 和try

注意:1.finally中定义的通常是关闭资源的代码,因为资源必须释放;

2,finally只有一种情况不执行,当执行System.exit();   此时,JVM关闭


自定义异常:

定义类继承Exception 或者RuntimeException

1,为了让该自定义异常具有可抛性

2,让该类具备操作异常的共性方法,当要定义自定义异常的信息时,可以使用父类已经定义好的功能,将异常信息传递给父类的构造函数。

自定义异常:按照java的面向对象思想,将程序中出现的特有问题进行封装


class MyException extends Exception

{

MyException(String message){

super(message);

}

}

异常的好处:

1,将问题进行封装

2,将正常流程代码和问题处理代码分离,方便阅读


异常处理原则:

1处理方式分:try或者throws

2 调用到抛出异常的功能时,抛出几个异常,处理几个,一个try对应多个catch

3 多个catch 父类的catch放在最下面

4 catch内需要定义针对性的处理方式,不要简单的定义printStackTrace输出语句


当catch 到异常,本功能处理不了时,可以继续在catch中抛出


try{

throw new AException;

}

catch(AException e){

throw e;

}

如果该异常处理不了,但并不属于该类功能的异常可以将异常转换后,在抛出和该功能能相关的异常,或者异常可以处理,但是需要将异常产生的和本功能相关问题提出,让调用者知道。也可以将捕获异常处理后,转换新的异常。

try{

throw new AException;

}

catch (AException e){

throw new BException;

}


非静态内部类中不可以定义静态成员。内部类中如果定义了静态成员,该内部类必须被静态修饰。


静态方法只能覆盖静态;

throw 单独存在时 下面不要跟语句。

习题:

//下列那些函数可以存在该类的子类中

class Demo1{
	int show (int a,int b){return 0;}
}

a.  public int show(int a ,int b){return 0;}//kyi 
b. private int show(int a,int b){return 0;}//no,权限不够,子类的覆盖方法权限必须大于等于父类
c. private int  show(long a,int b){return 0;}//可以,这是方法的重载
d. public short show(int a,int b){return 0;}//no,该方法不能存在于同一子父类中
e. static int show(int a, int b){ return 0;}//no 静态只能覆盖静态

包:定义包名,所有字母小写


包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰

不同包中的子类还可以直接访问父类中被protected权限修饰的成员。

包与包之间可以使用的权限有两种 public protected


                      public              protected              default        private

在同一个类中 y y y

在同一个包中 y y y  

子类 y y

不同包中 y


import:简化类名书写

一个java文件内不能出现2个或者2个以上的公有类或者接口

jar: 命令: jar -cf xx.jar 包 包


多线程:

进程:每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫控制单元;


线程:进程中的一个独立控制单元。线程在控制着进程的执行


一个进程中至少有一个线程

java VM启动的时候,会有一个进程 java.exe


该进程中至少有一个线程,负责java程序的执行,而且该线程运行的代码存在于main方法中,该线程称为主线程


如何在自定义的代码中,自定义一个线程?

步骤:

1 定义类继承Thread

2 复写Thread 类中的run方法,将自定义的代码存储在run方法中,让线程运行;

3 调用线程的start方法,该方法有2个作用:启动线程和调用run方法;


为什么要覆盖run方法?

Thread 类用于描述线程

该类定义一功能,用于存储线程要运行的代码。

 

static Thread currentThread(); 获取当前线程对象


getName();获取线程名称

设置线程名称:setName或者构造函数;


创建线程的另一种方法:

实现Runnable接口


步骤:

1定义类实现Runnable 接口

2 覆盖Runnable 接口中的run方法

3 通过Thread 类建立线程对象

4 将Runnable 接口的子类对象作为实际参数传递给Thread类的构造函数

5 调用Thread 类的start方法开启线程并调用Runnable接口子类的run方法;


为什么要将Runnable接口的子类对象传递给Thread的构造函数?


因为自定义的run方法所属对象是Runnable接口的子类对象,所以要让线程去指定对象的run方法。就必须明确run方法所属对象。


实现方式和继承方式有什么区别?

实现方式好处:避免了单继承的局限性。在定义线程时,建立实现方式;

继承Tread:线程代码存放在Thread子类run方法中,

实现Runnable:线程代码存在接口的子类的run方法中


多线程的安全问题:

问题原因:多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。


解决办法:

对多条操作共享数据的语句,只能让一个线程执行完。在执行过程中,其他线程不可以参与执行。


同步代码快:

synchronized (对象)

{

需要被同步的代码;

}

同步的前提: 1 必须要有两个或者两个以上的线程

2.必须是多个线程使用同一个锁


如何找到问题

1.明确那些代码是多线程运行代码

2.明确共享数据

3.明确多线程运行代码中那些语句是操作共享数据的


同步函数用的锁对象是this

如果同步函数被静态修饰,锁不是this ,因为静态方法中不能定义this

静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。类名.class 该对象的类型是class


重点掌握懒汉式一些问题:

static class Single{
	private static Single s= null;
	private Single(){}
	public static Single getInstance(){
		if(s==null){
			synchronized(Single.class){
				if(s==null)
					s=new Single();
			}
	}
	return s;

			}
	}
}

懒汉式和饿汉式有什么区别"?

懒汉式实现实例延迟加载

延时加在有问题,如果多线程加载会出现安全问题

处理:可以通过同步代码块或者同步函数来处理


用双重判断形式可以提高效率,加锁时候,使用的对象是该类所属对象的字节码对象


死锁:

多线程问题:多个线程操作同一个资源,但操作动作不同


等待唤醒机制


wait:

notify();

notifyAll();

都使用在同步中,因为要对持有监视器(锁)的线程操作,所以要使用在同步中。因为只有同步才有锁。

为什么这些操作线程的方法要定义在Object类中?

因为这些方法所操作的线程只有的锁,只有同一个锁上的被等待线程可以被同一个锁上的notify唤醒;不可以对不同锁中的线程进行唤醒。

而锁可以是任意对象,可以被任意对象调用的方法定义在object类中


对于多个生产者和消费者

为什么定义while判断标记?

为了让被唤醒的线程再一次判断标记


为什么要定义notifyall

因为需要唤醒对方线程

只用notify 容易出现只唤醒本方线程的情况,导致程序中的所有线程都等待。

java1.5的心特性


lock接口

condition接口


如何停止线程?

只有一种,run方法结束


开启多线程运行,运行代码通常是循环结构

只要控制住循环,就可以让run方法结束,也就是线程结束


特殊情况:当线程处于冻结状态,就不会读取标记,那么线程就不会结束


当没有指定的方式让冻结的线程恢复到运行状态时,这时需要对冻结进行清除。

强制让线程恢复到运行状态中来,这样就可以操作标记让线程结束


Thread类中提供该方法interrupted方法

setDaemon 守护线程:后台线程

后台线程“当所有前台进程结束后,后台进程自动结束


join:等待线程终止

当A线程执行到b线程的,join();方法时A就会等待。等b线程都执行玩了,A才会再执行。join可以用来临时加入线程执行

yield()方法:释放线程执行权;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值