Java继承

继承的概念和实现

  • 继承背后的思想就是基于已存在的类来构建新类
  • 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求
  • 约定:
    • 从其它类导出的类叫做子类。
    • 被导出的类叫做父类
  • 在Java中,除了Object类之外,所有类都是子类,都只有唯一的父类

继承在OOP(面向对象)中不可或缺

创建一个类时,总是在继承

继承的意义

  • 代码的重用
  • 体现不同抽象层次

父子类关系

  • 父类更抽象,更一般
  • 子类更具体,更特殊

在Java语言中,用extends关键字来表示一个类继承了另外一个

public class Teacher extends Person{
	//其余代码省略
}
package jicheng.yang.java;

class Person
{
	String name;
	String address;
	
	public void Eat(){
		System.out.println("人吃饭");
	}
	public void Drink(){
		System.out.println("人喝水");
	}
	public void printfInfo(){
		System.out.println("name="+name);
	}
}

class Student extends Person
{
	int score;
	public void GoToSchool(){
		System.out.println("去上学");
	}
	public void printfScore(){
		System.out.println("score="+score);
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		p.name = "人";
		p.Eat();
		p.printfInfo();
		
		Student s = new Student();
		s.name = "学生";
		s.score = 60;
		s.printfInfo();
		s.printfScore();
		s.GoToSchool();
	}
}

执行结果:
结果

super关键字

super关键字特点

  • super和this关键字的特点类似:super代表的是父类对象的引用
  • 当子父类的成员出现同名时,可以通过super来区分
  • 子类的构造方法中,通过super关键字调用父类的构造方法
public class Teacher extends Person{
	public Teacher(String name,String address)
	{
		super(name,address);
	}
}

强调注意:
当构造一个子类对象的时候,一定会先调用父类的构造方法来构造父类的对象。
调用父类构造方法的语句必须是子类构造方法中的第一条指令。

应用

	public Person(String name,String address){    //初始化父类
		this.name = name;
		this.address = address;
		System.out.println("父类构造方法被调用");
	}
	
	public Student(String name,String address){  //实例子类构造方法时调用
		super(name,address);                                  //传参去调用父类的构造方法
		System.out.println("子类构造方法被调用");
	}
	Student s = new Student("xu","北京3326");    //初始化实例子类时,调用子类Student构造方法,在通过子类Student构造方法去调用父类构造方法,初始化父类
package jicheng.yang.java;

class Person
{
	String name;
	String address;
	
	public Person(String name,String address){
		this.name = name;
		this.address = address;
		System.out.println("父类构造方法被调用");
	}
	
	public Person(String name){
		this.name = name;
	}
	
	public void Eat(){
		System.out.println("人吃饭");
	}
	public void Drink(){
		System.out.println("人喝水");
	}
	public void printfInfo(){
		System.out.println("name="+name);
	}
}

class Student extends Person
{
	public Student(String name,String address){
		super(name,address);
		System.out.println("子类构造方法被调用");
	}
	int score;
	public void GoToSchool(){
		System.out.println("去上学");
	}
	public void printfScore(){
		System.out.println("score="+score);
	}
}

public class Test {
	public static void main(String[] args) {
		
		Student s = new Student("xu","北京3326");

	}
}

执行结果:
结果

子类调用父类方法

	public void Eat()
	{
		super.Eat();
		System.out.println("eat");
	}
package jicheng.yang.java;

class Person
{
	String name;
	String address;
	
	public Person(String name,String address){
		this.name = name;
		this.address = address;
		System.out.println("父类构造方法被调用");
	}
	
	public Person(String name){
		this.name = name;
	}
	
	public void Eat(){
		System.out.println("人吃饭");
	}
	public void Drink(){
		System.out.println("人喝水");
	}
	public void printfInfo(){
		System.out.println("name="+name);
	}
}

class Student extends Person
{
	public Student(String name,String address){
		super(name,address);
		System.out.println("子类构造方法被调用");
	}
	int score;
	public void GoToSchool(){
		System.out.println("去上学");
	}
	public void printfScore(){
		System.out.println("score="+score);
	}
	public void Eat()
	{
		super.Eat();
		System.out.println("eat");
	}
}

public class Test {
	public static void main(String[] args) {
		Student s = new Student("xu","北京3326");
		s.Eat();
	}
}

执行结果:
结果

关于私有化:

  • private方法,private成员属性,都不可被子类继承。
  • private成员属性,可以通过继承的public方法访问到。

方法重写-Override

什么是方法重写:

方法重写是指子类可以根据需要对从父类继承来的方法进行改写,是多态机制的前奏

方法重写注意

  • 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
  • 重写方法不能比被重写方法有更严格的访问权限
  • 父类中的私有方法,不能被重写
  • 在子类重写的方法中,继续调用父类被重写的方法可以通过super.函数名获取
package jicheng.yang.java;

class Person
{
	String name;
	String address;

	public void printfInfo(){
		System.out.println("name="+name);
	}
	public void printfAddr(){
		System.out.println("address="+address);
	}
}

class Student extends Person
{
	int score;
	public void printfInfo(){
		super.printfInfo();
		System.out.println("子类name="+name);
	}
}

public class Test {
	public static void main(String[] args) {
		Student s = new Student();
		s.name = "张";
		s.printfInfo();
	}
}

执行结果:

结果

Object类常见方法

  • Java中,所有类都直接或间接继承自Java.lang.Object类,可以说Object是Java中所有类的祖先即根类。
  • Java中任何类都继承了Object类中的方法。

主要方法有

toString();
equals();
hashcode();
clone();
getClass();
finalize();

toString()

package jicheng.yang.java;

class Person
{
	String name;
	String address;

	public void printfInfo(){
		System.out.println("name="+name);
	}
	public void printfAddr(){
		System.out.println("address="+address);
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		p.name = "张";
		System.out.println(p.toString());
	}
}

执行结果:
结果
包名.类名.类的虚拟地址

方法重写后的使用:

package jicheng.yang.java;

class Person
{
	String name;
	String address;
	public String toString() {
		return "person meaage:"+name+address;
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		p.name = "张";
		p.address = "北京1108";
		System.out.println(p.toString());
	}
}

执行结果:
结果

equals()

方法重写后的使用

package jicheng.yang.java;

class Person
{
	String name;
	String address;
	public boolean equals(Object arg0) {
		Person p = (Person)arg0;
		if(this.name == p.name && this.address == p.address){
			return true;
		}else{
			return false;
		}
	}
}

public class Test {
	public static void main(String[] args) {
		Person p = new Person();
		p.name = "张";
		p.address = "北京1108";
		
		Person p2 = new Person();
		p2.name = "张";
		p2.address = "北京1108";
		
		System.out.println(p.equals(p2));
	}
}

执行结果:
结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值