数组复制的常用方法有4种
for循环,效率最低
System.arraycopy() 效率最高
Arrays.copyOf() 效率次于第二种方法
Object.clone() 效率次于第二种和第三种
概念
抽象类是所加粗样式有子类的公共属性的集合
抽象类是对多个类的抽象结果
抽象类进一步描述了多个具体类的共同行为特征和行为
抽象类必须被继承才能使用
关键字abstract
Modifies abstract class ClassName;
{}
抽象类的修饰符必须是public 或者protected
用private修饰就不能被子类继承
抽象方法
abstract void method();
任何子类必须重写父类的抽象方法,或者声明自身为抽象类
继承抽象类
abstract class A{
public void method(){
System.out.println(“非抽象方法”);
}
public abstract void abstract_method();
}
class B extends A{
public void abstract_method(){
System.out.println("新方法“);
}
}
public class TestDemo{
public static void main(String []args)
{
A a = new B();
a.abstract_metfh454g4h87g8f78ijqanpanshohouxiweabwojieudeshiy9ignnigoaljfdlbghod();
}
}
psvm回车直接生成main函数
sout回车直接生成print框架
继承的抽象函数要进行重写
接口
接口的所有默认属性是public static final
接口的所有方法默认为public abstract
接口的实现
关键字implements可以有多继承
接口的主要功能是对行为的继承
异常处理
异常产生的原因:
1.非法数据
2.文件不存在
3.网络通信时连接中断,JVM内存溢出
异常的类型
检查性异常
打开不存在的文件的时候(不可预见)
运行时异常 (可预见)
会在编译时被忽略
错误
脱离控制的问题
在代码中通常被忽略
常见的有栈溢出
异常的分类
异常处理的根接口时throwable
两个子接口
error和exception
error:运行时环境发生的错误,系统错误类程序员无法处理
exception:程序运行中的异常
exception
runtime异常
程序运行时产生的异常,jvm会自动处理。典型的运行时异常有:数组下标越界异常
(IndexOutOfBoundsException)、空指针异常(NullPointerException)、对象类型强制转换异常
(ClassCastException)以及数组存储异常(ArrayStoreException,即数组存储类型不一致)等。
**非Runtime异常:**也叫检查异常,即编译器要求必须进行处理的异常,例如IOException、
SqlException。
异常处理机制:
try
catch
finally总会被执行的那个:主要用于回收在try块里打开的物力资源
有数据库连接,网络连接,磁盘文件
先执行finally再执行try或者catch中的return或者throw语句
另外,在以下3种特殊情况下finally块不会被执行
1.在 finally 代码块中产生了异常。
2.在前面的代码中使用System.exit()退出程序。
3.程序所在的线程死亡。
throws 关键字和 throw 关键字的区别如下∶
throws 用在方法声明后面,表示抛出异常,由方法的调用者处理,而throw用在方法体内,用来制造一个异常,由方法体内的语句处理。
throws是声明这个方法会抛出这种类型的异常,以便使它的调用者知道要捕捉这个异常,而 throw是直接抛出一个异常实例。
throws表示出现异常的一种可能性,并不一定会产生这些异常,但如果使用throw就一定会产生某种异常。
throw抛出异常
throws再方法声明中,声明可能抛出的异常
主方法上也可以用throws抛出,表示在主方法里可以不用强制性进行异常处理,出现了异常默认交给jvm处理,此时出现异常后面的程序都无法执行
printStackTrace()方法输出异常信息,信息更详细
getMessage()方法获取有关异常事件的信息。
toString()方法:获取异常的类型与性质。
自定义异常
所有异常都是throwable的子类
检查性异常继承Exception
运行时异常继承RuntimeException
在方法里抛出new 自定义的异常
在方法声明里throws可能出现的自定义异常
练习4
新买了一台电脑,这台电脑与其他的电脑不一样,无法正常启动开机(电脑品牌未声明)。使用继承来体现这个事件,并尝试利用"电脑品牌"引出空指针异常。
package Datawhale.totamo;
class computerException extends Exception{
computerException(String message){
super(message);
}
}
class Computer{
private String brand;
public Computer(){}
public void powerup()throws computerException{
if(brand == null)throw new computerException(“空指针异常”);
else{
System.out.println(brand+“开机”);
} }
}
public class testComputer extends Computer{
public static void main(String[] args) {
testComputer t1 = new testComputer();
try{
t1.powerup();
}catch(Exception e){
e.printStackTrace();
}
}
}
异常的使用原则:
异常处理的主要作用是捕捉并处理程序在运行时产生的异常。编写代码处理某个方法可能出现的异常时,可遵循以下原则∶
不要过度使用异常。虽然通过异常可以增强程序的健壮性,但使用过多不必要的异常处理,可能会影响程序的执行效率;
不要使用过于庞大的try-catch块。在一try块中放置大量的代码,这种写法看上去"很简单",但是由于try块中的代码过于庞大,业务过于复杂,会增加try块中出现异常的几率,从而增加分析产生异常原因的难度;
避免使用catch(Exception e), 如果所有异常都采用相同的处理方式,那么将导致无法对不同异常进行分类处理;
不要忽略捕捉到的异常,遇到异常一定要及时处理;
如果父类抛出多个异常,则覆盖方法必须抛出相同的异常或其异常的子类,不能抛出新异常。
练习5
模拟老师上课前的点名过程,并将旷课的学生作为异常抛出∶张三、李四、王五(老师在点名册上记下了“王五旷课”)。
package Datawhale.totamo;
class validException extends Exception{
public validException(String message){
super(message);
}
}
public class RollCall {
public static void Cutclass(String s[],String s1)throws validException{
for(int i=0;i<s.length;i++){
if(s[i]==s1){
throw new validException(“这个学生旷课”+s[i]);
}
}
}
public static void main(String[] args) {
String s[]={"张三","李四","王五"};
String valid = "王五";
try{
Cutclass(s,valid);
}catch (Exception e){
e.printStackTrace();
}
}
}
练习6
超市经常会对定价较市场价低的产品实施限购∶ 超市里的鲜鸡蛋每500 克 3.98 元,每人限购1500克。现将超过1500克的作为异常抛出,而对于满足条件的,计算出应付款
package abdl;
import java.util.Scanner;
class purchaseException extends Exception{
public purchaseException(String message){
super(message);
}
}
public class limitpurchase {
public static void buy(int g)throws purchaseException{
if(g>1500){
throw new purchaseException(“买的太多了,请您买少于1500g”);
}else {
System.out.println(“应付款:”+(float)(3.98*g)+“欢迎下次光临”);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“请告诉我你要买多少”);
try{
int g = sc.nextInt();
buy(g);
}catch(purchaseException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
sc.close();
System.out.println(“控制输入对象收尾完成”);
}
}
}