Uno: ¿Por qué debería haber herencia?
1. Reducir la redundancia de código y mejorar la reutilización del código
2. Facilitar la expansión de funciones
3. Proporcionar un requisito previo para el uso posterior del polimorfismo
Dos: formato de herencia: la clase A se extiende a B {}
A: subclase, clase derivada
B: clase principal, superclase, clase base
Una vez que A hereda la clase principal B, la subclase A obtiene todas las estructuras, propiedades y métodos declarados en la clase principal B.
Especial, en la clase principal Declare propiedades o métodos privados. Después de que la subclase hereda la clase principal, todavía piensa que ha adquirido la estructura privada en la clase principal. Solo debido al impacto de la encapsulación, la subclase no puede llamar directamente a la estructura de la clase principal.
Además: subclase Después de heredar la clase principal, también puede definir sus propios atributos o métodos únicos para lograr una expansión funcional
Clase padre:
Person.java
package com.xx.study;
public class Person {
String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
}
public Person(String name,int age) {
this.name=name;
this.age=age;
}
public void eat() {
System.out.println("吃饭");
}
public void sleep() {
System.out.println("睡觉");
}
}
Subclase:
Student.java
package com.xx.study;
public class Student extends Person{
String major;
public Student() {
}
public Student(String name,int age,String major) {
this.name=name;
setAge(age);
this.major=major;
}
public void study() {
System.out.println("学习");
}
}
Clase de prueba: PersonTest.java
package com.xx.study;
public class PersonTest {
public static void main(String[] args) {
Person p1=new Person();
Student s1=new Student();
s1.setAge(18);
s1.study();
System.out.println(s1.getAge());
}
}
Tres: disposiciones sobre herencia
Cuatro: el objeto es la clase principal de todas las clases
Cinco: ejercicios de herencia
1.
ManKind.java
package com.xzx.contact;
public class ManKind {
private int sex;
private int salary;
public ManKind() {
}
public ManKind(int sex, int salary) {
this.sex = sex;
this.salary = salary;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public void manOrWoman() {
if (sex == 1) {
System.out.println("man");
} else if (sex == 0) {
System.out.println("woman");
}
}
public void employeed() {
String jobInfo = (salary == 0) ? "no job" : "job";
System.out.println(jobInfo);
}
}
Kids.java
package com.xzx.contact;
public class Kids extends ManKind{
private int yearsOld;
public Kids() {
}//空参构造器
public Kids(int yearsOld) {
//有参构造器
this.yearsOld=yearsOld;
}
public int getyearsOld() {
return yearsOld;
}
public void setyearsOld(int yearsOld) {
this.yearsOld=yearsOld;
}
public void printAge() {
System.out.println(yearsOld);
}
}
KidsTest.java
package com.xzx.contact;
public class KidsTest {
public static void main(String[] args) {
Kids someKids = new Kids();
someKids.setSalary(100000);
System.out.println(someKids.getSalary());
Kids someKids2 = new Kids(1);
System.out.println(someKids2.getyearsOld());
}
}
2:
Circle.java
package com.xzx.contact;
public class Circle {
private double radius;
public Circle() {
radius=1;
}
public void setRadius(double radius) {
this.radius=radius; //和形参命名冲突所以要加this
}
public double getRadius() {
return radius;
}
public double findArea() {
return Math.PI*radius*radius;//这里不用加this.radius
}
}
Cylinder.java
package com.xzx.contact;
public class Cylinder extends Circle {
private double length;
public Cylinder() {
length = 1.0;
}
public void setLength(double length) {
this.length = length;
}
public double getLength() {
return length;
}
public double findVolume() {
//return Math.PI * getRadius() * getRadius() * length;
return findArea()*length;
}
}
CylinderTest.java
package com.xzx.contact;
import javax.swing.text.html.CSS;
public class CylinderTest {
public static void main(String[] args) {
Cylinder cy = new Cylinder();
cy.setRadius(2.1);
cy.setLength(3.4);
double area=cy.findArea();
System.out.println(area);
double volume=cy.findVolume();
System.out.println(volume);
}
}
Seis: el proceso de instanciación de objetos de subclase
Siete: herencia de clases y súper ejemplos
Account.java
package com.xx.study1028;
public class Account {
private int id;
private double balance;
private double annuallnterestRate;
public Account(int id,double balance, double annuallnterestRate) {
this.id=id;
this.balance=balance;
this.annuallnterestRate=annuallnterestRate;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getAnnuallnterestRate() {
return annuallnterestRate;
}
public void setAnnuallnterestRate(double annuallnterestRate) {
this.annuallnterestRate = annuallnterestRate/12;
}
public void withdraw(double amount) {
if(amount<balance) {
balance-=amount;
return;
}
System.out.println("余额不足");
}
public void deposite(double amount) {
balance+=amount;
}
}
AccountTest.java
package com.xx.study1028;
public class AccountTest {
public static void main(String[] args) {
Account acct=new Account(1122,20000, 0.0045);
acct.withdraw(30000);
System.out.println(acct.getBalance());
acct.withdraw(2500);
acct.deposite(3000);
System.out.println("余额是"+acct.getBalance()+"月利率是"+acct.getAnnuallnterestRate()*100+"%");
}
}
CheckAccount.java
package com.xx.study1028;
public class CheckAccount extends Account{
private double overdraft;
public CheckAccount(int id, double balance, double annuallnterestRate,double overdraft) {
super(id, balance, annuallnterestRate);
this.overdraft=overdraft;
}
public double getOverdraft() {
return overdraft;
}
public void setOverdraft(double overdraft) {
this.overdraft = overdraft;
}
public void withdraw(double amount){
if(getBalance()>amount) {
//余额足够消费
//方式一:setBalance(getBalance()-amount);
//方式二
super.withdraw(amount);
}else if(overdraft>=amount-getBalance()) {
//透支余额+余额足够消费
overdraft-=(amount-getBalance());
setBalance(0);
}else {
System.out.println("超过可透支限额");
}
}
}
CheckAccountTest.java
package com.xx.study1028;
public class CheckAccountTest {
public static void main(String[] args) {
CheckAccount ckAccount=new CheckAccount(1122, 20000, 0.045, 5000);
ckAccount.withdraw(5000);
System.out.println("余额是"+ckAccount.getBalance()+"可透支"+ckAccount.getOverdraft());
ckAccount.withdraw(18000);
System.out.println("余额是"+ckAccount.getBalance()+"可透支"+ckAccount.getOverdraft());
ckAccount.withdraw(3000);
System.out.println("余额是"+ckAccount.getBalance()+"可透支"+ckAccount.getOverdraft());
}
}