面向对象之抽象类
为了引出抽象类我们先来这样一个例子
package cn.edu.xatuii;
public class Person {
private String name;public Person(String name) {
this.name = name;}
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public void eat(Food f) {
System.out.println(this.name + "吃" + f.getName());}
}
class Food {
private String name;public Food(String name) {
super();
this.name = name;
}public String getName() {
this.name = name;
return name;
}
}class Chicken extends Food {
public Chicken() {
super("鸡");}
}class yu extends Food {
public yu() {
super("鱼");}
}
测试类
package cn.edu.xatuii;
public class Test {
@org.junit.Test
public void test() {
Person p = new Person("张三");
Chicken c = new Chicken();
Food f = new Food("鸡");
p.eat(f);
p.eat(c);
}}
运行结果:
为了防止我们子类父类都可以引用,我们引入抽象类,将代码改造成这样
此时,调用的时候就会只通过子类调用,抽象类就不会被调用了。
为了进一步了解抽象类,我们将代码改造成这样
package cn.edu.xatuii;
public abstract class Person {
private String name;public Person(String name) {
this.name = name;}
public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public abstract void eat(Food f);
public abstract void work();
}
abstract class Food {
private String name;public Food(String name) {
super();
this.name = name;
}public String getName() {
this.name = name;
return name;
}
}class Chicken extends Food {
public Chicken() {
super("鸡");}
}class yu extends Food {
public yu() {
super("鱼");}
}
class Studen extends Person {
public Studen(String name) {
super(name);}
@Override
public void eat(Food f) {
System.out.println();}
@Override
public void work() {
System.out.println("学习");}
}
总结:抽象类里面有抽象方法,带有抽象方法的类叫抽象类,抽象类里面的方法不实现,只是定了规范,让子类去实现。子类继承抽象类就要实现抽象类里面的抽象类里面的所有抽象方法。父类只是定规范,只是保留了引用,让子类具体去实现。
class c extends B{
@Override
public void out() {
System.out.println("hello world");
}
}
abstract class B{
public abstract void out();
}