Day12

本文介绍了Java中的异常处理机制,包括Error与Exception的区别、异常的抛出与捕获、自定义异常等,并探讨了多态的概念及其实现方式。

一、笔记:

现实中什么是异常?
人生病:发生了不正常现象

病:严重:癌症晚期... 不进行治疗
    不严重:肚疼  感冒 发烧 ..... 进行针对性的治疗


程序中:
异常:不正常的现象
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.静态方法中不可以出现thissuper关键字。

掌握:

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);
	}

	
	
	
}

不要去预见烦恼或担心可能永远不会发生的事情,置身于明媚的阳光之中吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值