day 9
抽象类
抽象类,abstract. 他没有具体的实例,如果一个类中有一个抽象的方法,那么他必须是抽象类
Q1,建立抽象类Animal,并建立类Dog,类Fish,打印出dog和fish的移动方式.
package day09;
public abstract class Animal {//只写方法不写方法体
public abstract void test();
public abstract void move();
}
class Dog extends Animal{//继承后会报错,在eclipse里,单击类名Dog,点击Add inimplemented methods就可以自动添加重写方法
@Override
public void test() {
}
@Override
public void move() {//重写move
System.out.println("狗的移动方式是撒欢");
}
}
class Fish extends Animal{
@Override
public void test() {
}
@Override
public void move() {
System.out.println("鱼的移动方式是蹦跶");
}
}
在main方法中new一个dog和fish并使用.move方式
打印出dog和fish的移动方式.
Dog d = new Dog();
d.move();
Fish f = new Fish();
f.move();
Q2. 编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary.
提供必要的构造器和抽象方法:work().对于Manager类来说,他既是员工,还具有奖金(bonus)的属性,请使用继承的思想,
设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问.
package day09;
public abstract class Employee {
String name;
int id;
double salary;
public Employee(){
}
public abstract void work();
}
class CommonEmployee extends Employee{
public void setComminEmployeeInfo(String name,int id,double salary) {
super.name = name;
super.id = id;
super.salary = salary;
}
public void getComminEmployeeInfo() {
System.out.println(super.id);
System.out.println(super.name);
System.out.println(super.salary);
}
@Override
public void work() {
System.out.println("这是一个普通员工");
}
}
class Manager extends Employee{
double bonus;
public void setManagerInfo(String name,int id,double salary,double bonus) {
super.name = name;
super.id = id;
super.salary = salary;
this.bonus = bonus;//注意,这里的bonus不要使用super.
}
public void getManagerInfo() {
System.out.println(super.name);
System.out.println(super.id);
System.out.println(super.salary);
System.out.println(this.bonus);
}
@Override
public void work() {
System.out.println("这是一个领导");
}
}
在main方法中调用
CommonEmployee ce = new CommonEmployee();
ce.setComminEmployeeInfo("zhangsan", 113, 6300.15);
ce.getComminEmployeeInfo();
ce.work();
Manager m = new Manager();
m.setManagerInfo("lisi",114, 123.21, 45401.14);
m.getManagerInfo();
m.work();
模板方法设计模式
抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板
当功能内部一部分实现是确定,一部分实现是不确定的.
这时可以把不确定的部分暴露出去,让子类实现.
编写一个抽象父类,父类提供了多个子类的通用方法,并把一个或多个方法给其子类实现,这就是一种模板
package day09;
/**
* 模板设计模式
* @author Administrator
*
*/
public abstract class Template {
public abstract void code();
public final void getTime() {
long start = System.currentTimeMillis();
code();
long end = System.currentTimeMillis();
System.out.println("code方法执行的时间: " + (end - start));
}
}
class TestTemp extends Template{
@Override
public void code() {
for(int i = 0;i < 500; i++) {
}
}
}
在main方法中,new一个TestTemp对象,使用.getTime()方法调取结果
接口
接口的特点:
用interface来定义
接口中的所有成员变量都默认是由public static final修饰的
接口中的所有方法都默认是由public abstract修饰的
接口没有构造器
接口采用多层继承机制
public interface Runner{
int ID = 1;
void start();
public void run();
void stop();
}
相当于
public interface Runner{
public static final int ID = 1;
public abstract void start();
public abstract void run();
public abstract void stop();
}
新建接口时在包右键new的不是class,而是interface
测试接口时,在class名后使用关键字 implements
package day09;
/**
* 子类可以继承父类,只能继承一个父类
* 类可以实现多个接口,多个接口用,分隔
* @author Administrator
*
*/
public class TestInImpl implements TestIn,TestIn1{
@Override
public void test() {
// TODO Auto-generated method stub
}
@Override
public void test1() {
// TODO Auto-generated method stub
}
}
接口可以继承接口
如果一个类即继承父类,又实现接口
那么先继承,再实现
今天刚到新公司,学习进度缓慢 明天继续接口学习