Java学习3:面向对象之继承(讲解super关键字)

Java面向对象之继承

一、讲基本理论

什么是继承?

继承就是让一个类型的对象拥有另一个类型的对象的全部非私有属性和方法!

在继承中,有两个概念:父类和子类!

子类继承父类,是自然世界的一个通用关系!父类和子类可以不一样,但是一定有很多的相同点,比如动物世界的食肉动物和食草动物,他们都是属于动物;再比如父母和孩子,孩子一定和父母长得比较像,血缘关系也会遵循相关的规律,这就是联系!一般来说,父类的属性和方法更加通用,往往通用于子类;子类的方法往往更加具体,这从自然世界的角度是变异与进化;从软件开发的角度就是拓展和增强!

继承的相关语法模板:

在这里插入图片描述
这个语法规则相比c++实在是要简单太多了!!!从这个语法模块来看,它没有公有、私有、保护继承,就光秃秃的一个继承……真的easy!

继承的一些特性:
第一:

子类拥有父类的所有非私有的属性和方法

第二:

Java不允许多重继承,也就是说,A继承B,A就不能再继承C

第三:

Java允许多层继承这个是个特性,也就是说A继承B,B继承C,那么A就间接继承了C
这个其实是不太好的,因为这提高了代码的耦合性,容易出错,不便于扩展

第四:

子类能拥有自己的属性和方法,也就是在父类的基础上进行拓展

二、子类对象的实例化

程序展示:
import java.util.Scanner;

public class Main6 {
    
    
	public static void main(String[] args) {
    
    
		Scanner sc = new Scanner(System.in);
		
		String name = sc.next();
		int age = sc.nextInt();
		String school = sc.next();
		
		Student st = new Student(name, age, school);
		st.Show();
		
		sc.close();
	}
}

class Person {
    
    
	protected String name;
	protected int age;
	protected Person(String name, int age) {
    
    
		this.name = name;
		this.age = age;
		System.out.println("Person is constructed!");
	}
}

class Student extends Person {
    
    
	private String school;
	public Student(String name, int age, String school) {
    
    
		super(name, age);
		this.school = school;
		System.out.println("Student is constructed!");
	}
	public void Show() {
    
    
		System.out.println("The student's information is:");
		System.out.println("Name is:" + this.name + "  Age is:" + this.age + "  School is:" + this.school);
	}
}
效果展示:

在这里插入图片描述

咱学到了什么?

第一:父子类的构造顺序

根据自然世界的规律,先有鸡再有蛋!现有爸爸(祖先),才有孩子!
所以我们实例化一个子类的对象的时候,就必须先实例化祖先,系统必须先知晓父类,才能实例化子类。所以可以根据上面的程序案例看出,先构造的父类,后构造的子类。

第二:子类的无参构造和有参构造

其实无论是有参构造还是无参构造,都需要调用super();只是这个关键字,主要是在有参构造的场合下使用,类似于this();这样的用法,可以调用父类的构造方法,把子类的实参传给父类,然后完成父类的实例化之后再实例化子类!所以说最重要的就是这个super();

三、super关键字的学习

什么是super关键字?

在上面的程序中我们已经看到了super关键字,晓得它应该就是用在子类的构造方法的第一句话,然后利用这个super关键字,引用父类的构造方法!
详细说说:
我们在new一个子类对象的时候,会先在子类的构造方法里new出父类的对象,必须等到父类实例化完成了之后,才能去实例化子类,这就是为什么super关键字必须用在子类的构造方法的第一句话的缘故!
得出结论:super主要的功能是完成子类调用父类中的内容,也就是调用父类中的属性或方法。
其实:就算是在无参构造函数里面,就算是我们程序员没有书写super关键字,其实这个super();也是存在的哦!

super关键字的用法:注意"直接"二字!

在这里插入图片描述

对上面三个用法做实验:

public class Main6 {
    
    
	public static void main(String[] args) {
    
    
		Cat c = new Cat("小花猫", 18, "大草鱼");
		c.Work();
		c.Show();
	}
}

class Animal {
    
    
	protected String name;
	protected int age;
	
	protected Animal(String name, int age) {
    
    
		this.name = name;
		this.age = age;
	}
	
	public void Work() {
    
    
		System.out.println("他们会为了生存去吃东西、交配……");
	}
	
	public void Show() {
    
    
		System.out.println(this.name + "今年已经:" + this.age + "岁了!");
	}
}

class Cat extends Animal {
    
    
	private String Food;
	public Cat(String name, int age, String Food) {
    
    
		super(name, age);
		this.Food = Food;
	}
	
	public void Work() {
    
    
		super.Work();
		System.out.println(this.name + "比较喜欢吃的东西是" + this.Food);
	}
	
	public void Show() {
    
    
		super.Show();
	}
}

结果展示:

在这里插入图片描述

我们学到了什么?

super关键字在不加括号的时候,可以用作对父类对象的引用,这个对象是虚拟的匿名对象,是对象级别的,不是类级别的。我们可以利用这个super引用对象,去访问一些父类比较通用的属性或者方法!可以大大减小代码量和做到代码复用!

super关键字和this关键的区别?

super关键字看起来和this关键字很相像哦!那他们的区别是什么呢?

第一个区别:

super关键字实际上是子类的对象对父类的引用,而this关键字是当前方法所作用的对象的引用!

第二个区别:

super关键字是可以访问当前子类对象的父类的属性和方法
而this关键字是访问当前对象的属性和方法

第三个不是区别,而是相同点:

无论是this关键字还是super关键字,都必须放在方法的第一行!

猜你喜欢

转载自blog.csdn.net/qq_44274276/article/details/104876869