文章目录
1.什么是父类和子类?
简单来说,当存在一个类Father,当我们使用关键字extends,class写出下面语句:
class Son extends Father{
.....
}
我们就定义了Son和Father之间的父子关系。
上面定义的是一个名为Son的新类,和直接用class Son{}不同,它使用extends继承了Father类。
类Son和Father的关系是: Son是Father的子类,Father是Son的父类。
2.子类继承了父类的什么?
我们知道类的两个重要的成员:变量和方法。
父类有自己的变量和方法,子类继承了父类的一些成员,子类不仅拥有自己的变量和方法,而且子类也可以继承父类的一些变量和方法。
子类可以直接使用它继承的父类中的成员。我们都知道类是通过它的构造方法来为自己分配变量内存空间的,由于子类继承了父类,所以子类的构造方法默认会先调用父类的构造方法,然后再用自己的构造法方法。(但这并不是继承,即子类不继承父类的构造方法)
继承很好的解决了代码复用以及功能纵向扩展。
例子:
public class Father{
int money = 1000000;
void fight(){
System.out.println("I will kill you")
}
}
class Son extends Father{
int weight = 10;
}
在这一段代码中,Son继承了Father的money变量和fight方法。相当于Son的实际定义是:
class Son{
int money = 1000000;
int weight=10;
void fight(){
System.out.println("I will kill you")
}
}
3.继承的限制
子类并不能继承父类的所有变量和方法,它是有限制的。
(1)子类和父类在同一包中的继承性:除了private成员变量和方法,其他public,protected,无修饰符的变量和方法都继承了。
(2)子类和父类不在同一包中:子类只继承父类的protected和public成员。(这里protected和友好类的差别出现了)
4.类的树形结构
Object是所有的类的祖先类,系统默认。
类似于:
其中Object是系统默认的祖先类,即它是任何一个类的祖先类。K是B的子孙类,他们之间也存在继承关系。
5.Object类中的方法(先了解需要了解的)
5.1 protected Object clone()
5.1.1 方法介绍
创建并返回此对象的克隆副本。(副本和本体是两个独立的对象)
注意:这个方法是用protected修饰符修饰的。
用protected修饰的成员变量和方法被称为受保护的成员变量和方法。当在另外一个类中用一个类创建了一个对象后,如果两个类在同一包中,那么该对象可以访问该类的protected变量和方法,否则不可见。
所以,当我们在自己的包中新建一个类并使用Object创建对象的时候,我们是不能直接使用其clone方法的。
5.1.2 使用教程
既然我们知道Object是所有类的父类,那么我们就可以通过super关键字来调用啊。
public class ObjectStudy{
public static void main(String[] args) throws CloneNotSupportedException {
ObjectStudy objectStudy = new ObjectStudy();
System.out.println(objectStudy.Test().toString());
}
public Object Test() throws CloneNotSupportedException {
return super.clone();
}
}
但是我们可以看到程序运行抛出了一个异常:
CloneNotSupportedException
通过查看源码我发现了下面这段话:
if the object’s class does not support the Cloneable interface. Subclasses that override the clone method can also throw this exception to indicate that an instance cannot be cloned
翻译过来就是:
如果对象的类不支持Cloneable接口。重写克隆方法的子类也可以抛出此异常,以表明无法克隆实例
通过这里我们得知,想要实现对一个对象的克隆,其类定义需要实现Cloneable接口。
public class ObjectStudy implements Cloneable{
public static void main(String[] args) throws CloneNotSupportedException {
ObjectStudy objectStudy = new ObjectStudy();
System.out.println(objectStudy.Test().toString());
}
public Object Test() throws CloneNotSupportedException {
return super.clone();
}
}
成功!!
5.2 public boolean equals(Object obj)
5.2.1 方法介绍
通过名称我们可以知道,这个方法用来判断对象本身和另一个对象是否相等。
通过查看方法体:
public boolean equals(Object obj) {
return (this == obj);
}
我们知道在Object中,此方法的默认实现是通过比较对象引用的值来判断两个对象是否相等。
5.2.2 使用教程
public class ObjectEqualsStudy {
public static void main(String[] args) {
Object ojb = new Object();
Object ojb2 = new Object();
System.out.println("ojb: "+ojb);
System.out.println("ojb2: " +ojb2);
System.out.println(ojb.equals(ojb2));
System.out.println(ojb.equals(ojb));
}
}
5.3 int hashCode()
5.3.1 方法介绍
这个方法的作用就是返回对象的唯一哈希码值(理论上)。
5.3.2 使用教程
public class ObjectHashCodeStudy {
public static void main(String[] args) {
Object obj = new Object();
System.out.println(obj.hashCode());
}
}
5.4 String toString()
5.4.1 方法介绍
返回此对象的字符串表示。
public String toString() {
//这个Integer.toHexString()是十进制转为无符号的16进制字符串表示
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
5.4.2 使用教程
public class ObjectToStringStudy {
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.toString());
}
}
代码地址:
Java基础学习/src/main/java/exa11 · 严家豆/Study - 码云 - 开源中国 (gitee.com)