一、笔记:
现实中什么是异常?
人生病:发生了不正常现象
病:严重:癌症晚期... 不进行治疗
不严重:肚疼 感冒 发烧 ..... 进行针对性的治疗
程序中:
异常:不正常的现象
Throwable|-Error:程序员不会对这类异常进行处理
|-Exception:程序员会编写针对性的代码进行处理
java中将Error Exception 定义为所有异常的父类
Throwable |-Error
|-Exception|-编译时异常
|-运行时异常|-ArrayIndexOutOfBoundsException
|-NullPointerException
|-ArithmeticException
当发生Exception时,程序员应该编写一定的代码进行处理异常,如果程序员没有处理异常,JVM会帮助处理异常。
JVM处理异常的方式:调用printStackTrace()将异常的详细信息打印出来并停止程序
处理异常的方式:
1.抓
try{//尝试
尝试执行可能会发生异常的代码
}catch(异常类 起个名字){//捕获,抓
处理异常的方式
}
2.抛poj
在方法的声明处将异常声明出来:throws声明一个异常
自定义异常:
1.创建一个类继承Exception
2.在自定义异常中将Exception中的带有message的构造器指定出来
3.当满足该异常情况下,使用throw抛出该异常对象
4.在方法的声明处将自定义异常声明出来
throws和throw的区别?
throws在方法的声明处声明异常类 throws后边跟的是异常类名
throw在方法的内部抛出异常对象 throw后边跟的是异常的对象
回顾:
面向对象的三大特征
封装:提供属性对应的set() get()
继承:子承父业 使用extends让类和类之间产生继承关系
多态:一类事物的多种表现形态 父类的引用指向子类对象
关键字:
修饰符:
static 静态的
1.静态的只能访问静态的
2.被静态修饰后可以使用类名直接调用
final 最终的
修饰后的类不能被继承
修饰后的成员变量是一个常量
修饰后的方法不可以重写
Object:所有类的根类
toString():会返回一个字符串 直接打印对象就是默认调用toString方法。有时候有必要去重写toString
返回的字符串默认:包名+ 类名 + @ + 哈希值转换成16进制表现形式
类的高级特性:
抽象:abstract
抽象类:包含有抽象方法的类
抽象方法:没有方法体的方法,被abstract修饰的。
接口:特殊的抽象类。 暴露在外的规则
类的高级特性===>抽象类
•抽象(abstract):笼统的,模糊的,不具体的东西。(看不懂的)
•概念:当多个类中出现了相同功能,但是功能主体不同。这时也可以进行向上抽取。这时,只抽取对功能的定义,而不抽取功能主体。功能主体由子类去完成。被abstract修饰的方法就叫做抽象方法,而具有抽象方法的类就叫做抽象类。
•抽象类的特点:
1.抽象方法一定定义在抽象类中。
2.抽象方法和抽象类必须被abstract修饰。
3.抽象类不可以被实例化(创建对象),因为调用抽象方法没有意义。
4.抽象类中的方法要被使用,必须由子类复写其所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么子类也是一个抽象类。
5.抽象类是为了继承而产生的。
6.抽象类具有强制性。
7.抽象类中可以有不抽象的方法。
•抽象类和一般的类没有太大不同。
•该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。这些不确定的部分,也是事物的功能,需要明确出现,但是无法定义主体。通过抽象方法来表示。
需求:获取一段程序的运行时间。
原理:获取程序开始和结束的时间并相减即可。
接口(interface)---规则
•初期理解:接口是一个特殊的抽象类。
•接口是暴露在外的规则。
定义类:class 定义接口:interface
特点:
1、接口中的变量是一个常量
2、接口中的方法是一个抽象方法
接口中的成员有固定格式:
常量:public static final 数据类型 常量名 = 常量值;
方法:public abstract 返回值类型 方法名(参数列表);
接口是为了提供功能扩展。
接口就是外加功能扩展。
•java中只支持单继承,不支持多继承,但是可以多层继承。
•Java中可以单继承、多实现。
•类与类之间:继承
•类与抽象类之间:代码中是继承、概念中是实现
•类与接口之间:实现
•接口与接口之间:继承,还可以多继承
多态:
•定义:某一事物的多种存在形态
•例:动物中猫,狗。
•猫这个对象对应的类型是猫类型。
–猫 x=new 猫();
•同时,猫也是动物的一种,也可以把猫称为动物。
–动物 y = new 猫();
–动物是猫和狗具体事物中抽取出来的父类型。
–父类的引用指向子类对象
•多态的体现
–父类的引用指向子类对象
–父类的引用可以接收自己的子类对象
•多态的前提
–必须是类与类之间具有关系:要么继承,要么实现
–通常还有一个前提:就是存在覆盖(复写、重写)。
•多态的好处
–多态的出现大大提高了程序的可扩展性。
多态的弊端
–虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员
–程序从编译到执行分为两个状态:
–编译时状态
•系统会认为对象引用是左边类型,而左边类型只能调用自己的方法。
–运行时状态
•因为对象的引用指向的子类对象,运行时会出现子类重写后的效果。
•static(静态)关键字:修饰符,用来修饰类的成员
•静态的只能访问静态的。
•静态的成员可以使用类名.直接调用,随着类的加载而加载,随着类的消亡而消亡,优先于对象存在。
•静态修饰后的成员被所有对象所共享。
•注:
•1.静态尽量少加为妙
•2.静态方法中不可以出现this、super关键字。
•掌握:
•1.静态的只能调用静态的。
•2.当我们在测试时,看到被static修饰后的成员,第一时间想到可以使用类名直接调用。
二、老铁 做题吧
1.
定义年龄异常、身份证异常、工资异常
编写员工类,属性有:姓名、年龄、身份证 、工资,定义构造器初始化所有属性,要求:
当年龄小于18岁时,抛出年龄低异常
当年龄大于60岁时,抛出年龄高异常
public class Employee {
private String name ;
private int age;
public Employee(String name, int age) throws Exception{
this.name = name;
setAge(age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) throws Exception{
if(age <18) {
throw new AgeException("年龄低了");
}else if(age >60) {
throw new AgeException("年龄高了");
}else {
this.age = age;
}
}
}
public class AgeException extends Exception{
public AgeException(String msg){
super(msg);
}
}
public class Test {
public static void main(String[] args) {
Employee ep =null;
try {
ep = new Employee("aa", 88);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.
一、 语言和环境
1. 实现语言:Java
2. 环境要求:JDK1.4或以上版本及其联机帮助文档
二、 要求
1、测试时在控制台输出该饮料类型的味道
2、如果没有该种饮料,则输出没有
三、 推荐实现步骤
1、建立一个Java抽象类Drink,应当:
a、声明一个抽象方法taste(),该方法负责输出饮料的味道;
b、声明int型常量来代表不同的饮料类型(咖啡、啤酒、牛奶),如: c、声明静态工厂方法getDrink(int drinkType),根据传入的参数创建
不同的饮料对象,并返回该对象,建议使用switch语句。该方法要求声明DrinkNotFoundException,当没有相对应的饮料类型时,抛出该异常。
2、建立Drink的具体子类:
a、分别建立Drink的子类:Coffee(代表咖啡),Beer(代表啤酒),Milk(代表牛奶);
b、实现taste()方法,要求在控制台打印各自的味道特征。
3、建立异常类DrinkNotFoundException
a、继承Exception
b、在Drink的方法getDrink(int drinkType)中声明引发DrinkNotFoundException异常,当传入的参数没有相对应的饮料类型时,抛出异常。
c、在使用getDrink方法的类中捕捉该异常。
4、建立Test测试类,测试以上内容的正确性
a、编写main方法, b、在main方法中,调用Drink类的getDrink方法,获得相应的饮料对象。注意捕获DrinkNotFoundException。
c、然后调用该饮料对象的taste()方法,输出该饮料的味道。
5、编译程序,并运行。
四、 注意事项
1、仔细审题,把题目要求理解准确;
2、请注意多态性的运用;
3、请注意代码的书写、命名符合规范,应有适当的注释。
public class Coffee extends Drink{
@Override
public void taste() {
System.out.println("咖啡:苦味");
}
}
public abstract class Drink {
static final int COFFEE =1;
static final int BEER =2;
static final int MILK =3;
public abstract void taste();
public static Drink getDrink(int drinkType)throws 没有饮料Exception{
switch(drinkType) {
case COFFEE:
return new Coffee();
case BEER:
return new Beer();
case MILK:
return new Milk();
default:
throw new 没有饮料Exception("没有这个饮料");
}
}
}
public class Beer extends Drink{
@Override
public void taste() {
System.out.println("啤酒:马尿味");
}
}
public class Milk extends Drink{
@Override
public void taste() {
System.out.println("牛奶:腥味");
}
}
public class TestDrink {
public static void main(String[] args) {
try {
Drink.getDrink(4).taste();
} catch (没有饮料Exception e) {
e.printStackTrace();
}
}
}
public class 没有饮料Exception extends Exception{
public 没有饮料Exception(String message) {
super(message);
}
}