抽象这个词,顾名思义,从众多的事物中抽出像的部分,也就是说这个类是作为一个父类的总体的存在,是集合来了子类和把他作为接口的类的抽象部分;
在Java语法中,抽象类内部必须含有至少一个抽象方法,则类名前的abstract修饰词才不会报错;
抽象类中可以有具体实现的方法,但一定会存在需要子类实现的方法;
对于子类,必须实现其继承的父类的全部抽象方法,否则编译出错;
1、关于继承中的构造方法
子类继承的时候,会继承父类中有访问权限的(比如public修饰的)成员变量和成员方法,还有构造方法,对于父类构造方法,可以调用父类的构造方法,但子类不能重载父类的构造方法,由于在java中类的构造方法与类的名称相同,不可能子类和父类使用相同的类名称,因此子类也就不能重载父类的构造方法,但子类可以通过super来调用父类的构造方法。
关于子类中对父类构造方法的调用,如果父类的构造方法无参数,则子类中的构造方法必须是无参的,否则报错;
同样,如果父类的构造方法是有参的,则在子类中必须调用父类的有参构造方法;
此时注意,如果在子类中不调用父类的构造方法,则默认调用父类的无参构造方法,如果父类中也没写构造方法,则系统会默认生成一个,如下面写的代码:
例子01
public static void main(String arg[]){
}
//这是一个根据车轮计算速度
private double turnRate;
//把返回车轮的半径的方法定义成抽象方法,这个抽象方法会在子类中实现
public abstract double getRadius();
public void setTurnRate(int turnRate) {
// TODO Auto-generated method stub
this.turnRate=turnRate;
}
//速度等于 车轮半径*2*PI*转速
public double getSpeed(){
return 3.14*2*getRadius()*turnRate;
}
}
//override
return 0.28;
}
public static void main(String args[]){
zilei csm=new zilei();//创建自身的对象后就可以调用父类的成员方法
csm.setTurnRate(15);
System.out.println(csm.getSpeed());
}
public zilei(){
super();
}
public double getRadius(){
return 0.28;
}
public static void main(String args[]){
zilei csm=new zilei();
csm.setTurnRate(15);
System.out.println(csm.getSpeed());
}
}
public class Employee {
private String name;
private int salary;
public Employee(String name,int salary){
this.name=name;
this.salary=salary;
}
public String getDetails(){
return "name:"+name+"\nSalary"+salary;
}
}
//子类经理也属于员工,所以继承父类
public class Manager extends Employee{
private int bonus;//经理的特殊之处在于经理有奖金
public Manager(String name,int salary,int bonus){
super(name,salary);
this.bonus=bonus;
}
public String getDetails(){
return super.getDetails()+"\nbonus:"+bonus;
}
}
//测试dome
public class TestDome {
public static void main(String []args){
Employee ma= new Manager("LIU",10000,2000);
System.out.println(ma.getDetails());
}
}
//输出结果: