继承是面向对象编程的最重要的特征之一,子类和父类(超类)之间的关系:子类不但会继承父类的属性和行为,而且还可以添加新的属性和行为。继承的好处就是可以提高程序的抽象程度,实现代码的重用,提高代码的开发效率和可维护性。
派生子类的方法:使用关键词extends
注意:如果没有extends语句,那么默认所有类都是java.lang.Object的子类
class student extends person{
String school;
int score;
void learn(){
...
};
}
字段的继承——变量继承
1.字段的继承:子类会继承父类的所有字段,例如student类会包含person的所有变量。
2.字段的隐藏:如果在子类中定义了与父类里面完全相同的变量,也就是将父类的变量重新进行了定义,那么这时父类的变量就会被隐藏,无法再引用。
3.字段的增加:直接在子类中加入新的字段(变量域)就可以。
方法的继承——行为继承
方法继承:在默认情况下,父类的方法也会字段全部被继承(不包括私有方法private)
方法的覆盖(override):与字段的隐藏相似,如果子类定义与父类重名的方法,那么这个方法将会修改子类的方法的具体实现方式,而不会再调用父类的方法。在JDK1.5以后,可以新加(@voerride)字符标注覆盖的方法。
public class person{
String name ;
int age;
void say(){
System.out.println("hello!");
}
}
class student extends person{
String school;
int score;
void say(){
System.out.println("你好!");
};
方法的重载(overload):如果一个类中有多个同名的方法,那么这成为方法的重载。同时可以重载父类的同名方法。与覆盖不同的是,重载不要求参数类型列表相同。重载的方法实际是新加的方法。
举例如下:
public class person{
String name ;
int age;
void say(){
System.out.println("hello!");
}
}
class student extends person{
String school;
int score;
void say(another person){//方法的签名是another person
System.out.println("你好!");
};
void say(another student){//函数的签名是another student
System.out.println("你好!同学");
};
}
super的使用方法
1.使用super区别访问父类的域和方法
正是由于继承,使用this可以访问父类的域和方法,但是有时为了明确的指明父类的域和方法,就用到关键字super。
例如:
public class person{
String name ;
int age;
void say(){
System.out.println("hello!");
}
}
class student extends person{
String school;
int score;
a = this.age;
a = super.age;
}
在父类中有一个age,在子类中用age,this.age,super.age都是访问age,是一样的。
2.在覆盖父类的同时调用父类的方法
在这时super的作用是访问已经被隐藏的父类方法,这时就会调用父类方法的时候也重新定义新的方法。
public class person{
String name ;
int age;
void say(){
System.out.println("hello!");
}
}
class student extends person{
String school;
int score;
void say(){
super.say();//调用父类的say函数
System.out.println("my school is :"+school);
}
}
3.调用父类的构造方法
因为在一定意义上构造方法是不能继承的,可以用super来调用父类的构造方法,而且super必须放在第一句。
public class person{
String name ;
int age;
//父类构造方法
public person(String name, int age){
this.name = name;
this.age = age;
}
}
class student extends person{
String school;
int score;
//子类构造方法
public student(String name, int age, String school, int score){
super(name,age);//super调用父类构造方法
this.school = school;
this.score = score;
}
}
父类与子类对象的转换
类似于基本数据类型之间的转换,也存在继承关系对象的转换。
1.子类对象可以被视为其父类的一个对象:例如:一个学生,也是一个人。需要一个人对象,给一个学生对象是可以的。
2.但是父类对象不能被当做其某一个子类的对象。例如:不能说人都是学生吧!!!但是可以说学生都是人!!!(杠精别杠)
3.如果一个方法的形式参数是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
4.如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以强制转换成子类对象的引用。
下面用代码举例子:注意看注释
public static void main(String [] args)
{
person p = new person("张三",15);
student s = new student("李四",34,"暨南大学",99);
person pp= new student("王五",22,"中山大学",99);//需要person类型,但是给student对象也可以
student s_error = (student)p;//编译可以通过,但是实际不执行,运行不行
student ss = (student) pp;//实现类型的转换,因为pp的实际指向是子类student
//调用方法时
p.say(s);//这里给person的方法带上一个student对象也是可以的,实际执行的是student的say()
//创建数组时
person [] person_array = new person[100];//创建person类型的100个人的数组
//但是实际存放可以是student和person都可以
person_array[0] = new person("zhang",17);
person_array[1] = new student("cheng",17,"JNU",99);
}
如果你对Java有兴趣,可以了解一下前面几期的基础知识!下面附上链接:
Java编程基础认知:Java学习日记1——基础认知
Java面向对象编程认识:Java学习日记2——面向对象编程认知
Java程序的基本结构认识:Java学习日记3——程序类型与构成认知
Java的输入输出方法总结:Java学习日记4——Java输入输出方法总结
Java的数据类型、变量、常量、运算符:Java学习日记5——数据类型、变量、常量、运算符、数组
Java学习日记6——类、字段、方法、this的使用:Java学习日记6——类、字段、方法、this的使用