一.方法的重写(覆盖)
1.什么时候需要覆盖?
父类的方法无法满足子类的需求,需要覆盖。
2.覆盖的要求:
①返回值类型、方法名、形参列表和父类完全一致
②修饰符和父类相同或者比父类更宽
注意:当子类覆盖父类方法后,调用该方法,执行的是覆盖之后的。
二.方法的重载
重载,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者重载方法。在Java中同一个类中的2个或2个以上的方法可以有同一个名字,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载,这个过程称为方法重载;其实我通俗的理解就是省了给method重新命名了,差不多的都用一个
package Bey;
public class Vehicle { //父类 车辆类--具有小汽车类、公共汽车类、新能源汽车类共同的属性和方法
public String brand; //品牌
public String name; //名字
public String color; //颜色
public String vin; //车架号
public void canRun(){
System.out.println("汽车会跑");
}
public void manned(){
System.out.println("汽车能载人");
}
}
package Bey;
//小汽车类
public class Car extends Vehicle {
public Car(){ //调用父类的构造方法
super();
System.out.println("子类的构造方法");
}
//能载2,3个人
public void manned(){
System.out.println("这是子类重写的方法...");
System.out.println("小汽车能载2,3个人");
}
public Car(String name,String color){
this.name=name;
this.color=color;
}
}
package Bey;
//公共汽车类
public class bus extends Vehicle {
//能载很多人
public void manned(){
System.out.println("这是子类重写的方法...");
System.out.println("公共汽车能载很多人");
}
public bus(String name,String color){
this.name=name;
this.color=color;
}
}
package Bey;
//新能源汽车
public class Newenergy extends Vehicle {
public Newenergy(String name,String color){
this.name=name;
this.color=color;
}
public void canRun(){
System.out.println("新能源汽车会跑");
}
}
package Bey;
public class Test { //多态 实现
public static void main(String[] args) {
Vehicle v1=new Car();
v1.brand ="特斯拉";
v1.color ="银色";
v1.name ="Model3";
v1.vin ="LA233W23451234856";
System.out.println(v1.name);
Vehicle v2=new bus(null, null);
Vehicle v3=new Newenergy(null, null);
v1.manned();
v2.manned();
v3.canRun();
}
}
三.重载和覆盖区别?
重载(Overload):一个类中定义多个相同名称的方法。
要 求:
1.方法名相同
2.参数列表不同(类型、个数、顺序)
3.与访问修饰和返回值类型无关
覆盖(Override):父类方法无法满足子类需求,需要进行覆盖。
要 求:
1.返回值类型、方法名、形参列表和父类完全一致
2.修饰符和父类相同或者比父类更宽
四.super(父类 基类 超类)
1.用法:
super.成员方法():表示调用父类中的成员方法
super.属性:表示调用父类的属性
super()和super(实参):表示调用父类构造方法
2.注意:如果构造中没有this()或者this(实参)或者super(实参),每一个构造方法中首行都隐式存在super()。
3.在一个构造中this()或者this(实参)或者super()或者super(实参)因为都要求在首行,所以只能使用一个。
五.Object类
(一).Object类是Java中所有类的超类(父类)
(1).所有类都默认继承自Obejct类 (2).每个类都可以使用Object类的方法
1. toString()返回该对象的字符串表示,通常该方法会返回一个“以文本方式表示”的对象的字符串。 toString() 为了方便输出
2. hashCode()返回该对象的哈希码值。 不同的地址哈希码值不同
3. equals()指示某个其它对象是否与此对象“相等”。 equals() 用equals进行比较内容时,只能比较引用数据类型,比较的是地址
(二).
public final Class getClass():得到引用中保存的真实类型。
应用场景:判断两个引用中保存的真实类型是否一致
public int hashCode():返回该对象的哈希码值,根据物理地址换算得来的int整数
注意:相同地址的对象返回相同哈希值,不同地址的对象返回不同哈希值。
public String toString():返回该对象的字符串表示。组成部分包名+类名+@+当前对象的哈希值转换为16进制使用字符串进行表示。(掌握)
注意:
1.打印对象名默认调用toString()
2.Object类中的toString()方法调用没有价值,大多数情况在子类中都会进行覆盖。
3.覆盖的原则:返回当前对象的所有属性值。
public boolean equals(Object obj):默认比较地址,覆盖后比较内容。
注意:默认比较两个对象的地址,==也是比较地址,所以equals需要进行覆盖,覆盖的要求:比较对象的内容
覆盖的步骤:
(1).obj是否为null
(2).两个对象地址是否相同
(3).两个对象类型是否相同
(4).强转
(5).比较两个对象的每一个属性值
面试题:“==”和“equals”的区别?
==:比较基本数据类型比较的是数值是否相同;
比较引用数据类型比较的是地址是否相同
equals:只能比较引用类型,默认比较地址;覆盖之后比比较内容
六.final关键字
- final表示最终的、最后的,可以用来修饰类、方法、属性(变量)
- final修饰的类不能被继承
- final修饰的方法不能被重写
- final修饰的属性(变量)不能被改变--就是常量的定义方式