Java对象知识

Java对象知识二

继承

Java是单继承,使用继承可以增加代码复用,解决代码的冗余问题。

继承关键字extends

继承只能够有一个父类,它的关键字是extends,C#使用的关键字是":",解决这一问题可以使用接口。

更多关于C#继承请点击了解

继承

兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

食草动物和食肉动物又是属于动物类。

所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。


通过继承,子类可以访问父类:

  1. 子类访问父类成员:
  2. 访问父类构造方法:使用super关键字,super代表父类对象,在子类构造方法中调用且必须是第一句
    super();
    super(name);

但也有一些东西,是父类特有的,如:

  1. 私有变量
  2. 不能继承构造方法,但是可以使用super去调用
  3. 子类和父类不在同包,使用默认权限的成员。

访问修饰符的作用域:

访问修饰符同一个类同一个包它的子类其它
private可以
默认(什么都没有)可以可以
protect可以可以可以
public可以可以可以可以

需要特别注意的是:

public虽然在表中的作用域中都可以,但是必须要在同一个项目中,要是想要在不同项目,必须要将他们打包为一个JAR包。

访问修饰符protect
  1. 可以修饰属性和方法
  2. 本类、同胞、子类可以访问

多重继承

在项目运行时,子类会优先去寻找继承关系,若存在多重继承关系,它会去找到最原始的父类对象,所以java中就会存在缺陷,建议少用继承多用组合(将父类当作参数传入)。

为什么要少用继承,多用组合?

多重继承的初始化顺序

父类属性----> 父类构造方法---->子类属性----->子类构造方法。(当方法名相同时,子类会重写父类方法。)

方法重写

即子类重写父类的方法,方法重写的规则如下:

  1. 方法名相同
  2. 参数列表相同

需要注意的是:构造方法不能够被继承只能调用(super)。

方法重写与重载的区别
位置方法名参数表返回值访问修饰符
方法重写子类相同相同相同或者是其子类不能比父类更严格
方法重载同类相同不相同无关无关
Object类

🟪Object 是 Java 类库中的一个特殊类,也是所有类的父类。

也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。

🟦Java里面除了Object类,所有的类存在继承关系的。

🟩Object 类位于 java.lang 包中,编译时会自动导入, 当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。

Object会存在一些经常被重写的方法:toString、equals、hashCode、getclass

其中equals():和==没有区别(比较两个对象是否是同一个对象),都是去比较两者的哈希地址。

当有特殊需求,如认为属性相同即为同一对象时,需要重写equals()。
例如:java.lang.String 就重写了equals()方法,把equals()方法的判断变为了判断其值。

public class TestSon {
    public static void main(String[] args) {
    //有父类和爷爷类,输出的内容是什么?why?
//      爷爷的无参构造方法。
//      父类无参构造方法。
//      子类无参构造方法。
        
    Son son = new Son();
    //方法重写
    //输出内容:oop.charpter4.Son@439f5b3d
    System.out.println(son.toString());
    }
}

重写equals和hashCode
    /**
     * 重写equals,需要注意的是,重写equals方法后它的hashcode是不会变得,所以还得重写hashcode
     */
    @Override
    public boolean equals(Object obj) {
        //非空判断
        if(this == null) {
            return false;
        }
        //如果当前对象和参数对象内存地址一致,直接返回true,赋值
        //a = 1;b = a;--内存地址一样,没有必要再做比较.
        if(this == obj) {
            return true;
        }
        //判断传进来的参数对象和当前对象里的属性的值一致,返回true
        //instanceof 判断是否有继承或实现关系,有则返回true 没有则返回false,就相当有先固定范围
        if(obj instanceof Student) {
            Student student = (Student) obj;//将大的Object转换为小的学生类
            //非空判断
            if(student.ID == null || "".equals(student.ID) || student.name == null || "".equals(student.name)) {
                return false;
            }
            if(student.ID.equals(this.ID) && student.name.equals(this.name)) {
                return true;
            }
        }
        
        return false;
        
        
    }
    
    
    
    
    @Override
    public int hashCode() {
        int result = 17;
        result = 31*result + (ID == null ? 0 : ID.hashCode());
        result = 31*result + (name == null ? 0 : name.hashCode());
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值