继承
继承讲解
-
继承的本质是对某一批类的抽象,从而实现对现实世界更好地建模。
-
extends的意思是扩展。子类是父类的扩展。
-
java只有单继承,没有多继承。(可以间接继承)
-
继承是类和类之间的关系。除此之外,类和类之间的关系还有依赖,组合,聚合等。
-
继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字的extends来表示。
-
子类和父类之间,从意义上讲是is a的关系。
//举例:
public class Demo02 {
//默认数据是default
int age;
private void say()
{
System.out.println("java");
}
}
//定义一个子类
public class Demo03 extends Demo02{
}
//主方法
public class Demo01 {
public static void main(String[] args) {
Demo03 d3=new Demo03();
d3.say();
}
}
运行上面的代码会发现,即使Demo03内没有定义任何方法,但是d3.say();依旧会输出java,这就是继承,子类可以继承父类的方法。但是如果将父类的方法的修饰符改为private就会发现,子类不能调用了,这是因为private是私有的,只允许同一个类使用。但是,一般属性才设为私有的。
快捷键
ctrl+h,会打开继承树,方便观看查找。
object类讲解(有的还没细致讲到)
Object类概述
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
简单来说就是,Object类是所有类的父类,包括我们所写的类,我们在使用类的时候就会利用Object类中的方法~
- Object类的hashCode()方法
public int hashCode();
返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
不同对象的 hashCode() 的值一般是不相同。但是,同一个对象的hashCode() 值肯定相同。(就好像身份证号一样,两个人的身份账号可能相同,但是一个人的身份证号肯定是不会变的~)
- Object类的getClass()方法
public final Class getClass()
返回此 Object 的运行时类。
public String getName()
可以通过 Class 类中的一个方法,获取对象的真实类的全名称。
这个方法在反射中会有很大的作用哦~
- Object类的toString()方法
public String toString()
返回该对象的字符串表示。
哎和讲好的不一样呀
别急~我们来看一下 toString() 方法的底层代码:
getClass().getName() + “@” + Integer.toHexString(hashCode()) 这返回的是:类的全路径名称+它的哈希码值在实际的开发中对我们来说是没有意义的所以我们一般会重写该方法。
重写 toString 方法
Alt+Shift+s
就会弹出这个页面
点击进入下一步
然后点击ok既可以了~
这下再运行代码就不一样了
(toString 是默认调用的可以省略哦~)
- Object类的equals()方法
public boolean equals();
指示其他某个对象是否与此对象“相等”
查看底层代码:
默认方法是比较的是对象的引用是否相同。由于比较对象的引用对于我们在实际开发中没有意义,一般还是要重写该方法。
步骤同上~
==号和equals方法的区别
“==” 是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
equals() 方法是一个方法,只能比较引用数据类型,所有的对象都会继承 Object 类中的方法,没有重写 Object 类中的 equals 方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性。
super讲解
//父类
public class Demo02 {
//默认数据是default
int age=11;
}
//子类
public class Demo03 extends Demo02{
int age=22;
public void test(int age){
System.out.println(age);
System.out.println(this.age);
System.out.println(super.age);
}
}
//主方法
public class Demo01 {
public static void main(String[] args) {
Demo03 d3=new Demo03;
d3.test(33);
}
}
运行后会发现该程序会输出:33 22 11
所以可以看出,当子类和父类的数据或者方法相同时,super是用来在子类访问父类的成员的,方法也是一样的(私有的就无法访问)。super和构造器的注意点:
//父类
public class Demo02 {
public Demo02()
{
System.out.println("Demo02");
}
}
/子类
public class Demo03 extends Demo02{
public Demo03()
{
System.out.println("Demo03");
}
}
//主方法
public class Demo01 {
public static void main(String[] args) { Demo03 d3=new Demo03;
}
}
这是运行程序会发现,会输出:Demo02 Demo03
这就证明了,子类会先调用父类的构造器,后调用自己的构造器。相当于在子类的输出前加了个super();这时如果我们再在子类中显式定义有参构造,然后使用this(“Demo02”);会发现报错。这是因为super();必须在构造器程序的第一行。
super和this区别
Super注意点:
- super调用父类的构造方法,必须在构造方法的第一行。
- super必须只能出现在子类的方法或构造方法中。
- super和this不能同时调用构造方法。
与this区别: - 代表对象不同:
- this:本身调用者这个对象。
- super:代表父类对象的引用。
- 前提不同:
- this:没有继承也可以使用。
- super:只能在继承条件下使用。
- 构造方法:
- this();本类的构造。
- super():父类的构造。