Java基础之继承性与super

super 关键字的使用
super 理解为父类可以调属性方法构造器
super 的使用
在子类的方法或构造器中使用。通过“super.属性”或者“super.方法”的方式显示的调用
在父类中声明的属性或者方法。但是,通常情况下习惯省略super关键字
当子类和父类中定义了同名的属性时,想要调用父类的属性需要使用“super.属性”调用父类中的属性
当子类重写父类方法后想在子类中调用父类的方法就需要“super.方法名”调用父类的方法
super 构造器的调用
可以在子类的构造器中显示的使用“super(形参列表)”调用父类的构造器
“super(形参列表)”的使用必须出现在,子类构造器的首行
在构造器中只能调一次父类的构造器针对“this(形参列表)”与super(形参列表)只能二选一
在构造器的首行没有声明“this(形参类别)”或“super(形参列表)”,默认调用的时父类中空参构造器“super()”
在类的多个构造器中至少有一个类的构造器使用了super(构造器),调用父的构造器
子类对象实例化的全过程
1.从结果上来看(继承性)
子类继承父类后,就获取了父类中声明的属性与方法
创建子类对象在堆空间中加载所有父类中声明的属性和对象
2.过程上来看
通过子类的构造器创建子类对象时,一定会直接或者间接调用父类的构造器,进而调用父类的父类的构造器
直到调用了java.lang.Object类中空参构造器为止,正因为加载过所有父类的结构,所以才可以看到内存中所有父类
的结构、子类对象才可以考虑调用
虽然创建子类对象时,调用了父类的构造器,但自始至终只创建一个对象


super调方属性的测试
父类
package com.chenxi.java3;

public class Person {
    String name ;
    int age;
    int id= 1001;
    public  Person(){

    }
    public Person(String name){
        this.name= name;
    }
    public Person(int age){
        this.age= age;
    }
    public Person(String name,int age){
        this.age=age;
        this.name= name;
    }
    public void ead(){
        System.out.println("四圣汇诛仙");
    }
    public  void walk(){
        System.out.println("人走路");
    }

}

  子类

package com.chenxi.java3;
public class Student  extends  Person{
    String major;
    int id =1002;
    public Student(){

    }
    public Student(String major){
        this.major=major;
    }
    public void ead(){
        System.out.println("分辨忠与奸");
    }
    public  void  study(){
        System.out.println("哪吒");
    }
    public void show(){
        //name 表示当前对象。age表示调父类中对象
        System.out.println(this.name+super.age);
        System.out.println(id);//子类属性ID
        System.out.println(super.id);//super父类属性中ID
    }
}

  测试类


package com.chenxi.java3;
/*
super 关键字的使用
1.super理解为父类的
2.super 可以调用属性方法构造器
 */

public class StudentTewst {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
    }
}

测试

null0
1002

  super 调父类方法测试、

父类

package com.chenxi.java3;

public class Person {
    String name ;
    int age;
    int id= 1001;
    public  Person(){

    }
    public Person(String name){
        this.name= name;
    }
    public Person(int age){
        this.age= age;
    }
    public Person(String name,int age){
        this.age=age;
        this.name= name;
    }
    public void ead(){
        System.out.println("四圣汇诛仙");
    }
    public  void walk(){
        System.out.println("人走路");
    }

}

  子类

package com.chenxi.java3;
public class Student  extends  Person{
    String major;
    int id =1002;
    public Student(){

    }
    public Student(String major){
        this.major=major;
    }
    public void ead(){
        System.out.println("分辨忠与奸");
    }
    public  void  study(){
        System.out.println("哪吒");
        super.ead();//父类方法
        this.ead();//子类方法

    }
    public void show(){
        //name 表示当前对象。age表示调父类中对象
       // System.out.println(this.name+super.age);
        System.out.println(id);//子类属性ID
        System.out.println(super.id);//super父类属性中ID
    }
}

  测试类

package com.chenxi.java3;
/*
super 关键字的使用
1.super理解为父类的
2.super 可以调用属性方法构造器
 */

public class StudentTewst {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.show();
        s1.study();
    }
}

  父类

package com.chenxi.java3;

public class Person {
    String name ;
    int age;
    int id= 1001;
    public  Person(){

    }
    public Person(String name){
        this.name= name;
    }
    public Person(int age){
        this.age= age;
    }
    public Person(String name,int age){
        this.age=age;
        this.name= name;
    }
    public void ead(){
        System.out.println("四圣汇诛仙");
    }
    public  void walk(){
        System.out.println("人走路");
    }

}

  子类

