继承的基本概念(Java面向对象高级篇)

继承的基本概念
类的继承格式:
class 父类{}                   // 定义父类
class 子类 extends 父类       //使用extends关键字实现继承
class Person{
	private String name;
	private int  age;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name = name;
	}
	public int getAge(){
		return age;
	}
	public void setAge(int age){
		this.age = age;
	}
}
class Student extends Person{//Student是Person的子类,
	//此处什么都没写 
} 
public class ExtDemo01{
	public static void main(String[] args){
		Student stu = new Student();
		stu.setName("李正");
		stu.setAge(30);
		System.out.println("姓名:" + stu.getName() + "\t年龄:" + stu.getAge());
	}
}

运行结果:

姓名:李正 年龄:30

我们发现:在Student类中比昂没有定义任何的操作,但是通过集成的功能可以直接把父类中的操作拿到子类中使用。


如果子类中需要新增属性,改如何操作呐??疑问

class Person{
	private String name;
	private int  age;
	public String getName(){
		return name;
	}
	public void setName(String name){
		this.name = name;
	}
	public int getAge(){
		return age;
	}
	public void setAge(int age){
		this.age = age;
	}
}
class Student extends Person{//Student是Person的子类,
	private String school;  //新增学校属性
	public String getSchool(){  // 取得学校属性
		return school;
	}
	public void setSchool(String school){  //设置学校属性
		 this.school = school;
	}
} 
public class ExtDemo02{
	public static void main(String[] args){
		Student stu = new Student();
		stu.setName("李正");
		stu.setAge(30);
		stu.setSchool("某某大学");
		System.out.println("姓名:" + stu.getName() + "\t年龄:" + stu.getAge() + "\t学校:" + stu.getSchool());
	}
}
运行结果:

姓名:李正 年龄:30学校:某某大学


类的继承制润徐单继承,不允许一个子类继承多个父类!!!
但是允许多层继承,即一个子类可以有一个父类,这父类还可以有一个父类,依此类推 


继承的子类有时又称为派生类
使用extends关键字可以实现继承的关系,但是这个关键词的本身含义是扩展,准确的说一个类扩展已有类的功能。


在使用继承时候要注意子类是不能直接访问父类中的私有成员的,子类可以调用服用类的非私有方法,但是不能直接调用父类的私有成员

//继承的进一步研究
/*在继承的操作中对于子类对象的实例化是有要求的 即子类对象的实例化之前必须先调用父类中的构造方法后再调用子类自己的构造方法。子类对象实例化过程 */
class Person {           //定义父类Person
	private String name; //定义属性
	private int age;     //定义属性
	public Person() {   //定义父类Person的构造方法
		System.out.println("父类Person中的构造方法");
	}
	public String getName() {  //取得属性
		return name;
	}
	public void setName(String name) {//设置属性
		this.name = name;
	}
	public int getAge() {             //取得属性
		return age;
	}
	public void setAge(int age) {     //设置属性
		this.age = age;
	}
}
class Student extends Person {   //Studen是Person的子类  扩展族类的功能
	private String school;  //新定义的属性
	public Student() {    //子类的构造方法
		System.out.println("子类Student中的构造方法");//子类的构造方法
	}
	public String getSchool() {  //取得属性
		return school;
	}
	public void setSchool(String school) {//设置属性
		this.school = school;
	}
}
public class InstanceDemo {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.setName("李正");//---此时访问的是父类方法
		stu.setAge(30);//---此时访问的是父类方法
		stu.setSchool("某某大学");//---此时访问的是子类方法
		System.out.println("姓名:" + stu.getName()+ "\t 年龄:" + stu.getAge() + "\t学校:" + stu.getSchool());
	}
}

/** 方法的覆写
再看继承的关系中也存在这方法覆写的概念,所谓的方法覆写就是指子类定义了与父类中同名的方法,
但是在方法腹泻时必须考虑权限,权限只能放大不能缩小(public>default>public)*/
/**supper关键字的作用:
使用supper关键字可以从子类中调用父类的构造方法,普通方法和属性,
super与this关键词一样使用时必须放在子类构造方法的首行 */

class Person { //定义父类
	private String name; // 定义属性
	private int age;  // 定义属性
	public Person(String name,int age) { // 通过构造方法设置name 和age
		this.setName(name); //设置name属性内容
		this.setAge(age);  //设置age属性内容
	}
	public String getName() { //取得name属性
		return name;
	};
	public void setName(String name) { //设置name属性
		this.name = name;
	};
	public int getAge() { //取得age属性
		return age;
	};
	public void setAge(int age) { //取得age属性
		this.age = age;
	};
	public String getInfo() { //信息输出
		return "姓名:" + this.getName() + ";年龄:" + this.getAge();
	};
}
class Student extends Person { //继承
	private String school;//新定义新属性
	public Student(String name,int age,String school) {
		super(name,age);//调用构造方法获取name  age
		this.setSchool(school);
	}
	public String getSchool() { //获取school属性
		return school;
	}
	public void setSchool(String school) { //设置school属性
		this.school =  school;
	}
	public String getInfo() { //覆写父类中的方法
		return super.getInfo() + ";学校:" + this.getSchool();//扩充父类中地方法
	}
}
public class SupperDemo01 {
	public static void main(String[] args) {
		Student stu = new Student("李正",30,"某某大学");
		System.out.println(stu.getInfo());  //打印信息  调用覆写过的方法
	}
}


super()形式调用了父类中有2个参数的构造方法,然后在子类中又覆写了父类中的getInfo()方法,所以输出的内容是与被子类覆写过的内容,


this、super作用相似,均可以调用构造、普通方法和数学,区别是什么呐??


还有一点就是this 和super不能同时调用构造,因为调用构造需要放在首行!!!不可能做到同时放在首行吧,所以不能同时使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值