1、继承的概念和实现
生活中,继承的概念随处可见
继承需要符合的关系:is a;
父类更抽象,子类更具体
继承背后的思想就是 基于已存在的类来构建新类
当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求
约定:从其他类导出的类叫做子类。
被导出的类叫做父类
在Java中,除了object类之外,所有类都是子类,都只有唯一的父类
继承在面向对象中不可或缺
创建一个类时,总是在继承
继承的意义:代码重用、体现不同抽象层次
父子类关系:父类更抽象,更一般;子类更具体,更特殊
在Java中,用extends关键字来表示一个类继承了另外一个
public class Teacher extends Person{
//其余代码省略
}
程序示例:
class person {
int age;
String name;
public void eat(){
System.out.println("人吃饭");
}
public void drink(){
System.out.println("人喝水");
}
}
class student extends person{ //继承于person
double score;
public void gotoschool(){
System.out.println("名字:"+name + ",年龄:"+age + ",分数:"+score);
}
}
public class Test {
public static void main(String[] args) {
student stu1 = new student();
stu1.eat(); //因为用了继承,所有即使eat()不是student类的,但它属于它的父类person,所有也能用
stu1.age = 18; //成员也一样用的父类的
stu1.name = "zheng";
stu1.score = 99.9;
stu1.gotoschool();
}
}
效果:
2、super关键字
super关键字的特点
super和this关键字的特点类似:super代表的是对父类对象的引用
当子父类的成员出现同名时,可以通过super来区分
子类的构造方法中,通过super关键字调用父类的构造方法
public class JavaTeacher extends Teacher{
public JavaTeacher (String name, String school){
super(name,school);//通过调用父类的构造方法,完成对相关字段值的初始化
}
}
强调:
当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类 构造方法的语句必须是子类构造方法中的第一条。
代码示例:
class person {
int age;
String name;
public person(int age, String name){
this.age = age;
this.name = name;
System.out.println("父类构造方法被调用");
}
}
}
class student extends person{ //继承于person
double score;
public student(int age, String name){
super (age,name); //通过调用父类的构造方法,完成对相关字段值的初始化
System.out.println("子类构造方法被调用");
}
}
public class Test {
public static void main(String[] args) {
student stu1 = new student(18,"zheng");
}
public void eat(){
{
super.eat(); //对父类同名函数eat()的调用
System.out.println("eat");
}
}
效果:
3、私有权限
私有权限private只能在该类中被调用,在其他类中可以通过调用private所属类中的一个public函数去间接调用private变量,不能在其他类中直接调用该private。
4、方法重写
什么是方法重写:
方法重写的指子类可以根据需要对从父类继承来的方法进行改写,是多态机制的前奏
方法重写的注意点:
重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
重写方法不能比被重写方法有更严格的访问权限
父类中的私有方法,不能被重写
在子类重写的方法中继续调用父类被重写的方法可以通过“super.函数名”获取
代码示例:
String name;
private String address;
public void printfInfo(){
System.out.println("父类打印name="+name);
}
public void printfaddress(){
System.out.println("address="+address);
}
}
class student extends person{ //继承于person
double score;
public void printfInfo(){ //方法的重写
super.printfInfo(); //调用父类的方法
System.out.println("子类打印name="+name);
}
}
public class Test {
public static void main(String[] args) {
student s = new student();
s.name = "zheng";
s.printfInfo();
}
}
效果:
5、object类
Java中,所有类都直接或间接继承自java.lang.object类;可以说object是java中所有类的祖先即根类
java中任何类都是继承了object类中的方法,主要有:
toString()
equals()
hashcode()
clone()
getClass()
finalize()
toString():
class person {
String name;
private String address;
}
class student extends person{ //继承于person
double score;
}
public class Test {
public static void main(String[] args) {
student s = new student();
System.out.println(p.toString());
}
}
效果:
equals():
class person {
String name;
private String address;
}
class student extends person{ //继承于person
double score;
public boolean equals(Object arg0){//方法的重写,重写equals,实现自己的equals函数
person p = (person)arg0
if (this.address == p.address && this.name== p.name)
return ture;
else
return false;
}
}
public class Test {
public static void main(String[] args) {
person p = new person();
p.name = "zheng";
p.address = "3020";
person p2 = new person();
p2.name = "zheng";
p2.address = "3020";
System.out.println(p.equals(p2)); //equals():判断p、p2是否相等,默认是判断地址是否相等,但重写了就是按照重写的规则来判断
System.out.println(p.toString());
}
}
效果:
false:地址不相等
但是按照上面重写的equals话,因为是比较里面的成员变量,所以是相等的