目录
除了构造方法之外的所有的属性和方法都被继承。但是,不是所有的都能直接使用。
当打印一个对象时,如果没调用toString()方法,则会自动调用toString()方法。返回:类名@对象地址
一.IDEA快捷键和相关操作
1.类的结构视图: alt+7
2.看类的源码: ctr|+左键
3.查看类的关系:鼠标放到类名上,右键--> Diagram-->show Diagram
4.自动生成构造器,get, set方法,equals等: alt+ insert
5.设置鼠标悬停后快速文档说明提示:File-->Settings-->Editor-->General-->
二.重写equals()函数
equals()函数源码:
public boolean equals(Object obj) {
return (this == obj);
}
如下代码,没重写equals()前输出为:
false
false
true
true
代码:
import java.util.Objects;
public class Equals {
int id;
int age;
String name;
//选取时按Ctrl选多个
public Equals(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Equals e1=new Equals(1,22,"小明");
Equals e2=new Equals(1,22,"小明");
//比较对象地址
System.out.println(e1==e2);
System.out.println(e1.equals(e2));//通过equals()方法源码可看到equals也是用==比较,即比较对象是否是一个
System.out.println("123".equals("123"));
System.out.println("123"=="123");
}
//重写equals()函数,右键Generate自动生成,根据id判断是否相等
@Override
public boolean equals(Object o) {
if (this == o) return true;
//空对象或者类型不一致
if (o == null || getClass() != o.getClass()) return false;
Equals equals = (Equals) o;
return id == equals.id;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
重写equals()后输出为:
false
true
true
true
三.super关键字_继承树追溯
super“可以看做”是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。
使用super调用普通方法,语句没有位置限制,可以在子类中随便调用。
this
若是构造方法的第一行代码没有显式的调用supe(..)或者this(..);那么 Java默认都会调用super)含义是调用父类的无参数构造方法。这里的super()可以省略。
代码1:
public class TestSuper01 {
public static void main(String[] args) {
new ChildClass().f();
}
}
class FatherClass{
public int value;
public void f(){
value=100;
System.out.println("FatherClass.value="+value);
}
}
class ChildClass extends FatherClass{
public int value;//覆盖一个变量
public void f(){ //覆盖父类的函数
super.f();//调用父类的普通方法
value=200;
System.out.println("ChildClass.value="+value);
System.out.println(value);
System.out.println(super.value);//调用父类的成员变量
}
}
输出:
FatherClass.value=100
ChildClass.value=200
200
100
代码2:
public class TestSuper02 {
public static void main(String[] args) {
System.out.println("开始创建一个ChildClass对象......");
new ChildClass2();
}
}
class FatherClass2{
public FatherClass2(){
//这里会先去调用父类即Object类的构造函数,相当于省略了super();
System.out.println("创建FatherClass2对象");
}
}
class ChildClass2 extends FatherClass2{
public ChildClass2(){
//这里会先去调用父类即FatherClass2的构造函数,相当于省略了super();
System.out.println("创建ChildClass2对象");
}
}
输出:
开始创建一个ChildClass对象......
创建FatherClass2对象
创建ChildClass2对象