面向对象的三大基本特征(二):继承

面向对象的基本特征

1、继承(inherite)

  • 生活中,继承财产,基因,文化。。。

  • 继承:延续、扩展

2、关键字:extends

3、继承的作用

  • (1)代码的复用
  • (2)代码的扩展

4、什么情况下需要继承?

  • (1)当我们编写新的类型时,发现已有的类型中有我们需要的事物的全部特征(属性、方法),这个时候就可以考虑使用继承。

    • 并且我们要求新的类型是旧的这个类型的子集,即is-a的关系。
    • 例如:Student is a Person. Student类别是Person类别的子集。
  • (2)当我们编写了多个类后,发现这几个类有共同的特征(属性、方法),这个时候我们可以考虑抽象出一个公共的父类出来。

    • 抽取出的这个公共的父类,可以简化代码(相同部分不用重复写),还可以用父类的类型统一管理众多的子类的对象。
  • 总结:无论从上至下,还是从下往上,都是说明一点,父类中是所有子类的共同的特征。

5、如何实现继承

  • 语法格式:
    • 【修饰符】 class 子类名 extends 父类名{
      }

6、继承的特点

  • (1)父类的所有的属性、方法都会继承到子类中。

    • 关于私有的属性和方法是否可以被继承到子类中?
    • A:从在子类中可直接访问的角度来说:不能
    • B:从子类具有的事物特征来说:可以
    •  即在子类对象的堆内存中,需要分配对应的内存,需要存储它的值,
      
  • (2)父类的构造器无法继承到子类中。

  • (3)子类的构造器中“必须”调用父类的构造器。

    • 默认情况下,调用父类的无参构造。

    • 如果父类没有无参构造,那么子类“必须手动”调用父类的某个有参构造。使用super(实参列表)调用父类的有参构造。

    • 为什么要调用父类的构造器?

      • 要为从父类继承的属性进行初始化,那么父类的构造器中已经写了对应初始化代码,我们子类就不用重复,调用一下就可以了。
  • (4)Java只支持单继承==>即只有一个亲生父亲

  • (5)Java支持多层继承==>父类还可以有父类

  • (6)一个父类可以同时有多个子类==》一个父亲可以同时有多个孩子

    • 子类还可以有子类 ==》代代相传
  • (7)子类可以扩展父类没有的特征(属性和方法)

  • (8)子类还可以对父类的“方法”进行“重写”

public class TestInherited {
	public static void main(String[] args) {
		Student stu = new Student("张三",20,90);
		stu.eat();
		System.out.println(stu.getInfo());
	}
}
class Animal{
	public void eat(){
		System.out.println("吃");
	}
}
class Person extends Animal{
	private String name;
	private int age;

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public 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;
	}
	public String getInfo(){
		return "姓名:" + name + ",年龄:" + age;
	}
}
class Student extends Person{
	private int score;
	
	//无参构造
	public Student(){
		super();//调用父类的无参构造,如果表示调用父类的无参构造的话,这句话可以省略。
		//super(null,0);//手动调用父类的有参构造
	}
	
	public Student(String name, int age, int score) {
		super(name, age);//调用父类的有参构造,为从父类继承的name和age属性初始化
//		this.name = name;//错误的,因为name和age是私有的
//		this.age = age;
		this.score = score;
	}

	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值