java总复习(二)

一、接口和抽象类的区别

1.应用场景:
抽象类:指的是对一种事物的抽象。(比如一个People类中有定义一个work方法,此时子类的不同,所实现的work不同)
接口:基于jdk1.8,包含有抽象方法和常量。是对一种行为的抽象。
比如说ArrayList和LinkedList都有实现List接口,也就是说List接口对ArrayList和LinkedList的增删改查行为进行抽象。
2.抽象类:

  • abstract修饰
  • 不能实例化
  • 一般使用,实例类extends抽象类,实现里面的抽象方法,但不规定是全部实现。
  • 抽象类相比实例类来说,抽象类中可以包含抽象方法,但是不能实例化对象,而实例类相反。
 含有抽象方法的类一定是抽象类
 抽象类一定含有抽象方法---》错误!!!

3.接口:(基于jdk1.8)

  • 使用interface修饰
  • 接口不能实例化对象
  • 抽象方法的默认修饰:public abstract
  • 常量的默认修饰:public static final
  • 接口的使用:class Test implements 接口1,接口2{}
  • 继承与实现:先继承再实现
class test extendsimplements 接口1,接口2{}

二、浅谈异常

2.1.基础常见异常

算术运算异常:ArithmeticException
数组下标越界异常:ArrayIndexOutofBoundException
数组下标负数异常:NegativeArraySizeException
空指针异常:NullPointerException
类型强制转换异常:ClassCastException
安全异常:SecurityException
传递非法参数:SecurityException

2.2继承结构

在这里插入图片描述
Error错误:一般是程序无法处理的错误,表示运行程序有较大问题,大多错误与代码的编写没有关系。
Exception异常:程序本身可以处理的异常。
编译期异常:是RuntimeException以外的异常,是程序语法上必须处理的异常,如果不处理,程序就不能编译通过。如IOExceptionSQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

运行期异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过

2.3异常处理机制

常见的关键字

try、catch、finally、throw、throws

基本语法:

try{
   可能发生异常的代码
}catch(关心异常的具体类,不关心的异常基类处理){
}finally{
无论代码发生异常,代码必定执行
(排除System.exit(1);情况,若上面的代码块中有出现该代码,则不会执行finally块)
}
throw扔的是异常对象
例如代码:
int peek(){
  if(size==0){
          throw扔异常对象; throw new Exception
         }
     return ...;
 }
不想用try,catch处理编译期异常时,可以使用throws扔
void fun throws 异常类{

}

三、Object类中的方法

  1. clone():受保护权限,再使用clone()方法是要实现Cloneable方法。
class Student implements Cloneable{
   @Override
   protected native Object clone() throws CloneNotSupportedException{
       return super.clone();//浅拷贝形式
   {
}

浅拷贝与深拷贝:如果拷贝后与拷贝前的变量存在内存共享,则为浅拷贝。没有则为深拷贝。
2. getclass():获取当前类的class对象,目的是为了获得运行时的类型
3. toString(): 输出一个对象的地址字符串(哈希code码),通过重写来获取对象属性。
4. equals:在Object中和==相同
equals和 ==在比较对象上的不同。

"== "比较的是内存中存放的对象的内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象
“equals”:不能做基本类型的比较,引用类型如果不重写比较的是地址值,重写之后比较的是内容.
5. finalize():用于资源释放,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
6.hashcode():返回该对象的哈希码值。
在集合中重写的时候要重写equals()方法和hashcode()方法,只重写其一能满足吗?
new了两个对象,p1和p2。
假如只重写equals而不重写hashcode,那么类的hashcode方法就是Object默认的hashcode方法,根据对象的内存地址经哈希算法得来的,如果重写equals方法后得到的p1==p2,那么它们所对应的hashcode值也相等。不重写equals方法得到的p1!=p2时对应的hashcode不一定相等,此时就矛盾了,因此重写equals方法时也要重写hashcode方法。

两个对象相等,hashcode一定相等
两个对象不等,hashcode不一定不等
hashcode相等,两个对象不一定相等
hashcode不等,两个对象一定不等

线程间通信方法:
8.wait():调用一个对象的wait方法,会导致当前持有该对象锁的线程等待,直到该对象的其他持锁线程调用notify()notifyAll()唤醒。
9.notify():唤醒在此对象监视器上等待的单个线程。
10.notifyAll():唤醒在此对象监视器上等待的全部线程。
8/9/10需要注意的问题:
1)调用的notify()wait()必须是同一个对象
2)对于notify()notifyAll()wait()的调用,必须是在该对象的同步代码块中调用。
3)wait()方法在调用进入阻塞之前会释放锁,其他线程才能获取锁,获取锁进行通知notify()操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值