越抽象的东西就越不容易犯错,写程序要注重可扩展性,当面向对象时尽量用抽象代替具体
都是简单的实现,主要练习这种思想
抽象类:
package teacher;
import java.util.Scanner;
public abstract class basic {
private String name;
private int age;
basic(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
void start(){
System.out.println("open the book!");
}
void end(){
System.out.println("close the book!");
}
public abstract void teach(); //抽象类使用
void work(){ //模板方法
start();
teach();
end();
}
}
抽象类不需要写实现,模板方法按照顺序运行它所包含的方法
抽象类的继承:
package teacher;
public class javaTeacher extends basic{ //对抽象类继承,继续抽象下去或者实现里面的方法
javaTeacher(String name, int age) {
super(name, age);
}
public void teach(){
System.out.println("java teaching……");
}
}
package teacher;
public class mathTeacher extends basic{
mathTeacher(String name,int age){
super(name,age);
}
public void teach(){
System.out.println("math teaching……");
}
}
这里可以写很多继承的方法,可以不断重写teach方法,相比一个一个写要灵活许多
主函数:
package teacher;
public class teacher_main {
public static void main(String[] args) {
javaTeacher one = new javaTeacher("Tom", 19);
mathTeacher two = new mathTeacher("Lisa", 12);
one.work();
System.out.println("another teacher");
System.out.println();
two.work();
}
}
这个小程序灵活之处在于当有新的老师加入时,直接添加老师即可,缺点就是不同的类型,如老师和学校都有教书这个方法,无法归于一类,而且继承只能继承一个。如果要添加其他的抽象方法改动仍然很大灵活性不高。
接口:
接口可以实现不同类型使用共同的接口,任何类只要需要就可以调用。灵活性高,操作方便。
一个小例子:
package book;
interface temp { //接口
public void printBook();
public void printdetail();
}
package book;
public class factory {
public void start(temp t){
t.printBook();
System.out.println();
t.printdetail();
}
}
package book;
public class javaBook implements temp{
private String name;
javaBook(String name){
this.name = name;
}
public void printBook(){
System.out.println("this is a javabook! printing……");
}
public void printdetail(){
System.out.println("java出版年份是1111年");
}
}
package book;
public class mathBook implements temp{
private String name;
mathBook(String name){
this.name = name;
}
public void printBook(){
System.out.println("this is a mathbook! printing……");
}
public void printdetail(){
System.out.println("mathbook 出版年份是2222");
}
}
package book;
public class main_book {
public static void main(String[] args) {
javaBook ja = new javaBook("Java");
mathBook ma = new mathBook("Math");
factory fa = new factory();
fa.start(ja);
System.out.println();
fa.start(ma);
//CBook cb = new CBook();
//System.out.println();
//fa.start(cb);
}
}
如果要添加新的书籍只需要添加新书的类就可以,在主函数加上注释掉的三行
package book;
public class CBook implements temp{
public void printBook(){
System.out.println("This is a C book! printing……");
}
public void printdetail(){
System.out.println("C 出版年份是333");
}
}
这里只是工厂调用了temp接口,如果想让学校也调用呢?再加一个学校即可,如果是个人打印书籍,也可直接写一个个人的类调用接口。接口是可以调用多个的,假如写一个企业家类,他可以自己印刷,可以自己销售等,自己调用temp和销售的接口即可。