目录
面向对象三大特征之二:继承
继承概述、使用继承的好处
总结
继承的设计规范、内存运行原理
父类
package com.itheima.d5_extends_test;
public class People {
private String name;
private int age;
public void queryCourse(){
System.out.println(name + "在查看课表~~");
}
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;
}
}
子类
package com.itheima.d5_extends_test;
public class Student extends People{
public void writeInt(){
System.out.println(getName()+" 写下了:学习语法,很哈皮~~");
}
}
测试
package com.itheima.d5_extends_test;
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setName("蜘蛛精");// 使用父类的
s.setAge(999);// 使用父类的
System.out.println(s.getName());// 使用父类的
System.out.println(s.getAge());// 父使用父类的
s.queryCourse();//父类的
s.writeInt();//子类的
}
}
总结
继承的特点
1.子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
public void eat(),公有时候,
t.eat();不报错。
改为私有就报错。
package com.itheima.d7_extends_feature;
public class Test {
public static void main(String[] args) {
//目标:理解继承的特点
//1.子类不能继承父类的构造器
// 2.子类是否可以继承父类的私有成员?可以的,只是不能直接访问。
Tiger t = new Tiger();
t.eat();
}
}
class Animal {
public void eat() {
System.out.println("动物要吃东西");
}
}
class Tiger extends Animal {
}
总结
总结
继承后:方法重写
package com.itheima.d9_extends_methodoverride;
public class Test {
public static void main(String[] args) {
NewPhone huawei = new NewPhone();
huawei.call();
huawei.sendMessage();
}
}
/**
* 新手机:子类
*/
class NewPhone extends Phone {
//重写方法
public void call() {
super.call();//先用爸爸的基本功能
System.out.println("支持视频通话~~~");
}
//重写方法
public void sendMessage() {
super.sendMessage();
System.out.println("支持发送图片和视频~~~");
}
}
/**
* 父类
*/
class Phone {
public void call() {
System.out.println("打电话开始~~");
}
public void sendMessage() {
System.out.println("发送短信开始~~");
}
}
面试题
总结:
继承后:子类构造器的特点
package com.itheima.d10_extends_constructor;
public class Test {
public static void main(String[] args) {
Dog d1 = new Dog();
System.out.println(d1);
System.out.println("--------------");
Dog d2 = new Dog("金毛");
System.out.println(d2);
}
}
class Animal {
public Animal() {
System.out.println("==父类Animal无参数构造器被执行===");
}
}
class Dog extends Animal {
public Dog() {
// super();//写不写都有,默认找父类的无参数构造器执行
System.out.println("==子类Dog无参数构造器被执行===");
}
public Dog(String name) {
// super();//写不写都有,默认找父类的无参数构造器执行
System.out.println("==子类Dog无参数构造器被执行===");
}
}
继承后:子类构造器访问父类有参构造器
父类
package com.itheima.d11_extends_constructor2;
public class People {
private String name;
private int age;
public People() {
}
public People(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
}
子类
package com.itheima.d11_extends_constructor2;
public class Teacher extends People {
public Teacher(String name,int age) {
//调用父类的有参数构造器,初始化继承自父类的数据
super(name,age);
}
}
测试
package com.itheima.d11_extends_constructor2;
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher("dilei", 18);
System.out.println(t.getName());
System.out.println(t.getAge());
}
}
绕一圈出结果。
总结
this、super使用总结
案例
package com.itheima.d12_this;
public class Student {
private String name;
private String schoolName;
public Student() {
}
public Student(String name) {
// 借用兄弟构造器!
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 setSchoolNane(String schoolName) {
this.schoolName = schoolName;
}
}
package com.itheima.d12_this;
public class Test {
public static void main(String[] args) {
//目标: 理解 this (...)作用,本类构造器去访问本类兄弟构造器
Student s1 = new Student("殷素素","冰火岛自学");
System.out.println(s1.getName());
System.out.println(s1.getSchoolName());
/*
如果学生不填学校,默认这个对象的学校是黑马
*/
Student s2 = new Student("张三丰");
System.out.println(s2.getName());
System.out.println(s2.getSchoolName());
}
}
注意:this(…) super(…) 都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。
因为this(...)调用了兄弟构造器,而兄弟构造器里面有了super(…)调用父亲的,所以二者不能共存在同一个构造器中。