抽象这个词,顾名思义,从众多的事物中抽出像的部分,也就是说这个类是作为一个父类的总体的存在,是集合来了子类和把他作为接口的类的抽象部分;
在Java语法中,抽象类内部必须含有至少一个抽象方法,则类名前的abstract修饰词才不会报错;
抽象类中可以有具体实现的方法,但一定会存在需要子类实现的方法;
对于子类,必须实现其继承的父类的全部抽象方法,否则编译出错;
1、关于继承中的构造方法
子类继承的时候,会继承父类中有访问权限的(比如public修饰的)成员变量和成员方法,还有构造方法,对于父类构造方法,可以调用父类的构造方法,但子类不能重载父类的构造方法,由于在java中类的构造方法与类的名称相同,不可能子类和父类使用相同的类名称,因此子类也就不能重载父类的构造方法,但子类可以通过super来调用父类的构造方法。
关于子类中对父类构造方法的调用,如果父类的构造方法无参数,则子类中的构造方法必须是无参的,否则报错;
同样,如果父类的构造方法是有参的,则在子类中必须调用父类的有参构造方法;
此时注意,如果在子类中不调用父类的构造方法,则默认调用父类的无参构造方法,如果父类中也没写构造方法,则系统会默认生成一个,如下面写的代码:
例子01
public abstract class T01 {
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;
}
}
public class zilei extends T01{
//override
public double getRadius(){
return 0.28;
}
public static void main(String args[]){
zilei csm=new zilei();//创建自身的对象后就可以调用父类的成员方法
csm.setTurnRate(15);
System.out.println(csm.getSpeed());
}
}
有些父类自带构造方法,比如用来传入成员变量的构造方法,则在子类中,用super来调用上一级父类的构造方法,那么例01中的子类也可以这样写,也不会报错:
package T1;
public class zilei extends T01{
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());
}
}
如果父类的构造方法有参,在super调用时用super(x,y)这样的格式调用
2、super关键字
super关键字本质是调用父类空间;
super关键字在上面中有对调用构造方法的使用,除此之外还有其他作用:
用super关键字可以调用父类中的成员变量和成员方法;
如 super.someMethod();来调用上一级父类中的方法;此方法既可以调用父类定义的方法,也可以是父类继承的方法;此外,当子类中含有和父类相同的方法时用super调用父类的同名方法;
super.someMate可以调用父类的成员变量,注意:子类是继承父类有访问权限的成员变量的,但当子类中有和父类同名的成员变量的时候,只能用super.someMate来调用父类的有访问权限的成员变量;
总结:
1. 子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
2. 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
3.歪总结:super就是用来代替父类的类名的
例02
//写一个Employee作为父类
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());
}
}//输出结果: