6.继承

发布时间:2017-04-28 09:03:13   来源:文档文库   
字号:

继承和多态

一、本章知识点

知识点1继承的概念及语法

类和类之间的关系is—a like—a has--a

1.0) 继承就是基于已存在的类扩展新类

2.0)子类扩展父类,将获得父类的全部成员变量和方法(构造器除外)

Java类只有一个直接的父类,可以有多个间接父类

//语法

public class Child extends Father {

}

//继承注意事项:

1. 父类私有的属性和方法不可以被继承

2. 父类的构造方法不能被继承

1.1.1案例1:练习、讲解、重现继承语法(视频继承1)(继承综合练习)

//需求:创建person类,属性:姓名性别年龄;行为:吃饭睡觉;创建学生类继承person,添加学生的属性:学号、成绩;学生行为:学习、考试;并测试输出学生的信息和相应的行为。

class Person{ //创建Person类父类

String name; //定义属性字段

String sex;

int age;

public Person(){ //创建构造方法(包括有参和无参)

}

//set get toString()方法

public void eat(){ //定义行为(方法体略)

}

public void sleep(){

}

}

class Student extends Person{ //创建学生类继承Person

int id;

int score; //添加学生私有属性

public Student(String name, String sex, int age, int id, int score){ //添加子类构造方法

super(name,sex,age);

this.id=id;

this.score=score;

}

public void haveClass(){ //定义子类扩展的方法学生学习(方法体略)考试

}

public void test(){

}

}

class Test{ //测试类

psvm{

Student s=new Student();

s. eat();

s. sleep(); //测试父类里包含的方法

s. haveClass();

s.test();

}

}

知识点2子类和父类构造方法

super关键字:代表父类空间的引用(结合内存图)

super()写在子类构造方法中,调用父类有参或无参构造方法(如不写,则默认调用

父类无参,父类无参默认要写),调用语句必须在子类方法的第一句;指定调用父

类带相同参数的构造方法

super.写在子类实例方法中,用于指定访问子类中与父类同名的实例属性和方法

super关键字与this关键字的区别

1.0 代表的一个事物不一致Super 代表的是父类空间的引用;this代表所属函数的调用对象

2.0 使用前提不一致:super关键字必须要有继承关系才可以使用,this关键字不需要有继承关系也可以使用

3.0 调用构造函数的区别:super关键字是调用父类的构造函数,而this关键字是调用本类的构造函数

2.1.1案例3演示、讲解、重现父类子类构造顺序super关键字

父类子类构造顺序,先创建父类对象,再创建子类对象----先执行父类构造方法,再执

行子类构造方法(图示子类父类的关系)

//需求:编程演示子类父类构造方法执行顺序

class Creature{

public Creature(){

sout(造物者无参构造方法);

}

}

class Animal extends Creature{ //创建动物类继承造物者类

private String name;

private int age;

public Animal(String name){

sout(“Animal类带一个参数的构造方法”+name);

}

public Animal(String name, int age) {

sout(“Animal类带两个参数的构造方法”+name+ ”\t ”+age);

}

}

class Wolf extends Animal{ //创建狼类继承动物类

public Wolf( String name, int age){

sout(“狼类带有两个参数的构造方法”+super.name+ ”\t” + super.age);

}

}

class Test{ //创建测试类

psvm{

Wolf wolf=new Wolf(“”,1); //创建狼对象,观察执行结果

}

}

知识点3方法重载和重写

重载(overload)

同一类模板中,同名不同参的方法,仅有返回类型不同的不能称为重载,无参和有参构造方法是典型的重载

重写(override)

子类模板中,重写父类同名同参的方法,访问修饰符必须大于等于父类方法(调用时,如有子类重写方法,则调用重写方法,如无,则调用父类方法)

3.1.1案例4:演示、讲解方法重写

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

//测试重写父类方法的原因

calss Bird{

public void flay(){

System.out.println("我是鸟我能飞")

}

}

class Ostrich extends Bird{

public void fly(){

System.out.println("我是鸟但我不能飞");

}

public static void main(String []args){

Ostrich os=new Ostrich();

os.fly();

super.fly();

}

}

3.1.1案例4练习、讲解、重现方法重写

//需求:创建Teacher类,属性:姓名性别工号,行为:上课;分别创建CTeacherJTeacher类继承Teacher类,重写上课方法,输出不同的结果

class Teacher{

String name;

String sex;

int id;

//set get 等略

public void haveClass(){

sout(老师上课); //父类的上课方法

}

}

class CTeacher extends Teacher{

public void haveClass(){

sout(CTeacher在上课); //改写父类的方法

}

}

class JTeacher{

public void haveClass(){

super. haveClass(); //在子类重写的方法中继续调用父类被重写的方法

//super.函数名获取

sout(“JTeacher 在上课); //改写父类的方法

}

}

class Test{

psvm{

CTeacher ct=new CTeacher();

ct.haveClass(); //如果子类重写父类的方法,执行子类里重写的方法,如//果子类里未重写父类的方法,执行父类里的方法

JTeacher jt=new JTeacher();

jt.haveClass();

}

}

知识点4Object

Object类是所有类的根类,java中的任何类,都继承了Object类中的方法

最常用的是toStringequals方法

通用方法包括equals,hashCode,getClass,toString

结论:如果想改变对象在输出语句中的内容,需要重写toString方法,如果想按自己的逻辑比较两个相同对象,需要重写equals方法。

4.1.1案例5练习、讲解、重现继承和object

//需求定义一个(Person),包含属性:姓名,年龄,性别;写好相关的方法,能够构

造的时候初始化或者后续修改属性值。

定义一个Employee类继承于Person类,包含新的属性:职位;写好相关的方法,能够构造的时候初始化或者后续修改属性值,重写equals方法,规则:当两个对象的姓名,年龄,性别,职位都相等时返回true,否则返回false

写一个测试类进行相关测试(要求可以打印对象的信息,能够比较对象是否"相等")。

calss Person{

String name;

int age;

String sex;

public Person(){

}

public Person(String name, int age, String sex){

this.name=name;

this.age=age;

this.sex=sex;

}

//set get方法

//重写toString方法

public String toString(){

return 姓名:”+name+”年龄:”+age+性别:”+sex;

}

}

class Employee extends Person{

private String position;

public Person(String name, int age, String sex, String position){

super(name, age, sex);

this. position=position;

}

//set get方法

public String toString(){ //重写toString()

return super.toString+”职位:”+position;

}

public boolean equals(Object obj){

if(this==obj){ //如果传回来的是同一个对象

return true;

}

if(obj==null){

return false;

}

if(this.getClass()!=obj.getClass){

return flase;

}

Employee ep =(Employee)obj;

if(this.getName()!=ep.getName){

return false;

}else if(this.getAge!=ep.getAge){

return false;

}else if(this.getSex!=ep.getSex){

return false;

}else if(this.getPosition!=ep.getPosition){

return false;

}

return true;

}

}

class Test{

psvm{

Employee ep1=new Employee(“lsisi”,19,”nan”,”zhuli”);

Employee ep1=new Employee(“sisi”,20,”nv”,”zheli”);

boolean flag=ep1.equals(ep2);

sout(flag);

}

}

知识点5:多态

多态,是指同一操作,作用于某一类对象,可以有不同的解释产生不同的执行结果。

实现多态的三个必要条件

1. 要有继承和实现

2. 方法重写

3. 父类的引用指向子类的对象

5.1.1案例6练习、讲解、重现多态

//天下的鸟都到会搭巢,但是搭出来的巢却是千差万别---多态

//创建猫类和狗类继承动物类,重写动物吃的方法,实现不同结果

calss Animal{ //创建动物类

String name;

public Animal(){

}

public Animal(String name){

this.name=name;

}

public void eat(){

sout();

}

}

class Dog extends Animal{ //创建狗类继承动物类

public Dog(String name){

super(name);

}

eat(){

sout(狗啃骨头);

}

}

class Cat extends Animal{ //创建毛类继承动物类

public Cat(String name){

super(name);

}

eat(){

sout(猫吃鱼);

}

}

class Test{

psvm{

Animal cat=new Cat(小花);

Animal dog=new Dog(”旺财“);

cat.eat();

dog.eat();

}

}

5.1.1案例6练习、讲解、重现多态

//需求:编写电器父类,属性name,方法on,off;编写子类Fan风扇,直接重写on,off

方法,编写子类Light电灯,不重写任何方法,测试类使用对象数组,两个电器一

个风扇一个点灯,测试开关电器方法

