Java第二阶段---12继承---第一节 继承
1.概念
继承的概念很简单但是很强大:当你要创建一个新类并且已经有一个包含所需代码的类时,可以从现有类中派生新类。这样,你可以重复现有类的字段和方法,而不必自己编写(和调试)它们。
子类从其父类继承所有成员(字段,方法和嵌套类)。构造方法不是吵成员,因此它们不会被子类继承,但是可以从子类中调用父类的构造方法。
从一个类派生的类称为子类(也可以是派生类,扩展成子类)。派生子类的类称为超类(也称为基类或父类)。
继承也是面对对象的三大特征之一。
2.如何使用继承
语法
public class 子类名 extends 父类名 {
}
示例
package com.cyx.inheritance;
public class Father {
public String name;
public String sex;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
package com.cyx.inheritance;
public class Child extends Father{
public void show(){
System.out.println(name);//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
System.out.println(sex);
eat();
sleep();
}
}
package com.cyx.inheritance;
public class FatherTest {
public static void main(String[] args) {
Child child = new Child();
child.name = "张三";
child.sex = "男";
child.show();
}
}
继承的属性和方法
不论子类在什么包中,子类会继承父类中所有的公开的和受保护的成员(包括字段和 方法)。如果子类和父类在同一个包中,子类也会继承父类中受保护的成员。
子类不会继承父类中定义的私有成员。尽管如此,如果父类有提供公开或者受保护的访问该字段的方法,这些方法也能在子类中被使用。
示例
package com.cyx.inheritance;
public class Father {
protected String name;
public String sex;
void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
package com.cyx.inheritance;
public class Child extends Father{
public void show(){
System.out.println(name);//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
System.out.println(sex);
eat();
sleep();
}
}
package com.cyx.inheritance.p1;
import com.cyx.inheritance.Father;
public class Child extends Father {
public void show(){
System.out.println(getName());//本类中未定义name变量,但是却可以使用,说明name变量是从父类中继承过来的
System.out.println(sex);
eat();//受包保护 所以报错 即默认修饰符用不了
sleep();
}
}
package com.cyx.inheritance;
public class FatherTest {
public static void main(String[] args) {
Child child = new Child();
child.name = "张三";
child.sex = "男";
child.show();
}
}
3.应用场景
思考如下代码存在什么问题?
public class Programmer{
private String name;
private String sex;
private int age;
private String level;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getSex(){
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getLevel() {
return level;
}
public void setLevel(String level) {
this.level = level;
}
public void programming(){
System.out.println("程序员编程");
}
public void eat(){
System.out.println("程序员吃饭");
}
}
public class Doctor{
private String name;
private String sex;
private int age;
private String professional;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getSex(){
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getProfessional(){
return professional;
}
public void setProfessional(String professional){
this.professional = professional;
}
public void cure(){
System.out.println("医生治病");
}
public void eat(){
System.out.println("医生吃饭");
}
}
直接看代码,初学者可能无法直观的看出问题所在,可以使用类图进行对比
有类图可以看出, Programmer 和 Doctor 两个类中存在大量重复的代码,可以使用继承来进行优化,以减少重复的编码
package com.cyx.inheritance.p2;
public class Person {
private String name;
private String sex;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getSex(){
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
}
package com.cyx.inheritance.p2;
public class Doctor extends Person {
private String professional;
public String getProfessional() {
return professional;
}
public void setProfessional(String professional) {
this.professional = professional;
}
public void cure(){
System.out.println("医生治病");
}
}
package com.cyx.inheritance.p2;
public class Programmer extends Person {
private int level;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public void programming(){
System.out.println("程序员编程");
}
}
package com.cyx.inheritance.p2;
public class PersonTest {
public static void main(String[] args) {
//原来造对象的方式
Doctor d = new Doctor();
d.setName("Miss Zhang");
d.setSex("女");
d.setAge(18);
d.setProfessional("临床医疗");
d.cure();
d.eat();
//父类造对象 子类来赋值
Person p1 = new Doctor();//医生是人
p1.setName("Miss Zhang");
p1.setSex("女");
p1.setAge(18);
p1.eat();
Person p2 = new Programmer();//程序员是人
p2.setName("马化腾");
p2.setSex("男");
p2.setAge(48);
p2.eat();
}
}
package com.cyx.inheritance.p2;
public class PersonTest {
public static void main(String[] args) {
//原来造对象的方式
Doctor d = new Doctor();
d.setName("Miss Zhang");
d.setSex("女");
d.setAge(18);
d.setProfessional("临床医疗");
d.cure();
d.eat();
//父类造对象 子类来赋值
Person p1 = new Doctor();//医生是人
p1.setName("Miss Zhang");
p1.setSex("女");
p1.setAge(18);
p1.eat();
//利用强制类型转换来调用特有属性 int number = (int)1.0;
((Doctor)p1).cure();
Person p2 = new Programmer();//程序员是人
p2.setName("马化腾");
p2.setSex("男");
p2.setAge(48);
p2.eat();
((Programmer)p2).programming();
}
}
子类与父类的关系是is-a关系,表示是一个
如果一个对象赋值给其父类的引用,此时想要调用该对象的特有的方法,必须要进行强制类型转换