笔记在最后面的总结,如果对继承还不了解的话,可以先到最后看笔记。
1、定义一个Person类作为父类
package ooday02;
/**
人---超类、基类、父类
*/
public class Person {
String name;
int age;
String address;
/*Person(){};*///默认的构造方法
Person(String name,int age,String address){//重写了父类的构造方法
this.name=name;
this.age=age;
this.address=address;
};
//普通方法
void eat(){
System.out.println(name+"正在吃饭");
}
void sleep(){
System.out.println(name+"正在睡觉");
}
void sayHi(){
System.out.println("大家好,我叫"+name+ ",我今年"+age+"岁了"+"我来自"+address);
}
}
2、定义一个Student类来继承Person
Student里面新定义了classname、stuId 新加了study()和sayHi()方法
package ooday02;
/**
* 学生---派生类、子类
*/
public class Student extends Person {
String className;
String stuId;
//this指Student对象 super指Person对象
/* Student(){};*/
Student(String name,int age,String address, String className,String stuId){
//成员变量name若没有同名现象:写this.name和super.name都一样
//成员变量若是有name super.name指的是超类的name this.name指的是当前类的name
/* this.name=name;
this.age=age;
this.address=address;*///传递的是name、age、address的值
super(name,age,address);
this.className=className;
this.stuId=stuId;
}
void study(){
System.out.println(name+"正在学习");
}
void sayHi(){
System.out.println("大家好,我叫"+name+ ",我今年"+age+"岁了"
+"我来自"+address+"我在"+className+"班"+"学号为"+stuId);
}
}
3、定义一个老师类继承Person
Teacher里面新定义了salary 加入了teach()方法
package ooday02;
/**
*老师---派生类、子类
*/
public class Teacher extends Person {
double salary;
/* Teacher(){};*/
Teacher(String name,int age,String address,double salary){
/* this.name=name;
this.age=age;
this.address=address;*/
super(name,age,address);
this.salary=salary;
};
void teach(){
System.out.println(name+"正在上课");
}
void sayHi(){
System.out.println("大家好,我叫"+name+ ",我今年"+age+"岁了"
+"我来自"+address+"我的工资为"+salary);
}
}
4、定义一个医生类继承Person
Doctor里面新定义了title 加入了cut()方法
package ooday02;
/**
* 医生---派生类、子类
*/
public class Doctor extends Person {
String title;
/* Doctor(){};*/
Doctor(String name,int age,String address,String title){
/*this.name=name;
this.age=age;
this.address=address;*/
super(name,age,address);
this.title=title;
};
void cut(){
System.out.println(name+"正在手术");
}
}
5、接着建一个继承的测试类,来测试前几步的代码(有两种new方法一种复杂一种简便)
package ooday02;
public class ExtendsTest {
public static void main(String[] args) {
//创建学生对象
/*//1)
Student zs=new Student();
zs.name="张三";
zs.age=25;
zs.address="廊坊";
zs.className="jsd2302";
zs.stuId="001";
zs.eat();
zs.sleep();
zs.sayHi();
zs.study();
*/
//2)学生构造方法
Student zss=new Student("张三三",15,
"南京","jsd2302","002");
zss.eat();
zss.sleep();
zss.sayHi();
zss.study();
System.out.println();
//创建老师对象
//1)
/*Teacher ls=new Teacher();
ls.name="李四";
ls.age=38;
ls.address="北京";
ls.salary=6000;
ls.eat();
ls.sleep();
ls.sayHi();
ls.teach();*/
//2)老师构造方法
Teacher lss=new Teacher("李四四",38,"北京",
8000);
lss.eat();
lss.sleep();
lss.sayHi();
lss.teach();
System.out.println();
//创建医生对象
//1)
/*Doctor ww=new Doctor();
ww.name="王五";
ww.age=40;
ww.address="上海";
ww.title="副主任医师";
ww.eat();
ww.sleep();
ww.sayHi();
ww.cut();*/
//2)医生构造方法
Doctor www=new Doctor("王五五",40,"上海",
"副主任医师");
www.eat();
www.sleep();
www.sayHi();
www.cut();
System.out.println();
}
}
笔记:
1. 继承:
作用:代码复用
通过extends实现继承
超类/基类/父类:共有的属性和行为
派生类/子类:特有的属性和行为
派生类可以访问:超类的+派生类的,超类不能访问派生类的
一个超类可以有多个派生类,一个派生类只能有一个超类---------单一继承具有传递性
java规定:构造派生类之前必须先构造超类
在派生类的构造方法中若没有调用超类的构造方法,则默认super()调用超类的无参构造方法
在派生类的构造方法中若自己调用了超类的构造方法,则不再默认提供
注意:super()调用超类构造方法,必须位于派生类构造方法中的第1行
2. super:指代当前对象的超类对象
super.成员变量名-------------------------访问超类的成员变量
当超类成员变量和派生类成员变量同名时,super指超类的,this指派生类的
若没有同名现象,则写super和this是一样的
super.方法名()------------------------------调用超类的方法
super()----------------------------------------调用超类的构造方法
3. 方法的重写(override/overriding):重新写、覆盖
发生在父子类中,方法名相同,参数列表相同
重写方法被调用时,看对象的类型---------------new谁就调谁的,这是规定
补充:
1. 泛化:从程序设计角度而言叫泛化,从代码实现角度而言叫继承,泛化就是继承
2. 继承要符合is(是)的关系
3. 继承的是超类的成员变量和普通方法,不包括超类的构造方法,超类的构造方法是被派生类通过super()来调用的,而不是继承的
class Aoo{
int a;
Aoo(){
}
void show(){
}
}
class Boo extends Aoo{
继承了Aoo类的a+show(),并没有继承Aoo类的构造方法
}