为了账号安全,请及时绑定邮箱和手机立即绑定

Java面向对象之继承性

标签:
Java
一、类的继承

A类继承B类,是指A类可以拥有B类的非私有属性和方法,同时A类也可以自己定义属性方法或重写方法以扩充自己的功能。

1.1 方法的重写
重写方法时,方法的方法名、返回值类型和参数个数及类型均需一致。

首先定义父类Animal,包含年龄、名字两个属性及吃的方法。

public class Animal {
    int age;
    String name;
    public void eat(){
        System.out.println("动物可以吃东西");
    }
}

通过子类Dog继承父类Animal,并重写eat方法,在调用重写的eat方法之前,设置继承来的年龄属性值为10。

public class Dog extends Animal{
    public void eat(){
        System.out.println(age+"岁的狗狗可以吃东西");
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        dog1.age = 10;
        dog1.eat();//10岁的狗狗可以吃东西
    }
}
1.2 继承的初始化顺序

初始化即执行类的构造方法,在Java中,继承的初始化顺序如下:

父类的属性 > 父类的构造方法 > 子类的属性 > 子类的构造方法
public class Animal {
    int age = 10;
    public Animal(){
        System.out.println("父类Animal执行了");
        age = 20;
    }
}
public class Dog extends Animal{
    public Dog(){
        System.out.println("子类Dog执行了");
    }
    public static void main(String[] args) {
        Animal a = new Animal();
        System.out.println(a.age);
        Dog dog1 = new Dog();
    }
}

运行结果如下图所示:
运行结果

当使用final关键字后,变量就成了常量,值不能被改变;方法也不能被继承使用。

二、this与super
2.1 this关键字

this关键字代表当前对象,this.属性代表操作当前对象的属性,this.方法代表调用当前对象的方法。

2.2 super关键字

super在对象内部使用,代表父类对象。如果要调用父类的属性age,使用super.age;如果要调用父类的方法eat(),使用super.eat()。如下代码所示:

public class Dog extends Animal{
    int age = 20;
    public void eat(){
        System.out.println(age+"岁的狗狗可以吃东西");
    }
    public Dog(){
        System.out.println("子类Dog执行了");
    }
    public void method(){
        super.eat();
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        dog1.method();//动物可以吃东西
    }
}

子类构造的过程当中,必须调用其父类的构造方法。在子类的构造方法第一句隐式的写了一句super();

public class Dog extends Animal{
    int age = 20;
    public Dog(){
        super();//写与不写都一样,系统隐式调用
        System.out.println("子类Dog执行了");
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        //父类Animal执行了
        //子类Dog执行了
    }
}

如果子类的构造方法中没有显示的调用父类的构造方法,则系统默认调用父类无参的构造方法。如果显示的调用构造方法,必须在构造方法的第一行。

所以,如果子类的构造方法中既没有显示的调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。

三、Object类

Object类是所有类的父类,默认被所有类继承。

3.1 toString()

toString()方法返回对象的地址(即Hash码),如果要查看对象的属性及属性值,则可以重写toString()方法(通过eclipse菜单中source可自动生成)。

public class Dog extends Animal{
    int age = 20;
    @Override
    public String toString() {
        return "Dog [age=" + age + "]";
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        System.out.println(dog1.toString());//未重写方法前的结果:Dog@15db9742
        System.out.println(dog1.toString());//Dog [age=20]
    }
}
3.2 equals()

equals()方法比较的是两个对象的引用是否指向同一块内存地址。

public class Dog extends Animal{
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        Dog dog2 = new Dog();
        if(dog1.equals(dog2)){
            System.out.println("两个对象相同");
        }else{
            System.out.println("两个对象不同");
        }
    }
}

输出的结果是“两个对象不同”。如果仅需判断两个对象的属性值是否相等,可以通过eclipse重写equals方法。如下代码所示:

public class Dog extends Animal{
    @Override
    public boolean equals(Object obj) {
        if (this == obj) //如果参数对象和当前对象相同,则一定相同
            return true;
        if (obj == null) //如果参数对象为空,则一定不同
            return false;
        if (getClass() != obj.getClass())//如果参数对象的类对象和当前对象的类对象不相等,则不相同
            return false;
        Dog other = (Dog) obj;//将参数进行强制转换
        if (age != other.age) //若属性值相等,则相同
            return false;
        return true;
    }
    public static void main(String[] args) {
        Dog dog1 = new Dog();
        dog1.age = 15;
        Dog dog2 = new Dog();
        dog2.age = 15;
        if(dog1.equals(dog2)){
            System.out.println("两个对象相同");
        }else{
            System.out.println("两个对象不同");
        }
    }
}

最后输出结果是,两个对象相同。

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
软件工程师
手记
粉丝
36
获赞与收藏
349

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消