一、本章知识点
● 知识点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类,属性:姓名性别工号,行为:上课;分别创建CTeacher、JTeacher类继承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();
}
}
●知识点4:Object类
Object类是所有类的根类,java中的任何类,都继承了Object类中的方法
最常用的是toString和equals方法
通用方法包括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: 一个类
如果object是class或其一个子类的实例,则结果返回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
文档为doc格式