面向对象-继承和方法重写
一.继承
1.继承的引入
泛化:把子类共有的属性和方法抽取到父类的过程
特化:在父类的基础上去扩充特殊(特有的)的属性和方法
父类/基类 子类/派生类
2.语法:
class 子类的类名 extends 父类的名字{
}
3.权限修饰符
图解(例如):
public:类,包,子类,不同的包 都可以修饰
public:可以修饰类,方法,成员变量,构造方法
protected:可以修饰方法,成员变量,构造方法*
默认不写:可以修饰类,方法,成员变量,构造方法*
private:可以修饰方法,成员变量,构造方法*
3.1技巧:
类要么是public 要么不写
所有的修饰符都能修饰方法,成员变量,构造方法
局部变量基本没有去加权限修饰符这个说法
3.2子类可以继承父类的哪些内容:
非私有的属性,方法,构造方法不能被继承
3.3继承的注意事项:
①.Java里面的只是支持单继承
②.支持多层级继承

③.每一个类都有一个直接父类,如果没有看到现实的继承代码,那么就隐式继承Object---超类,根类
解释理解:java里面所有的类都是Object(对象)的子类(直接/间接)
例如:
package com.ronghuanet._02extends;
public class ExtendsTets {
public static void main(String[] args) {
A a = new A();
B b = new B();
C c = new C();
}
}
// A其实是隐式继承自Object
class A{
}
class B extends A{
}
class C extends B{
//C拥有 A,B里面的非私有化的属性和方法
}
二.方法覆写:override
(方法覆盖,方法重写)
1.注解:
@Override 检测当前方法是不是方法覆写
2.为了解决什么:
主要解决父类方法功能性的不足,当父类的方法不能去满足子类的需求时候,对父类的功能加强
3.语法:
与父类方法一致
1.子类覆写方法的方法名必须和父类一致【把父类的方法copy到子类中】
2.子类方法的修饰符权限 不小于父类的修饰符权限【要么相同,要么大于父类修饰符的权限】
3.子类方法的返回值类型必须与父类相同或者是其子类
4.子类方法的形参列表必须和父类的形参列表相同
4.方法覆写以后的调用顺序:
优先调用子类自己的方法,如果子类没有再去父类里面找,如果父类也没有只有报错
5.相关面试题:
说说Overload 和 Override的区别?
三.super
1.
可以看成是父类对象,可以使用父类的属性和方法【大多数情况下都是子类和父类有重名的内容,指定要使用父类的】
2.
可以在子类的构造方法里面调用父类
2.1子类的每一个构造方法里面都在隐式去调用父类的无参数构造方法
2.2在子类的的构造方法里面调用父类必须写在第一句
其实在创建子类对象的时候父类的构造方法也要执行
3.注意:
在一个构造方法里不能****同时使用this 和 spuer
四.抽象类
【抽象类就是由abstract修饰的类】
1.特点:
1.1抽象类里面可以拥有的成员:成员变量,普通方法,抽象方法,构造方法
1.2抽象类虽然有构造方法,但是不能在外部创建对象,因为构造方法默认是protect创建的
1.3抽象类里面的抽象方法,子类必须覆写
2.抽象方法:
由abstract修饰方法并且没有方法体
抽象方法的主要作用是用来定义标准,不去定义实现
五.Object
1.Class<?> getClass() 返回此对象的的运行时类
2.int hashCode() 返回对象的哈希码值
3.String toString() 返回对象的字符串表示形式
4.boolean equals(Object obj) 比较两个对象是否相等
都没有static修饰,必须使用对象调用
①.对象的来源:
所有的类都是Object的子类,任意一个类的对象都能够调用Object类里面的方法
②.返回对象的哈希码值
在java语言里面,每一个对象都有一个哈希码值值,---理解为就是对象存储在内存的地址值
③.返回对象的字符串表示形式
覆写tostring为了以后在输出打印对象时,打印对象里面储存数据而不是地址
④.比较两个内容是否相等:
== :
用于基本数据类型比较,如果用于引用数据类型,比较的是对象的地址值是否相等
equals:
用于比较两个对象里面存储数据是否相等
面试题:
面试题:== 和 equals的区别?
解答:
==用于比较基本数据类型是否相等,如果用于引用数据类型比较的是对象的地址值,比较两个对象是否相等,需要使用equals,但是默认equals的底层还是== 所以我们需要重新覆写equals才能正常使用。