这篇专栏的笔记依然是面向对象三大特性之一:继承

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