目录
继承:面向对象三大特征之一
使用继承来优化代码当类与类之间存在共性的内容,并满足子类是父类的一种,就可以来优化代码
一、什么是继承?继承的好处
1、继承是面向对象的三大特征之一,可以让类跟类之间产生父子关系。
2、Java中只支持单继承,不支持多继承,即每个类只能有一个父类。但支持多层继承
3、多层继承:子类A继承父类B,父类B继承父类C。
4、Java中所用的类都直接或间接继承于Object类。
5、可以把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码,提高代码的复用性
继承格式
1、编写父类
class Pet {
//公共的属性和方法
}
2、编写子类,继承父类,要通过extends来继承父类
class Dog extends Pet {
//子类特有的属性和方法
}
继承后子类的特点
1、子类可以得到父类的属性和行为,子类可以使用。
2、子类可以在父类的基础上新增其他功能。
3、继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。继承默认权限修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。
4、不能被继承的父类成员:private成员 、子类与父类不在同包,使用默认访问权限的成员、构造方法
作用域 修饰符 |
同一类中 | 同意包中 | 子类中 | 任何地方 |
private | 可以 | 不可以 | 不可以 | 不可以 |
默认修饰符 | 可以 | 可以 | 不可以 | 不可以 |
protected |
可以 |
可以 | 可以 | 不可以 |
public | 可以 | 可以 | 可以 | 可以 |
二、子类访问父类成员
访问父类构造方法:
super();
super(name);
访问父类属性:
super.name;
访问父类方法:
super.print();
1、super代表对当前对象的直接父类对象的默认引用
2、super必须出现在子类(子类的构造方法)中,且必须是第一句
3、不可以访问父类中定义为private的属性和方法
继承中成员变量访问特点:就近原则
先在局部位置找,本类成员位置上找,父类成员位置找,逐级往上。
如果出现重名变量怎么办?
System.out.println(name); //从局部位置往上找
System.out.println(this.name); //从本类成员位置往上找
System.out.println(super.name); //从父类成员位置往上找
多重继承关系的初始化顺序是怎么开始的?
1、父类属性—->父类构造方法-—–>子类属性——>子类构造方法
2、子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
3、子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
继承中的构造方法
1、如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。
2、如果子类的构造方法中通过super显式调用父类的有参构造,则将执行父类相应的构造方法,而不执行父类的无参构造方法。
3、如果子类的构造方法中通过this显式调用自身的其他构造方法,则在相应构造方法中应用以上两条规则。
三、方法重写
什么是方法重写?
方法重写:在子类中可以根据需求对从父类继承的方法进行重写,称为方法的重写或方法的覆盖。
方法重写的规则
1、重写方法和被重写方法必须具有相同的方法名
2、重写方法和被重写方法必须具有相同的参数列表
3、重写方法的返回值类型必须和被重写方法的返回值相同或者是其子类
4、重写方法不能缩小被重写方法的访问权限
5、只有被添加到虚方法中的方法才能被重写
6、方法重写本质:覆盖虚方法标中的方法
方法重写需加注解
@Override注解可以校验重写是否正确,具有良好的可读性。
方法重写和方法重载的区别
overload是方法重载,前提必须是同一个类中,重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。
override是方法重写,前提必须是继承关系,重写涉及的是子类和父类的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或是其子类)、访问修饰符不能严于父类。不能抛出比父类更多的异常
位置 |
方法名 |
参数表 |
返回值 |
访问修饰符 |
|
方法重写 |
子类 |
相同 |
相同 |
相同或是其子类 |
不能比父类更严格 |
方法重载 |
同类 |
相同 |
不相同 |
无关 |
无关 |
四、 Object类
Object类是所有类的父类。
在定义一个类时,没有使用extends关键字,也就是没有显式地继承某个类,那个这个类直接继承Object类。所有对象都继承Object类的方法。
Object类的常用方法
方法 |
说明 |
toString() |
返回当前对象本身的有关信息,按字符串对象返回 |
equals() |
比较两个对象是否是同一个对象,是则返回true |
hashCode() |
返回该对象的哈希代码值 |
getClass() |
获取当前对象所属的类信息,返回Class对象 |
重写Object类的toString()方法
public class Student
{
String name = "Mary";
int age = 21;
public static void main(String[] args)
{
Student s = new Student();
System.out.println(s);//直接输出对象信息
System.out.println(s.toString());//调用父类方法输出对象信息
}
}
public class Student
{
String name = "Mary";
int age = 21;
public String toString()
{
return "姓名:"+name+",年龄:"+age;
}
public static void main(String[] args)
{
Student s = new Student();
System.out.println(s);//直接输出对象信息
System.out.println(s.toString());//调用父类方法输出对象信息
}
}
重写Object类的equals()方法
判断两个值是否相等
package come.bdqn.day06.work3;
public class Student {
/**
* 姓名
*/
private String name;
/**
* 学号
*/
private int number;
public Student() {
}
public Student(String name, int number) {
this.name = name;
this.number = number;
}
@Override
public String toString(){
return "姓名:" + name + "学号:" + number;
}
@Override
public boolean equals(Object obj){
if (this == obj){
return true;
}else if (obj instanceof Student){
Student student = (Student) obj;
if (this.number == student.number && this.name.equals(student.name)){
return true;
}
}
return false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
五、final修饰符
在Java中,final修饰符可以用来修饰类、方法和变量(包括成员变量和局部变量)
修饰类:当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
使用final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。
final成员变量表示常量,只能被赋值一次,赋值后值不可以改变。
final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97219.html