class Electrical{ //创建电器父类

String name;

public Electrical(String name){ //无参构造方法省略

this.name=name;

}

on(){

sout(电器开始工作);

}

off(){

sout(电器停止工作);

}

}

class Fan extends Electrical{ //创建风扇子类继承电器父类

public Fan(String name){

super(name);

}

on(){ //重写父类on方法

sout(风扇开始转动);

}

off(){ //重写父类off方法

sout(风扇停止转动);

}

}

class Light extends Electrical{

public Light(String name){

super(name);

}

}

class Test{

psvm{

Electrical [] electricals=new Electrical[2]; //创建对象数组

electricals[0]=new Fan("风扇"); //赋值初始化

electricals[1]=new Light("电灯");

for (int i=0;i

electricals[i].on();

electricals[i].off();

}

}

}

知识点6:对象上下转型(里氏替换原则)

Java程序,引用变量只能调用编译时的类型而不能调用运行时的类型

Java类型转换运算符,(type)变量名

1. 基本类型转换

2. 引用类型转换:只能在具有继承关系的两个类之间进行转换,如果是在两个没有关系的类型之间转换,会报编译错误(ClassCastException),如果需要转换,用instanceof运算符进行判断

3. Instanceof用法

result=object instanceof class

result:布尔类型的结果

object:引用型变量

class: 一个类

如果objectclass或其一个子类的实例,则结果返回true,如果不是,或者object为空则返回false;

6.1.1案例6:演示、练习、讲解上下转型

//以猫狗为例,演示上、下转型

public class AnimalTest {

public static void main(String[] args) {

//向上转型由子类指向父类(父类的引用指向子类的对象),是安全

//,会损失子类的方法

Animal animal=new Dog("小黑");

animal.eat();

//向下转型子类指向父类(子类对象指向父类的引用),不安全

If(animal instanceof Cat){

Cat cat=(Cat)animal;

cat.eat();

}

}

}

知识点7继承和多态的综合运用

7.1.1案例6练习、讲解、重现继承和多态综合运用

//需求:学校中心配备一台打印机(可以是黑白打印机,也可以是彩色打印机)。中

心可以通过打印机打印学员的个人信息(张三和李四等)。通过继承和多态来设计这个程序,使程序具有更好的扩展性和维护性。

class Printer{

String brand;//定义品牌属性

public Printer(String brand){

this. brand=brand;

}

public void printContent(String content){ //定义打印方法

}

}

class ColorPrinter{ //定义彩色打印机类,继承打印机类

public ColorPrinter(String brand){

this.brand=brand;

}

public void printContent(String content){ //定义打印方法

sout(this.getBrand+”彩色打印机打印:”+content);

}

}

class BlackPrinter{ //定义黑白打印机类,继承打印机类

public BlackPrinter(String brand){

this.brand=brand;

}

public void printContent(String content){ //定义打印方法

sout(this.getBrand+”黑白打印机打印:”+content);

}

}

class School{

private Printer printer; //聚合(has a)将另一个类的对象作为本类的属性

publicSchool(){

}

public void setPrinter(Printer printer){ //为学校设置打印机

this.printer=printer;

}

public void print(Object content){

if(this.printer==null){

sout(”请安装打印机“);

}

this.printer.printContent(content.toString);

}

}

class Test{

psvm{

School sc=new School();

Printer cp=new ColorPrinter(“惠普”);

Printer bp=new BlackPrinter(“松下”);

sc.setPrinter(cp);

sc.print(”lisi“)

}

}

知识点8今日内容总结

继承

多态

知识点9作业布置

1.0 Java程序完成以下场景:

有一个主人(Master类),他养了两只宠物(Pet类),一只宠物是狗(Dog类),名字叫“旺财”,另一只宠物是猫(Cat类),名字叫“小花”,现在有两种食物(Food类),分别是骨头(Bone)和鱼(Fish)。主人分别给两只宠物喂食物,两只宠物厌食,狗只吃骨头(如果主人为够吃别的食物,就显示“狗不吃某某食物”);猫只吃鱼(如果主人为猫吃别的食物,就显示“猫不吃某某食物”)

运行结果如下:

本文来源:https://www.2haoxitong.net/k/doc/e52830cdf80f76c66137ee06eff9aef8951e486a.html

《6.继承.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式