这篇专栏的笔记依然是面向对象三大特性之一:继承
1、super关键字
super关键字表示父类,可通过该关键字访问父类的变量和方法。
class Animal {
String name = "动物";
void show(){
System.out.println("父类方法");
}
}
class Cat extends Animal{
String name = "猫";
void show(){
System.out.println("子类方法");
}
void func(){
System.out.println(name); //子类变量
show(); //子类方法
System.out.println(super.name); //父类变量
super.show(); //父类方法
}
}
/*
运行结果:
猫
子类方法
动物
父类方法
*/
2、父类构造方法的自动调用
在创建子类构造方法时,其实先执行了父类的构造方法。
//Animal.java
class Animal {
public Animal(){
System.out.println("父类构造方法");
}
}
class Cat extends Animal{
public Cat(){
System.out.println("子类构造方法");
}
}
//Init.java
public class Init {
public static void main(String[] args) {
Cat c = new Cat();
}
}
/*
运行结果:
父类构造方法
子类构造方法
*/
3、自动调用父类的构造方法
1.若定义了有参构造方法,就不会自动定义无参构造方法。
2.如果子类没有显式调用父类构造方法,会默认调用父类无参构造方法。但由于没有定义父类无参构造方法,因此会报错。
class Animal {
//定义了有参构造方法,就不会自动定义无参构造方法
public Animal(int num){
System.out.println("父类构造方法");
}
}
class Cat extends Animal{
//默认调用父类无参构造方法,但没有定义
public Cat(){ //会报错
System.out.println("子类构造方法");
}
}
4、toString()方法
1.输出对象,默认输出对象地址。
//Animal.java
class Animal {
String name = "动物";
}
//Init.java
public class Init {
public static void main(String[] args) {
Animal s = new Animal();
System.out.println(s);
}
}
/*
运行结果:
Inherit.Animal@b4c966a
*/
2.重写toString()方法,自定义输出结果,如成员变量。
3.输出对象的方式不变,这次输出的是自定义的成员变量。
//Animal.java
class Animal {
String name = "动物";
@Override
public String toString() { //重写toString()方法
return "name:" + name;
}
}
//Init.java
public class Init {
public static void main(String[] args) {
Animal s = new Animal();
System.out.println(s);
}
}
/*
运行结果:
name:动物
*/
5、equals()方法
1.注意使用方法,格式是"对象1.equals(对象2);"。
2.equals()方法能判断两个对象是否指向同一块内存地址。
public class Init {
public static void main(String[] args) {
Animal s1 = new Animal();
Animal s2 = new Animal();
//判断s1和s2是否指向同一块内存地址
//注意使用方法
System.out.println(s1.equals(s2));
}
}
/*
运行结果:
false
*/
但是,我们一般想知道的不是两个对象的地址是否相同,而是这两个对象的属性是否相同,重写equals()方法就能达到这个目的。
3.重写equals()方法,在内存地址不同的情况下,比较两个对象的属性是否相同。如果相同,返回true。
//Animal.java
class Animal {
String name;
public Animal(){
name = "动物";
}
@Override
public boolean equals(Object obj) { //重写equals()方法
if (this == obj) //同一块内存地址
return true;
if (obj == null) //类对象为空
return false;
if(getClass() != obj.getClass()) //类对象不同
return false;
Animal animal = (Animal) obj;
if(name != animal.name) //比较属性是否相同
return false;
return true;
}
@Override
public int hashCode() { //自动生成的
return Objects.hash(name);
}
}
//Init.java
public class Init {
public static void main(String[] args) {
Animal s1 = new Animal();
Animal s2 = new Animal();
//重写了equals()方法,比较s1和s2的属性是否相同
System.out.println(s1.equals(s2));
}
}
氷鸢鸢鸢
2020.2.6