面向对象三大特性:
5.1继承(extends)--
1.生成子类的过程
2.Super调用构造函数
class People{
String name;
int age;
People(){
System.out.println("pleple hava no ");
}
People(String name,int age){
this.name=name;
this.age=age;
System.out.println("there have");
}
void eat(){
System.out.println("eat");
}
}
class Student extends People{
int grade;
//在子类的构造函数当中,必须调用父类的构造函数,因为子类继承了父类的变量、方法,需使用super调用父类
Student(){
super();//调用父类中的相对应构造函数,如果不写,编译器会自动添加
System.out.println("student have no");
}
Student(String name,int age,int grade){
super(name,age);
this.grade=grade;
}
}
class TestS{
public static void main(String args[]){
Student student=new Student("zhangsan",10,3);
}
}
注意:super调用父类的构造函数时,必须放在第一位。
5.1.2 复写(override)
class People{
String name;
int age;
void introduce(){
System.out.println("my name is :"+name+",my age is:"+age);
}
}
//复写(override)也被称为覆盖或者重写
//1.在具有父子关系的两个类中
//2.父类和子类当中各有一个函数,这两个函数的定义(返回值类型、函数名、参数值)相同
class Student extends People{
String address;
void introduce(){
super.introduce();
System.out.println("my home in"+address);
}
}
5.1.3对象转型
1.对象的向上转型
//一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型
//一个引用调用的方法取决于引用所指向的对象
class TestS{
public static void main(String args[]){
Student s=new Student();
Person p=s;//向上转型
或者使用这种方式:Person p=new Student();
p.name="zhangsan";
p.age=20;
}
}
2.对象向下转型
或者Person p=new Student();
Student s=(Student)p;
3.抽象类(用作父类、基类)与抽象函数:
abstract class PersonA{//一个类中有抽象函数,那么类也必须定义为抽象类
String name;
int age;
void introduce() {
System.out.println("my name is "+name+",age is:"+age);
}
abstract void eat();//抽象函数
}
class TestPa{
public static void main(String args[]){
PersonA p=new Chinese();//向上转型为PersonA父类
p.eat();//调用方法,此时这个方法不是抽象函数
}
}
class Chinese extends PersonA{
void eat(){
System.out.println("use it");//通过override对抽象函数复写,使得子类可以生成对象
}
}
问题:抽象类可以有构造函数吗?
可以有,因为子类会自动调用super();
abstract class PersonA{
PersonA(){
System.out.println("PersonA fun");//构造函数
}
String name;
int age;
void introduce() {
System.out.println("my name is "+name+",age is:"+age);
}
abstract void eat();
}
class Chinese extends PersonA{
Chinese(){//构造函数
super();//默认调用
System.out.println("chinese fun");
}
void eat(){
System.out.println("use it");
}
}
抽象函数默认为public