Java学习笔记(三)继承与多态

一、概念

  1. 继承是面向对象的程序设计中最为重要的特征之一(三大特征为:封装、继承、多态)
  2. 子类(subclass)和父类或超类(superclass)存在以下关系:子类“is a”父类,即子类是一个特殊的父类。
  3. Java支持单继承,一个类只能有一个直接父类
  4. 子类可以修改父类的状态或重载父类的行为,并可添加新的状态和行为(对应着子类是一种特殊的父类)
  5. Java 中的继承是通过extends 关键字来实现的
class Student extends Person{}

二、Object超类

若类无extends 继承其他类,系统会默认继承java.lang.Object,其Object提供了一定的方法

如自定义了People 类,未继承其他类,系统便默认继承了Object,在eclipse可以查看到此子类所有可用的方法,其中只有sayHello是自定义的。

三、父类对象和子类对象之间的转换

1.继承使一个子类继承了父类的特征,并且附加一些新特征。子类可看成是其父类的特殊化,每个子类的实例都是其父类的实例,反过来就不行(如一个学生是一个人,一个人不一定就是学生)

2.一个父类型的变量可以给他赋一个子类实例,反过来则不行,

如Student 是 People 的子类,one和otherone 是父类实例,可以给otherone 赋一个astu 子类实例,反过来在eclipse中直接报错了,且otherone也不能直接调用Student子类里的study方法,因为在编译器里otherone仍是People,不具有study方法

要调用Student 子类里的study方法需要将otherone进行强制类型转换,如

ps:一开始觉得这有点无聊,一开始将otherone定义成Student类型不就好了,查资料发现是为了使代码更具有通用性,声明一个父类的变量用于接收子类实例对象,如用Object声明一个父类,便可接收其他子类了。

这里引申下多态:

多态:同一个实体,同时具有多种形式。最典型的例子是父类对象调用父类方法,而这个方法被子类重写了。如若Act类是核心业务类,它来使人们打招呼,用多态的方式就可以不用写多种不同对象的方法,只用用他们的父类的对象的方法即可。在test.act(new Teacher("xiaohu", 40));里,这里的内部的sayHello已被子类重载了。

class People
{
	String name;
	int age;
	
	People(String aName, int age)
	{
		this.name = aName;
	}
	
	protected void sayHello() 
	{
		System.out.println("Hello my name is "+this.name);
	}
	
}

public class Teacher extends People {

	public Teacher(String aName, int age) {
		super(aName, age);
	}
	
	public void sayHello() {
		System.out.println("I am a teacher");
	}
	
}

public class Act {
	
	public void act(People people) {
		people.sayHello();
	}
}

	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Act test = new Act();
		test.act(new People("liming", 20));
		test.act(new Teacher("xiaohu", 40));
		
	}

四、抽象类的继承,上一篇笔记已有例子,这里只贴测试代码

package hello;

import java.util.Scanner;
import person.Person;

public class Hello 
{

	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		Student astu = new Student("Liming");
		astu.sayHello("Xiao Hu");
	}

}

abstract class People
{
	String name;
	
	People(String aName)
	{
		this.name = aName;
	}
	
	abstract void sayHello(String otherName);
	
}

class Student extends People
{
	Student(String aName)
	{
		super(aName);
	} 
	
	void sayHello(String name) 
	{
		System.out.println("Hello " + name + ", I am " + this.name);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值