- 继承:通过extends关键字,让两个类建立父子关系 public class B extends A{} A为父类,B为子类
- 子类能继承父类的非私有成员(成员变量、成员方法)
- 子类的对象是由子类、父类共同完成的
package com.itheima.extend;
//父类
public class People {private String name;private char sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}
}
package com.itheima.extend;
//子类
public class Teacher extends People{private String skill;public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}
package com.itheima.extend;public class Test {public static void main(String[] args) {Teacher t = new Teacher();t.setName("张三");t.setSex('男');t.setSkill("java");System.out.println(t.getName());System.out.println(t.getSex());System.out.println(t.getSkill());}
}
- 权限修饰符范围:
- private:只能本类
- 缺省:本类、同一个包中的类
- protected:本类,同一个包中的类、子孙类
- public:任意位置
package com.itheima.extendfeature;public class Test {public static void main(String[] args) {Zi zi = new Zi();zi.show();}
}class Fu{String name = "fu的name";public void run(){System.out.println("fu的run");}
}class Zi extends Fu{String name = "zi的name";public void show(){String name = "show的name";System.out.println(name);//show的nameSystem.out.println(this.name);//zi的nameSystem.out.println(super.name);//fu的namerun();//zi的runsuper.run();//fu的run}public void run(){System.out.println("zi的run");}
}
- Java是单继承的,一个类只能继承一个直接父类
- Java不可以多继承,但可以多层继承
- Object类是Java中所有类的祖宗
- 在字类中访问成员变量和成员方法特点:就近原则,先找子类局部范围,子类没有找父类,父类没有就报错
- 如果子父类中出现了重名的成员此时一定要在子类中使用父类怎么办?
- 答:super.父类成员变量/父类成员方法
package com.itheima.extendfeature;public class Test1 {public static void main(String[] args) {Cat c = new Cat();c.cry();}
}
class Cat extends Animal{//方法重写:方法名称、形参列表必须一样,这个方法就是方法重写。//重写的规范:声明不变,重新实现。@Override//方法重写的校验注解,更安全。public void cry(){System.out.println("猫叫");}
}class Animal{public void cry(){System.out.println("动物叫");}
}
- 方法重写:子类写了一个方法名称、形参列表与父类某个方法一样的方法去覆盖父类的该方法
- 私有方法、静态方法不能被重写
- 当子类觉得父类的方法不好用,或者不满足自己的需求时,就可以用方法重写。
package com.itheima.extendfeature;public class Test2 {public static void main(String[] args) {//方法重写的常见应用场景:子类重写Object类中的toString方法,以便返回对象的内容。Student s = new Student("张三", 18, '男');System.out.println(s.toString());//com.itheima.extendfeature.Student@1b6d3586 所谓的地址System.out.println(s);//com.itheima.extendfeature.Student@1b6d3586 所谓的地址//注意1:直接输出对象,默认调用Object的toString方法(可以省略不写调用toString的代码),返回对象的地址信息//注意2:输出对象的地址实际上是没有什么意义的,开发中更希望输出对象时看对象的内容信息,所以子类需要重写Object类中的toString方法// 以便以后输出对象时默认就近调用子类重写的toString方法返回对象的内容信息}
}class Student {//它的父类是Object,相当于class Student extends Objectprivate String name;private int age;private char sex;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", sex=" + sex +'}';}public Student() {}public Student(String name, int age, char sex) {this.name = name;this.age = age;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}
}
- 子类重写toString()方法快捷键:右键->Generate->toString()->ok
- 在当前页查找某个单词:Control + F
package com.itheima.extendfeature;
//父类
public class People {private String name;private char sex;public People() {}public People(String name, char sex) {this.name = name;this.sex = sex;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}
}
package com.itheima.extendfeature;
//子类
public class Teacher extends People{private String skill;public Teacher() {}public Teacher(String name, String skill, char sex) {super(name, sex);//必须写在第一行this.skill = skill;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}
}
package com.itheima.extendfeature;public class Test3 {public static void main(String[] args) {Teacher t = new Teacher("Tom","java",'男');System.out.println(t.getName());System.out.println(t.getSkill());System.out.println(t.getSex());}
}
- 子类中的全部构造器,都必须先调用父类的构造器,再执行自己。
- super(...)调用父类有参数构造器的常见应用场景是什么?
- 答:为对象中包含父类这部分的成员变量进行赋值。
package com.itheima.extendfeature;public class student {private String name;private String schoolName;public student() {}public student(String name){//通过this调用兄弟构造器,可以实现创建对象时只写名字,默认学校是黑马程序员//this(...)只能放在构造器的第一行this(name,"黑马程序员");}public student(String name, String schoolName) {this.name = name;this.schoolName = schoolName;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSchoolName() {return schoolName;}public void setSchoolName(String schoolName) {this.schoolName = schoolName;}@Overridepublic String toString() {return "student{" +"name='" + name + '\'' +", schoolName='" + schoolName + '\'' +'}';}
}
package com.itheima.extendfeature;public class Test3 {public static void main(String[] args) {student s1 = new student("Tom");student s2 = new student("Bob", "清华大学");System.out.println(s1);System.out.println(s2);}
}
- 任意类的构造器中,是可以通过this(...)去调用该类的其他构造器的。
- this(...)、super(...)都只能放在构造器的第一行,因此,不能同时出现。