继java的类和对象上,类和对象下相对比较深入,以及更难理解与掌握。
一、继承
Java里的继承是单继承的,没有C++里的多继承,且相对简单。
继承关键字为extends
一个子类只能有一个父类,但一个父类可有多个。
在继承关系中,子类会自动继承父类的方法,但有时需要在子类中对继承的方法进行重写,就叫对父类的重写。
子类访问父类的成员需要运用关键字super()。
格式为:super.成员变量
super.成员方法(参数1,参数2)
final关键字:用这个关键字修饰的类是没有子类的,叫最终类。此关键字可修饰方法,修饰类,以及修饰变量。
二、抽象类和接口
1、抽象类:抽象的类里不一定包含抽象的方法,但抽象的方法一定在抽象的类里。
抽象的类只有方法头,没有方法体。
为什么会有抽象的类??是为了满足不同的需求或者该方法的实现过程是不确定的。
关键字:abstract
注意:如果想调用抽象类里的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。
子类实现了父类的抽象方法后,可以正常实例化,并通过实例化对象调用
2、接口:如果一个抽象类中的所有方法都是抽象的,则可以用接口来表示这个类。
关键字:interface
一个接口可以继承多个父接口,之间用逗号隔开。一个类在继承类的同时还可以实现多个接口。
声明接口格式:public interface 接口名 { public abstract 返回值 抽象方法名(参数列表);}
接口实现声明格式为:修饰符 class 类名 implements 接口1 ,接口2·······
三、多态
object类:equals():判断其他某个类是否与此对象相等
getClass():返回此object的运行时类
hashCode():返回该对象的哈希码值
toString():返回该对象的字符串表示
接下来用一个实例来说明:
/*
* 交通工具类
*/
public abstract class Transportation {
private String number;//编号
private String model;//型号
private String admin;//运输负责人
//有参的构造方法
public Transportation(String number,String model,String admin)
{
this.setNumber(number);
this.setModel(model);
this.setAdmin(admin);
}
public abstract void transport();
public void setNumber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
public void setModel(String model) {
this.model = model;
}
public String getModel() {
return model;
}
public void setAdmin(String admin) {
this.admin = admin;
}
public String getAdmin() {
return admin;
}
}
//保养
public interface Careable {
public abstract void upKeep();
}
//运输类
public class Ztransportation extends Transportation implements Careable {
public Ztransportation(String number, String model, String admin) {
super(number, model, admin);
// TODO Auto-generated constructor stub
}
//继承父类Transportation的方法
public void transport() {
// TODO Auto-generated method stub
System.out.println("运输进行中····");
}
@Override
//重写接口的方法
public void upKeep() {
// TODO Auto-generated method stub
System.out.println("车辆保养完毕!");
}
}
//运送货物
public class SendTask {
private String number;//快递单号
private double goodsWeight;//货物重量
//有参的构造方法
public SendTask(String number,double goodsWeight)
{
this.setNumber(number);
this.setGoodsWeight(goodsWeight);
}
//送单之前需检验
public void Sendbefore()
{
System.out.println("订单开始处理,仓库验货中···");
System.out.println("货物重量:"+ this.getGoodsWeight()+"Kg");
System.out.println("货物检验完毕");
System.out.println("货物填装完毕");
System.out.println("订单号为:"+this.getNumber());
}
//发送货物
public void Send(Transportation t)
{
System.out.println("运货人:"+t.getAdmin()+"货车编号:"+ t.getNumber()+"货车型号"+t.getModel());
t.transport();
}
//货物已送
public void SendAfter(Transportation t)
{
System.out.println("货物已送达!");
System.out.println("运货人:"+t.getAdmin()+"货车编号:"+ t.getNumber()+"货车型号"+t.getModel()+"已归还");
}
public void setGoodsWeight(double goodsWeight) {
this.goodsWeight = goodsWeight;
}
public double getGoodsWeight() {
return goodsWeight;
}
public void setNumber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
}
//测试类
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SendTask sendtask = new SendTask("hg666666",10.0);
Ztransportation t = new Ztransportation("陕A66666","五菱","小五");
sendtask.Sendbefore();
sendtask.Send(t);
sendtask.SendAfter(t);
t.upKeep();
}
}
运行结果如下:
四、异常
有时我们会在不希望程序出错的情况下出错它却出错了,当然我们都不希望程序出错。我们需要进行异常处理。
异常类在程序中提供了很多的处理函数。
Throwable 有直接的两个子类:error类和Exception类
1、出现异常时,我们通常有两种方法解决:一是异常捕获,二是抛出异常
异常捕获:
关键字:try{ 可能出错的程序 }catch(Exception e ){System.out.println(“捕获的异常信息为:”+e.getMessage);}
抛出异常:
关键字:throws(跟在需要的类名后面) throw(抛出异常语句)在使用这类语句时,需要在main中使用try catch 来捕获异常。
2、自定义异常:
自定义方式如下:所有的异常类都继承于Exception
public class DivideException extends Exception
{
public DivideException(String message)
{
super(message);
}
}
//使用throw关键字声明异常对象:
throw new DivideException("可能出错的信息");
//调用
try
{
可能出错的程序语句
}catch(Exception e )
{
System.out.println("捕获的异常信息为:"+e.getMessage);
}
这里特别提醒的是在自定义了异常类后调用时一定注意throw和throws,以及在主语句里的捕获异常(即try····· catch····)不要忘了。