【0基础学java】教学日志:javaSE-面向对象4-继承、super、方法重写、抽象类、抽象方法、final、Object类
本章概述
本章属于面向对象第三章的内容,主要讲解继承、super、方法重写、抽象类、抽象方法、final、Object类等知识点。
?一、继承
?
1、为什么要使用继承?
使用继承优化后:
?子类和父类是is-a的关系
2、继承是什么?
?
e、多重继承关系的初始化顺序是怎样的?
1、父类属性---->2、父类构造方法---->3、子类属性---->4、子类构造方法
f、理解继承示例代码
?public class TestExtends { public static void main(String[] args) { Mammal m1 = new Mammal(); m1.puru(); m1.eat(); } } class Animal { String eyes="眼睛"; String name="无名"; public void eat(){ System.out.println("动物吃东西!"); } } class Mammal extends Animal { //哺乳 public void puru(){ eyes=“嘴巴”; System.out.println("小动物吃奶!"); } }
g、在何处使用继承?
何时使用继承?
---- 继承和真实世界类似
---- 只要说“猫是哺乳动物”,猫的很多属性、行为就不言自明了
---- 藏獒是一种狗
符合is-a关系的设计使用继承
---- 继承是代码重用的一种方式
将子类共有的属性和行为放到父类中
h、代码分析
class Car { private int site = 4; //座位数 Car(){ System.out.println ("载客量是"+site+"人); } public void setSite(int site){ this.site = site; } void print(){ System.out.println ("载客量是"+site+"人); } } class Bus extends Car { Bus(int site){ setSite(site); } } public class BusTest{ public static void main(String[] args) { Bus bus = new Bus(20); bus.print(); } }
i、小结
---- 通过继承可以简化类的定义,实现代码的重用
---- 子类继承父类的成员变量和成员方法,但不继承父类的构造方法
---- java中只有单继承 ,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复
杂,系统难于维护。就像我们现实中,如果你有多个父母亲,那是一个多么混乱的世界啊。多继
承,就是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。
---- java中的多继承,可以通过接口来实现
---- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object。
三、方法重写【课堂Demo同上】
1、在子类中可以根据需要对从基类中继承来的方法进行重写。
2、重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
3、重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
4、重写示例代码
public class TestOverride { public static void main(String[] args) { Animal animal = new Animal(); animal.shout(); Dog dog = new Dog(); dog.shout(); } } class Animal{ void shout(){ System.out.println("发出声音!"); } } class Dog extends Animal { void shout(){ System.out.println("旺旺旺!"); } }
?
5、小结:
---- 构造方法也会被重写吗?
不能被继承,因此不能重写
---- 方法重写的规则
方法名相同
参数列表相同
返回值类型相同或者是其子类;
访问权限不能严于父类
---- 方法重载与方法重写的区别
?
---- super关键字来访问父类的成员
---- super只能出现在子类的方法和构造方法中
---- super调用构造方法时,只能是第一句
---- super和this不能同时出现在构造方法中
---- super不能访问父类的private成员
---- super和this都不能再static方法中
四、抽象类、抽象方法
1、课堂Demo【重点掌握】
父类 Pet.java
?package netclass04.abstracts; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 14:36 * @Description: netclass04.abstracts * @version: 1.0 */ public abstract class Pet { private String name; private int age; public Pet(){ } public Pet(String name,int age){ this.name = name; this.age = age; } //抽象方法 public abstract void print(); public void show(){ System.out.println("Pet show... ..."); } }
子类 Dog.java
package netclass04.abstracts; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 14:39 * @Description: netclass04.abstracts * @version: 1.0 */ public class Dog extends Pet{ private String gender; @Override public void print() { System.out.println("dog print... ..."); } }
测试类 PetTest.java
package netclass04.abstracts; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 14:41 * @Description: netclass04.abstracts * @version: 1.0 */ /* * java中的对象是对现实世界的具象化,但是在现实世界中,某些类并不具备实例化的意义,因此可以定义为抽象类 * * 抽象类: * 1、创建抽象类的时候需要添加 abstract 的关键字 * 2、不能进行实例化,也就是不能new对象 * 3、抽象类中的某些方法需要子类进行更丰富的实现,父类实现没有意义,此时可以将抽象类 * 中的方法定义为抽象方法,没有具体的实现,只包含方法名称,返回值,参数列表,访问修饰符 * 4、使用abstract关键字修饰的方法叫做抽象方法,可以不写方法的实现 * 5、子类在继承抽象父类的时候,必须要将父类中的抽象方法进行实现或者将子类也定义为抽象类 * 6、有抽象方法的一定是抽象类,但是抽象类中不一定包含抽象方法 * */ public class PetTest { public static void main(String[] args) { Dog dog = new Dog(); dog.print(); // Pet pet = new Pet(); } }
五、final
1、课堂Demo【重点掌握】
FinalDemo.java
package netclass04.abstracts; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 14:54 * @Description: netclass04.abstracts * @version: 1.0 */ /* * final的使用: * final可以修饰变量: * 表示变量的值不可变 * final可以修饰方法: * 表示方法不可以被重写 * final可以修饰类: * 表示类不可以被继承 * * */ public /*final*/ class FinalDemo { private String name; // public FinalDemo(){ // super(); // } public String getName() { return name; } public void setName(String name) { this.name = name; } public static final int num = 10; public final void show(){ System.out.println("FinalDemo... ..."); } public static void main(String[] args) { // FinalDemo fd = new FinalDemo(); // fd.num = 20; // FinalDemo.num = 20; // num = 20; // System.out.println(num); final FinalDemo fd = new FinalDemo(); fd.show(); // fd = new FinalDemo(); fd.setName("jason"); System.out.println(fd.getName()); } }
FinlaSubClass.java
package netclass04.abstracts; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 14:59 * @Description: netclass04.abstracts * @version: 1.0 */ public class FinalSubClass extends FinalDemo{ // @Override // public void show(){ // // } }
?
六、Object类
1、Object类是所有类的父类
一个类如果没有使用extends显性的继承另外一个类,那么这个类就继承自Object类。
2、源码解析(涉及到Object中常用的10个方法)
getClass()、hashCode()、equals(Object)、clone()、toString()、notify()、notifyAll()、wait()、wait(long)、wait(long,int)
?
finalize()方法为过时的方法或者说是不推荐的方法,主要作用是标识在堆中的对象哪些是没有被引用的,方便JVM中的GC进行垃圾回收。
3、对象的比较—==和equals()
a、==:
---- 比较两基本类型变量的值是否相等
---- 比较两个引用类型的值即内存地址是否相等,即是否指向同一对象。
b、equals() :
两对象的内容是否一致
c、自定义类须重写equals(),否则其对象比较结果总是false。
通过阅读Object源码可知,equals()方法的实现是用==完成的
?一、继承


- 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
- 提高代码的复用性!
- extends的意思是“扩展”。子类是父类的扩展
- 不同的叫法:超类、父类、基类、子类、派生类



Object源码摘抄 public boolean equals(Object obj) { return (this == obj); }4、Object课堂Demo【重点掌握】 ?package netclass04.abstracts; import java.util.Objects; /** * @Auther: Yu Panpan * @Date: 2022/1/12 - 01 - 12 - 15:14 * @Description: netclass04.abstracts * @version: 1.0 */ public class Teacher{ private String name; private int age; private double salary; public Teacher() { } public Teacher(String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } 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 double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } // @Override // public boolean equals(Object o){ // Teacher t =(Teacher) o; // return (this.name == t.name && this.age == t.age && this.salary == t.salary); // } @Override public boolean equals(Object o) { if (this == o)