【Java笔记】Java抽象类与继承的部分理解

来源:互联网 发布:java打印功能 编辑:程序博客网 时间:2024/06/04 17:30

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

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

//输出结果:



原创粉丝点击