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类,然后再依次向下执行类的初始化块和构造方法,直到当前的类为止。静态代码块的调用的顺序也是和构造方法的一样。



关注公众号,随时获取最新资讯

细节决定成败!
个人愚见,如有不对,恳请斧正!

posted @ 2020-03-05 10:37  一点浩然气~  阅读(224)  评论(0编辑  收藏  举报