继承
概述
继承就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非非私有的属性和行为。其由来就是当多各类中存在相同的属性和行为的时候,将这些内容抽取到单独的一个类当中,那么多个类无需再定义这些属性和行为,只要继承那一个类即可。好处有:1. 提高了代码的复用性。2.类与类之间产生了关系,是多态的前提。
继承后的成员变量和成员方法
- 成员变量
不重名的时候,子类和父类的使用变量不会有影响,但是重名的时候,当子类需要访问父类中非私有成员变量时,需要使用super关键字,修饰父类成员变量,才能使用父类的变量。 - 成员方法
当子类和父类出现一模一样方法(返回值类型,方法名和参数列表都相同)的情况时,子类的方法会覆盖父类的方法。声明不变,重新实现。叫做方法重写(Override)。
在重写时,调用父类的方法,使用super.父类成员方法,表示调用父类的成员方法。
子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
子类方法覆盖父类方法·,返回值类型、函数名和参数列表都要一模一样。
继承后的构造方法
构造方法:
- 构造方法的名字与类名一致的。所以子类是无法继承父类构造方法的。
- 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super(),表示调用父类的构造方法,父类成员变量初始化后,才能给子类使用。
使用super();语句即可调用父类构造方法。
super和this
每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。图解如下所示:
- super:代表父类的存储空间标识(可以理解为父亲的引用)。
- this:代表当前对象的引用(谁调用就代表谁)。
构造方法:
this():父类的构造方法。
super():子类的构造方法。
继承特点:
- Java只支持单继承,不支持多继承。
- Java支持多层继承(继承体系)。顶层父类是Object类。所有的类默认继承Object,作为父类。
- 子类和父类是一种相对的概念。
抽象类
父类中的方法,被他的子类继承并重写,子类各自实现的功能都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方向的类就是抽象类。
如果一个类包含抽象方法,那么该类必须是抽象类,而且,子类必须重写父类的所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
代码:
public abstract class Animal {
public abstract void run();
}
public class Cat {
public void run(){
sout("Cat likes fishes.");
}
}
发红包程序
public class User {
// User Variable
private double leftMoney;
private String userName;
// Constructor Method
public User(){}
public User(double leftMoney, String userName){
this.leftMoney = leftMoney;
this.userName = userName;
}
// get/set Method
public double getleftMoney(){
return leftMoney;
}
public void setLeftMoney(double leftMoney) {
this.leftMoney = leftMoney;
}
public String getuserName(){
return userName;
}
public void setuserName(String userName){
this.userName = userName;
}
public void show(){
System.out.println("Username: "+ userName + '\n' + " Balance: "+ leftMoney);
}
}
import java.util.ArrayList;
public class Leader extends User {
public Leader(){
}
public Leader(double leftMoney, String userName){
super(leftMoney, userName);
}
public ArrayList<Double> send(double money, int count){
double leftMoney = getleftMoney();
if (money > leftMoney)
return null;
setLeftMoney(leftMoney - money);
ArrayList<Double> list = new ArrayList<>();
money = money * 100;
double m = money / count;
for (int i = 0; i < count; i++) {
list.add(m / 100);
}
return list;
}
import java.util.ArrayList;
import java.util.Random;
public class Member extends User {
public Member(){}
public Member(double leftMoney, String userName) {
super(leftMoney, userName);
}
public void grab(ArrayList<Double> list){
Random rm = new Random();
int index = rm.nextInt(list.size());
double money = list.remove(index);
setLeftMoney(money);
}
}
import java.util.ArrayList;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
// show leader information
Leader leader = new Leader(1000,"GFY");
// Start giving away red pockets!
Scanner sc = new Scanner(System.in);
System.out.print("Please input the money of red pockets: ");
double money = sc.nextInt();
System.out.println();
System.out.print("Please input the amount of red pockets: ");
int count = sc.nextInt();
System.out.println();
ArrayList<Double> list = leader.send(money,count);
if (list == null){
System.out.println("Sorry, balance is not sufficient.");
return;
}
// Members grab red pockets!
Member m1 = new Member(leader.getleftMoney(), "GFY");
Member m2 = new Member(0,"ZS");
Member m3 = new Member(0,"DR");
m1.grab(list);
m2.grab(list);
m3.grab(list);
// show results!
leader.show();
m1.show();
m2.show();
m3.show();
}
}