Java | 继承
Java的三大特性
java是一个面向对象的语言,所以java也有面向对象语言的三大特性:继承,封装,多态,任何一个java项目,都会用到这三种特性,所以掌握好这三大特性非常的重要。
继承
继承就是让我们可以更加方便的实现类的扩展了,不用重复的造轮子了,跟据他的字面意思,继承就一个A类是继承B类,而这个A类就是B类的了类,B类就是A类的父类。
继承的详细使用
继承一个类,就继承了一个类所有的非私有属性和非私有方法,这是就为什么继承可以避免重复造轮子:
例:
public class User {
public static void main(String[] args) {
//创建一个对象
Student student = new Student();
//在这里学生类可以调用 人类的所有属性和方法
student.name = "张三";
student.age = "18";
student.clazz = "A班";
//调用人类的吃饭方法
student.eat();
//判断这个类是不是Person的子类
System.out.println(student instanceof Person);
//输出的结果:true
}
}
//人类 人类共有的方法和属性
class Person{
//姓名
String name;
//年龄
String age;
//吃饭方法
public void eat() {
System.out.println("吃钣");
}
}
//学生类 学生独有的属性和方法
class Student extends Person {
//班级
String clazz;
public void study() {
System.out.println("学习");
}
}
上面就是继承的用法,学生类就是人类的子类,而人类就是学生类的父类,其实父类就是把子类的共同的属性给提取出来,然后可以减少代码量,大大的增加开发效率,比如人类,还有子类,工人类,教师类 等等。
而每一个类只能有一个直接父类,但是父类也可以拥有父类,比如,所以的Java类都有一个共同的父类,就是Object类。
判断一个类是不是这个的类的子类,可以用instanceof来判断,如果为true侧是这个类的父类,反之就不是。
重写
重写,是在感觉父类的方法不够自己用的情况下,覆盖父类的方法,来实现自己的个性需求,重写有自己的注解:@override,并且有以下几个要点:
- 方法名相同,形参列表不相同
- 返回值类型和异常声明类型,子类要小于父类
- 子类的访问权限要大于等于父类
例:
//经合以上代码
//学生有自己的吃饭的方法,不想用人类的了
class Student extends Person {
//班级
String clazz;
public void study() {
System.out.println("学习");
}
//学生的吃饭方法
@Override
public void eat() {
System.out.println("在食堂吃钣");
}
}
//再一次调用student.eat的时候,输出的是:在食堂吃钣
所以说,重写就是在父类的基础上来实现自己的个性化需求。
在上面也说了,Object是所有类的父类,是因为java程序把所有的类可能用得到的方法全都提取到这里面了,所以说,我们所有的类自己拥有Object类的方法,也可以重写这个方法。
public void User{
String name;
int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
//这个方法就是重写Object的方法
//如果不重写这个方法,用user调用的时候,打印的就是这个类的地址了。
@Override
public String toString(){
return "姓名:"+name+"年龄:"+age;
}
public static void main(String[] args){
User user = new User("张三",18);
System.out.println(user.toString());
}
}
super关键字
super是直接调用父类对象的引用,可以通过super来访问父类中被子类覆盖的方法或属性。
例:
//经合以上代码
//学生有自己的吃饭的方法,不想用人类的了
class Student extends Person {
//班级
String clazz;
public void study() {
System.out.println("学习");
}
//学生的吃饭方法
@Override
public void eat() {
super.eat();
System.out.println("在食堂吃钣");
}
}
//再一次调用student.eat的时候,输出的是:吃钣 在食堂吃钣
因为在子类的eat方法中调用了父类中的吃钣方法,所以会输出吃饭两个字。
还有就是我们在调用构造方法的时候,其实构造方法里面会默认调用父类的构造方法,
public class User{
public static void main(String args[]){
System.out.println("创建一个学生对象");
new Student();
}
}
//人类
class Person{
public Person() {
System.out.println("人类的构造方法");
}
}
//学生类
class Student extends Person {
public Student() {
System.out.println("学生的构造方法");
}
}
/*最后的结果:
人类的构造方法
学生的构造方法
*/
因为构造方法的第一句总是:super(),来调用父类对应的构造方法,所以,流程是:先向上追溯到Object类,然后再依次向下执行类的初始化块和构造方法,直到当前的类为止。静态代码块的调用的顺序也是和构造方法的一样。
关注公众号,随时获取最新资讯
细节决定成败!
个人愚见,如有不对,恳请斧正!