抽象这个词,顾名思义,从众多的事物中抽出像的部分,也就是说这个类是作为一个父类的总体的存在,是集合来了子类和把他作为接口的类的抽象部分;

在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());
  }
 }//输出结果: