一、java继承的概念及用法
- (面向对象)00P三大特性:封装 继承 多态
生活中,继承的概念随处可见
继承需要符合的关系:is-a;父类更通用更抽象、子类更特殊更具体 - 继承的概念和实现
继承背后的思想就是基于已存在的类来构建新类
当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求
约定:从其他类导出的类叫做子类。
被导出的类叫做父类
在java中,除了Object类之外,所有类都是子类,都只有唯一的父类
继承在00P中国不可或缺
创建一个类时,总是在继承
继承的意义
代码重用、体现不同抽象层次
父子类关系
父类更抽象,更一般、子类更具体,更特殊 - 在java语言中,用extends关键字来表示一个类继承了另外一个
public class Teacher extends Person{
…
} - DEMO
package jicheng.xiaoma.java;
class Person{
String name;
String address;
public void eat(){
System.out.println("person->eat");
}
public void drink(){
System.out.println("person->drink");
}
public void printInfo(){
System.out.println("name=" + name);
}
}
class Student extends Person{ //Student继承了Person,其中Person为父类
int score;
void goToSchool(){
System.out.println("上学");
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "人";
p.eat();
Student s = new Student();
s.name = "学生";
s.eat();
s.printInfo(); //Student可以调用父类的方法
s.goToSchool();
}
}
运行结果:
person->eat
person->eat
name=学生
上学
二、java继承之super关键字
- super关键字的特点:
super和this关键字的特点类似:super代表的是父类对象的引用
当子父类的成员出现同名时,可以通过super来区分
子类的构造方法中,通过super关键字调用父类的构造方法
public class JavaTeacher extends Teacher{
public JavaTeacher(String name,String school){
super(name,school); //通过调用父类的构造方法,完成对相关字段值的初始化
}
}
- 强调:当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类构造方法的语句必须是子类构造方法中的第一条指令
- DEMO
package jicheng.xiaoma.java;
class Person{
String name;
private String address;
// public Person(){ //继承,子类构造方法 的另一种方法
//
// }
public Person(String name, String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
public Person(String name){
this.name = name;
}
public void eat(){
System.out.println("人吃饭");
}
public void drink(){
System.out.println("人喝水");
}
public void printInfo(){
System.out.println("name=" + name);
}
private void prinfAddr(){ //私有的字段,方法不能被子类继承
System.out.println("address=" + address);
}
}
class Student extends Person{
public Student(String name, String address){
super(name, address); //子类的构造方法中,通过super关键字调用父类的构造方法、这是其中一种方法,另一种方法在父类中创建空构造方法
System.out.println("子类构造方法被调用");
}
int score;
void goToSchool(){
System.out.println("上学");
}
public void eat(){
super.eat(); //当子父类的成员出现同名时,可以通过super来区分
System.out.println("eat");
}
// void setaddress(String address){
// this.address = address;
// }
}
public class Test {
public static void main(String[] args) {
Person p = new Person("xiaoma", "深圳市");
p.name = "人";
p.eat();
Student s = new Student("xioma", "汕头市");
s.name = "学生";
// s.setaddress("南山区");
s.eat();
s.printInfo();
//s.goToSchool();
//s.prinfAddr();
}
}
运行结果:
父类构造方法被调用
人吃饭
父类构造方法被调用
子类构造方法被调用
人吃饭
eat
name=学生
三、java继承->私有权限
- 父类的private字段或者方法不能被子类继承,但子类通过super来调用父类的构造函数可以改变父类的private字段
四、java继承之方法重写
-
什么是方法重写
方法重写是指子类可以根据需要对父类继承来的方法进行改写
是多态机制的前奏 -
方法重写注意点
重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值 ,而重载只需要方法名一样就可以
重写方法不能比被重写方法有更严格的访问权限(但是可以bai更广泛,比如父类方法du是包访问权限,子类的重写方法是public访问权限。)
父类中的私有方法,不能被重写
在子类重写的方法中继续调用父类被重写的方法可以通过super.函数名获取 -
DEMO
package jicheng.xiaoma.java;
class Person{
String name;
private String address;
void printInfo(){
System.out.println("父类打印name=" + name);
}
private void prinfAddr(){ //私有的字段,方法不能被子类继承
System.out.println("address=" + address);
}
}
//重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
class Student extends Person{
int score;
public void printInfo(){
// super.printInfo();
System.out.println("子类打印name=" + name);
}
// private void prinfAddr(){ //私有的字段,方法不能被子类继承
// System.out.println("address=" + address);
// }
}
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.name = "xiaoma";
s.printInfo();
}
}
运行结果:
子类打印name=xiaoma
五、java继承之object类
- 在Java中的所有类都是从Object这个类继承出来的,Object类是所有类的源头,是所有类的父类。
- java中,所有类都直接或间接继承自java.lang.Object类
可以说Object是java中所有类的祖先即根类
java中任何类都继承了Object类中的方法,主要有
toString();
equals();
hashcode();
clone();
getClass();
finalize(); - DEMO
package jicheng.xiaoma.java;
class Person{
String name;
String address;
void printInfo(){
System.out.println("父类打印name=" + name);
}
private void prinfAddr(){ //私有的字段,方法不能被子类继承
System.out.println("address=" + address);
}
public String toString() { //默认是打印地址,可以重写自己想打印的
return "person meaage:" + name + address;
}
public boolean equals(Object arg0) { //默认用来判断调用equals的对象和形参obj所引用的对象是否是同一对象,可以重写自己比较
Person p = (Person)arg0;
if(this.address == p.address && this.name == p.name)
return true;
else
return false;
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.name = "xiaoma";
p.address = "汕头市";
Person p2 = new Person();
p2.name = "xiaoma";
p2.address = "汕头市";
System.out.println(p.equals(p2));
System.out.println(p.toString());
}
}
打印结果:
true
person meaage:xiaoma汕头市