抽象类:可以有成员变量,有构造函数,但是不能实例化。
接口:接口中的方法一般都是共有抽象方法:public abstract
接口中所有的属性都是共有静态常量属性:pulbic static final
一个类可以同时继承父类,实现接口,注意:声明类时,必须先继承再实现接口。
接口之间的关系:
接口之间可以用extends继承,没有私有成员,子接口全继承。
子接口也不需要实现抽象方法,因为它们都是接口。
接口可多继承。
接口特殊方法:在接口中使用static关键字修饰的方法有方法体, 静态方法需要有方法体。
有子类共同需要的函数时,不需要重写的函数,又有需要子类实现的功能时,考虑用类的继承和接口结合。
子类不可以继承父类的private 成员。
练习:
package com.judy.demo;
public class HelloWorld {
public static void main(String[] args) {
Technology t1 = new Technology(007, "judy", 300, 8);
double sal = t1.getSal();
int lever = t1.lever(sal);
Technology technology = new Technology(007, "judy", 300, 8, sal, lever);
System.out.println(technology.toString());
// 上面这个方法我写得好累赘呀,但是我想重写toString(),不知道怎么写,写成了这样。
Salesman salesman = new Salesman(8, "TOM", 2500.5, 6);
double sal2 = salesman.getSal();
salesman.setSalary(sal2);
int lever2 = salesman.lever(sal2);
salesman.setSaLever(lever2);
System.out.println("编号是" + salesman.id + "的员工姓名是" + salesman.name + "工资是" + salesman.getSalary() + "工资级别是" + salesman.getSaLever());
}
}
class Company {
public int id;
public String name;
public double salary;
public int saLever;
// Company(int id,String name){
// this.id=id;
// this.name=name;
// } //为什么写父类构造器,子类实现接口就出错呢???
void setSalary(double salary) {
this.salary = salary;
}
double getSalary() {
return salary;
}
void setSaLever(int saLever) {
this.saLever = saLever;
}
int getSaLever() {
return saLever;
}
public int lever(double sal) {
if (sal <= 3000) {
return 1;
} else if (sal > 3000 && sal <= 5000) {
return 2;
} else if (sal > 5000 && sal <= 8000) {
return 3;
} else {
return 4;
}
}
}
interface Sal {
public abstract double getSal();
}
class Technology extends Company implements Sal {
public double hourlyPay;
public double hours;
Technology(int id, String name, double hourlyPay, double hours) {
this.id = id;
this.name = name;
this.hourlyPay = hourlyPay;
this.hours = hours;
}
Technology(int id, String name, double hourlyPay, double hours, double salary, int lever) {
this.id = id;
this.name = name;
this.hourlyPay = hourlyPay;
this.hours = hours;
this.salary = salary;
this.saLever = lever;
}
@Override
public double getSal() {
return hourlyPay * hours;
}
// double sal = getSal();
@Override
void setSalary(double salary) {
super.setSalary(salary);
}
@Override
public String toString() {
return "编号是" + id + "的员工姓名是" + name + "工资是" + salary + "工资级别是" + saLever;
}
}
class Salesman extends Company implements Sal {
public double bonus;
public double sales;
Salesman(int id, String name, double bonus, double sales) {
this.id = id;
this.name = name;
this.sales = sales;
this.bonus = bonus;
}
@Override
public double getSal() {
return bonus * sales;
}
@Override
void setSalary(double salary) {
super.setSalary(salary);
}
}
只写了两个子类。
想重写toString,但是父类的成员变量需要子类计算出来之后才能初始化,这个怎么怎么写呢?
我写得很累赘,而且没有本质上的输出,成员,又new了一个对象,根本不是同一个对象。