java抽象类+继承+super用法和this异同

版权声明:转载请注明出处,谢谢合作 https://blog.csdn.net/qq_40738840/article/details/85925116

抽象类

抽象类顾名思义也是类,其命名也暗示它是在类的基础上加以限制(加强条件)而来

1 定义限制

  • 至少含有一个抽象方法其余属性,方法皆与普通类一致
    • 抽象方法是用abstract声明的方法,无方法体,专门用来给子类继承

2 使用限制

  • 抽象类无法直接实例化对象,但可通过对象多态实例化,如子类对象向上转型
  • 子类继承抽象类时,必须实现所有抽象方法

super拿来干啥??

这个结合代码将比较好理解,所以具体看代码叭,里面有详细解释

关键字super,this异同

可看成父类的一个对象,在子类中可以利用其间接调用父类的一些私有属性、方法。除了不可表示当前对象外,用法与this基本相同,可参见this三种用法

异同表

访问内容 this super
通俗理解 代表本类的一个对象 代表父类的一个对象
属性/方法 先找本类,找不到再找父类 直接到父类寻找
构造方法 调用本类构造方法,置顶(实例化对象时构造方法在所有方法前自动被调用) 调用父类构造方法,置顶
对象 当前对象(比较对象时使用) 无此特性

实例演练

该实例展示了以下知识点

  • 抽象类在继承中的定义及使用
  • 关键字super,this的用法

为遵守规范,实例中均为简单Java类,可参考简单Java类

核心类说明

1 抽象类Person
该类有四个属性,为符合java简单类规范,属性可见性均为private,本来也需每个属性设置了setter,getter方法,但偷个懒,这里就把有用的方法写出来,小伙伴们意会意会就行;也保留了一个无参构造方法,同时构造方法按参数个数升序排列。
在这里插入图片描述
2 子类Student
此类继承于抽象类Person,添加了两个属性,实现了抽象方法getInfo()
在这里插入图片描述
3 子类Teacher
与类Student类似
在这里插入图片描述

实例代码

注释解释了相应语句的用法

package basic.parctice;
//抽象类Person
abstract class Person{//抽象类定义,类名和抽象方法前均加关键字abstract
//四个私有属性,分别为姓名,地址,年龄,性别
	private String name;
	private String addr;
	private int age;
	private char sex;
//构造方法重载,共四个,分别为无参,二参,四参构造方法
	public Person() {}
	public Person(String name) {
		this.name = name;//this用法:使用本类属性
	}
	public Person(String name,String addr) {
		this(name);//this用法:调用本类一个参数的构造方法
		this.addr = addr;//this用法:使用本类属性
	}
	public Person(String name,String addr,int age,char sex) {
		this(name,addr);//this用法:调用本类一个参数的构造方法
		this.age = age;//this用法:使用本类属性
		this.sex = sex;//this用法:使用本类属性
	}
//四个属性对应的setter(偷个懒,小伙伴自行脑补叭),getter方法
	public String getName() {
		return name;
	}
	public String getAddr() {
		return addr;
	}
	public int getAge() {
		return age;
	}
	public char getSex() {
		return sex;
	}
	public abstract String getInfo();//抽象方法:获取信息
}
//子类Stuent
class Student extends Person{//子类定义+继承
	//添加的两个属性
	private float math;
	private float english;
	//重载构造方法
	public Student() {}
	public Student(String name,String addr) {
		super(name,addr);//super用法:调用父类构造方法,间接使用父类的私有属性;
//若是直接使用赋值语句this.name = name,立马报错,因为name在父类中可见性为private,子类中无法直接访问,只可通过父类中的公有方法访问它
//若是想访问父类中的公有方法,通常情况下需要先实例化一个对象,通过对象访问非私有方法/属性,这有点麻烦
//于是super代表一个默认父类对象应运而生,直接用它访问就好了,提供了极大便利
	}
	public Student(String name,String addr,int age,char sex,float math,float english) {
		super(name,addr,age,sex);
		this.math = math;
		this.english = english;
	}
	//实现抽象方法
	public String getInfo() {
		return "name:" + super.getName() +" addr:"+super.getAddr()+" age:"+super.getAge()+
				" sex:"+super.getSex()+" math:"+this.math+" endlish:"+this.english;
	}
	
}
//子类Teacher与Student如出一辙,交给聪明的你去分析啦,顺便检验下掌握情况,嘿嘿嘿(真不是我懒哟~)
class Teacher extends Person{
	private String subject;
	private float salary;
	public Teacher() {}
	public Teacher(String name,String addr) {
		super(name,addr);
	}
	public Teacher(String name,String addr,int age,char sex,String subject,float salary) {
		super(name,addr,age,sex);
		this.subject = subject;
		this.salary = salary;
	}
	public String getInfo() {
		return "name:" + super.getName() +" addr:"+super.getAddr()+" age:"+super.getAge()+
				" sex:"+super.getSex()+" subject:"+this.subject+" salary:"+this.salary;
	}
}
public class Demo_Abstract {
	public static void main(String[] args) {
		System.out.println("===============Student类测试===========");
		Student s0 = new Student();
		System.out.println(s0.getInfo());//无参
		Student s2 = new Student("jun","nanjing");
		System.out.println(s2.getInfo());//2参
		Student s6 = new Student("jun","nanjing",19,'M',100,100);
		System.out.println(s6.getInfo());//6参
		
		System.out.println("===============借用子类对象实例化抽象类测试===========");
		Person p = new Student("俊","南京");//借用子类对象实例化抽象类,类似向上转型
		System.out.println("name:"+p.getName());
		System.out.println("addr:"+p.getAddr());

		System.out.println("===============Teacher类测试===========");
		Teacher t0 = new Teacher();
		System.out.println(t0.getInfo());
		Teacher t2 = new Teacher("李达","南京航空航天大学");
		System.out.println(t2.getInfo());
		Teacher t6 = new Teacher("李达","南京航空航天大学",30,'M',"英语",10000);
		System.out.println(t6.getInfo());
	}
}

测试结果
在这里插入图片描述

扫描二维码关注公众号,回复: 4879720 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_40738840/article/details/85925116