Java系列分享
【测开技能】Java语言系列(十五)break和continue
正文
我们先看两个类
class Mantou {
private String birthcity;
private float price;
private boolean sale;
public boolean isSale() {
return sale;
}
public void setSale(boolean sale) {
this.sale = sale;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
class Food {
private String birthcity;
private float price;
public Food(){
}
public Food(String birthcity, float price) {
this.birthcity = birthcity;
this.price = price;
}
public String getBirthcity() {
return birthcity;
}
public void setBirthcity(String birthcity) {
this.birthcity = birthcity;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
我们可以看到,上面的两个类,一个Mantou。一个food,两个类之间的区别,Mantou类多了一个sale 字段,有对应的get set方法。那么能不能在Mantou类不用重复写那些重复的代码,
答案是可以的
就要用到继承,继承是面向对象编程中非常强大的一种机制,它首先可以复用代码。
如何实现继承呢
class Mantou extends Food{
private boolean sale;
public boolean isSale() {
return sale;
}
public void setSale(boolean sale) {
this.sale = sale;
}
}
用extends 就实现了继承,不需要实现编写与父类重复的方法,测试下
public class main {
public static void main(String[] args) {
Mantou hello = new Mantou();
hello.setBirthcity("beijing");
hello.setPrice(1);
hello.setSale(true);
System.out.println(hello.getBirthcity());
System.out.println(hello.getPrice());
System.out.println(hello.isSale());
}
}
结果
这样,一个简单的继承就实现完毕了,有了继承,可以很简单的让类拥有父类的方法。
在OOP的术语中,我们把Food称为超类(super class),父类(parent class),基类(base class),把Mantou称为子类(subclass),扩展类(extended class)。
注意到我们在定义Food的时候,没有写extends。在Java中,没有明确写extends的类,编译器会自动加上extends Object。所以,任何类,除了Object,都会继承自某个类。
如果没有写,都会继承Object。
Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object特殊,它没有父类。
protected
继承有个特点,就是子类无法访问父类的private字段或者private方法。
在Mantou 有一个toString方法,调用父类的birthcity,
public String toString() {
return birthcity;
}
编译执行报错
这使得继承的作用被削弱了。为了让子类可以访问父类的字段,我们需要把private改为protected。用protected修饰的字段可以被子类访问:
protected String birthcity;
protected float price;
运行前在main方法增加下面,再次运行
System.out.println(hello.toString());
结果
可以正常打印。
因此:protected关键字可以把字段和方法的访问权限控制在继承树内部,一个protected字段和方法可以被其子类,以及子类的子类所访问