package com.chenxi.java3;
public class Student  extends  Person{
    String major;
    int id =1002;
    public Student(){

    }
    public Student(String name,int age,String major){
        super(name,age);//表示调用父类的参数构造器name和age
        this.major=major;
    }
    public Student(String major){
        this.major=major;
    }
    public void ead(){
        System.out.println("分辨忠与奸");
    }
    public  void  study(){
        System.out.println("哪吒");
        super.ead();//父类方法
        this.ead();//子类方法

    }
    public void show(){
        //name 表示当前对象。age表示调父类中对象
       // System.out.println(this.name+super.age);
        System.out.println(id);//子类属性ID
        System.out.println(super.id);//super父类属性中ID
        System.out.println("父类age"+super.age+"父类name"+super.name);
    }
}

  测试类

public class StudentTewst {
    public static void main(String[] args) {
//        Student s1 = new Student();
//        s1.show();
//        s1.study();
        Student s2 = new Student("chenxi",9,"玉虚法术");
        s2.show();
    }
}
 
测试结果
1002
1001
父类age9父类namechenxi

   账户项目测试

子类

package com.chenxi.java3;

public class Account {
    private int id;
    private double balance;
    private double annualInterestRate;
    public Account (int id, double balance, double annualInterestRate ){
        this.id= id;
        this.balance= balance;
        this.annualInterestRate=annualInterestRate;

    }
//    public Account(){
//
//    }
    public int getId(){
        return id;
    }

    public double getBalance() {
        return balance;
    }

    public double getAnnualInterestRate() {
        return annualInterestRate;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public void setAnnualInterestRate(double annualInterestRate) {
        this.annualInterestRate = annualInterestRate;
    }
    public  double getMonthlylnterest(){
        return annualInterestRate/12;
    }

    /**
     *
     * @param amount
     * 取款操作
     */
    public void withdraw(double amount){
        if (balance >= amount){
            balance-=amount;
        }else {
            System.out.println("余额不足!");
        }
    }
    public void  deposit(double amount){
        balance+=amount;
        System.out.println("存钱成功,存入金额"+amount+"共计"+balance);


    }

}

  父类

package com.chenxi.java3;
/*
、创建 Account 类的一个子类 CheckAccount 代表可透支的账户,
该账户中定义一个属性 overdraft 代表可透支限额。
在 CheckAccount 类中重写 withdraw 方法,其算法如下:
 如果(取款金额<账户余额),
 可直接取款 如果(取款金额>账户余额),
  计算需要透支的额度 判断可透支额 overdraft 是否足够支付本次透支需要,
  如果可以  将账户余额修改为 0,
  冲减可透支金额 如果不可以  提示用户超过可透支额的限额

 */
public class CheckAccount extends Account{
    private double overdraft;//可透支限额
//    public CheckAccount(){
//
//    }
    public CheckAccount(int id, double balance, double annualInterestRate ,double overdraft){
        super(id,balance,annualInterestRate);//super构造器的调用
        this.overdraft= overdraft;
    }
    public void withdraw(double amount){
     if (getBalance()>=amount){
         setBalance(getBalance()-amount);
        }
     else if((overdraft+getBalance())>=amount){
          //  setBalance(0);
            overdraft -= amount;
            overdraft += getBalance();
            setBalance(0);
         //   return;

     }
//        else  if (overdraft>=amount-getBalance()){
//            overdraft-= (amount-getBalance());
//           setBalance(0);
//        }
        else {
         System.out.println("账户余额不足,取款失败");
        }
     }

    public double getOverdraft() {
        return overdraft;
    }

    public void setOverdraft(double overdraft) {
        this.overdraft = overdraft;
    }
//    public void  deposit(double amount) {
//        overdraft+=amount;
//
//        setBalance();
//    }
}

  测试类

package com.chenxi.java3;

public class CheckAccountTest {
    public static void main(String[] args) {
        CheckAccount checkAccount= new CheckAccount(1122,20000,0.0089,5000);
        checkAccount.withdraw(21000);
        System.out.println("账户余额为"+checkAccount.getBalance());
        System.out.println("可透支余额为"+checkAccount.getOverdraft());
    }
}

  测试结果

账户余额为0.0
可透支余额为4000.0

  

  





草都可以从石头缝隙中长出来更可况你呢
原文地址:https://www.cnblogs.com/rdchenxi/p/14631207.html