Java对象知识二
继承
Java是单继承,使用继承可以增加代码复用,解决代码的冗余问题。
继承关键字extends
继承只能够有一个父类,它的关键字是extends,C#使用的关键字是":",解决这一问题可以使用接口。
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
通过继承,子类可以访问父类:
- 子类访问父类成员:
- 访问父类构造方法:使用super关键字,super代表父类对象,在子类构造方法中调用且必须是第一句
super();
super(name);
但也有一些东西,是父类特有的,如:
- 私有变量
- 不能继承构造方法,但是可以使用super去调用
- 子类和父类不在同包,使用默认权限的成员。
访问修饰符的作用域:
访问修饰符 | 同一个类 | 同一个包 | 它的子类 | 其它 |
---|---|---|---|---|
private | 可以 | |||
默认(什么都没有) | 可以 | 可以 | ||
protect | 可以 | 可以 | 可以 | |
public | 可以 | 可以 | 可以 | 可以 |
需要特别注意的是:
public虽然在表中的作用域中都可以,但是必须要在同一个项目中,要是想要在不同项目,必须要将他们打包为一个JAR包。
访问修饰符protect
- 可以修饰属性和方法
- 本类、同胞、子类可以访问
多重继承
在项目运行时,子类会优先去寻找继承关系,若存在多重继承关系,它会去找到最原始的父类对象,所以java中就会存在缺陷,建议少用继承多用组合(将父类当作参数传入)。
多重继承的初始化顺序
父类属性----> 父类构造方法---->子类属性----->子类构造方法。(当方法名相同时,子类会重写父类方法。)
方法重写
即子类重写父类的方法,方法重写的规则如下:
- 方法名相同
- 参数列表相同
需要注意的是:构造方法不能够被继承只能调用(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;
}