8.oop-多态

时间:2023-03-09 01:58:48
8.oop-多态

一.继承
1.定义:子类继承父类,会继承父类的属性和方法
2.语法:extends关键字 子类 extends 父类
3.特点:java中的继承是单一继承,子类只能继承一个父类,但是父类可以有多个子类
4.用途:可以将共性的部分写到父类中,子类保留自己的个性特征
5.哪些不能被继承:父类的构造方法,私有的属性和方法

二.方法的重写
1.必须是子类重写父类的方法,所以是发生在两个类中
2.方法的签名必须一致,访问修饰符可以不一样,但子类不能严于父类

三.继承后的代码执行顺序
1.父类的属性--父类的构造方法--子类的属性--子类的构造方法

四.supper关键字
1.定义:代表父类的引用
2.作用:可以调用父类的属性和方法,包括构造方法
3.注意:如果调用父类构造方法,必须是在子类构造方法中的第一句

五.final关键字
1.定义:最终版本
2.可以修饰:类,属性,方法
3.作用:
修饰类:该类不能被继承
修饰属性:叫常量,声明时必须赋值,并且不能改变.常量的命名规则是全部大写
修饰方法:不能被重写

六.多态
1.一种事务的多种形态。
2.实现步骤:
a.子类继承父类,重写父类的方法
b.父类作为形参来代替所有的子类
c.在调用时,用父类的类型指向子类的对象

七.例子

1.请设计多个类,程序员,医生,演说家,歌手四个类
设计相关属性和职业行为,并且看怎么优化设计
共性的属性有:姓名,年龄,性别,职业
共性的方法有:自我介绍,吃饭,睡觉
特性的方法有:各自如何赚钱
特有的属性:各自特有的属性

2.人物采访:
要求:主持人主持一档节目,叫做人物访谈,可以采访各种职业的人
采访过程:
1.主持人先报广告赞助商
2.被采访人自我介绍
3.被采访人介绍自己的赚钱方式
4.主持人说下集预告
设计程序,要求主持人可以采访任何类型的职业人,采访流程不变。

加一个新的采访职业。老师

package com.demo1106;
/**
* 职业案例
* @author allen
*
*/
public class Profession {
public static void main(String[] args) {
Programmer p = new Programmer();
p.coding();
}
} class Person {
//姓名,年龄,性别,职业
String name;
int age;
String sex;
String profession;
final String HELLO = "你好";//常量,一旦声明就必须赋值,并且不能被修改
static{
System.out.println("我是父类静态");
}
public Person() {//子类继承父类,构造子类必先构造父类
System.out.println("我是父类构造方法");
} public void eat(){
System.out.println("吃米饭");
} public void sleep(){
System.out.println("睡觉八小时");
} public void intrduce(){
System.out.println("我叫"+name);
}
} class Programmer extends Person{
static{
System.out.println("我是子类静态");
}
public Programmer() {
super();
System.out.println("我是子类构造方法");
} public void coding(){
super.intrduce();
System.out.println("我赚钱的方法时:我会编码");
}
@Override//这个叫注解 此处的含义是告诉java这个方法是重写父类的方法,他有检查功能
public void sleep(){
System.out.println("我要加班,睡觉4个小时");
} } class Doctor extends Person{
String level;//级别 public void operation(){
System.out.println("我赚钱的方式:做外科手术");
}
@Override
public void eat(){
System.out.println("我吃面,还不用面条鲜");
}
}

  

package com.demo1106;
/**
* 任务采访案例
*/
public class Interview {
public static void main(String[] args) {
Compere cp = new Compere();
// People p = new Actor("芙蓉姐姐", "网红", "海文公司");
// 父类的类型指向子类的对象
People p = new Doctorer("某某某", "主任医师", "长沙湘雅附二");
cp.doProgram(p);
} } class Compere{
String name; //主持节目
public void doProgram(People p){
//1234
System.out.println("我是主持人:"+name+",感谢CCTV,所有TV");
p.introduce();
p.makeMoney();
System.out.println("我是主持人,感谢收看本级,下期再见");
} // public void doProgramToActor(Actor a){
// //1234
// System.out.println("我是主持人:"+name+",感谢CCTV,所有TV");
// a.intrduce();
// a.makeMoney();
// System.out.println("我是主持人,感谢收看本级,下期再见");
// }
//
// public void doProgramToLawyer(){
// //1234
// }
} //第一次优化
//将被采访人的自己的行为规范到被采访人类中
//将该类作为形参传递给主持人的主持节目方法
class Doctorer extends People{
//String name;来源于父类
String level;//自己值留下特征
//String company;//就职单位 @Override
public void introduce(){
System.out.println("我是:"+name+",我的级别是:"+level+",我就职于:"+company);
}
public Doctorer(String name,String level,String company) {
this.name = name;
this.level = level;
this.company = company;
}
@Override
public void makeMoney(){
System.out.println("我赚钱的方式是做手术做一半要红包");
}
} class Actor extends People{
// private String name;
private String type;
// private String company; public Actor(String name, String type, String company) {
this.name = name;
this.type = type;
this.company = company;
}
@Override
public void introduce(){
System.out.println("我是:"+name+",我就职于:"+company);
}
@Override
public void makeMoney(){
System.out.println("我赚钱的方式是潜规则上位");
}
} //第二次优化:
//1可以将所有被采访者抽取他们的共性到一个父类中。
//2被采访者可以继承这个父类并且重写父类中的方法
//3可以将主持人中的主持方法参数由原来的被采访者改为他们的父类
class People{
String name;
String company; public void introduce(){ } public void makeMoney(){ }
}

  

package com.demo1106;
//继承的语法案例
public class Demo{
public static void main(String[] args) {
Children c = new Children();
c.name = "张三疯";
c.eat();
}
} class Father {
String name;
int age;
String sex; public void eat(){
System.out.println("我喜欢吃米饭");
} public void run(){
System.out.println("每分钟跑200米");
}
} class Children extends Father{
String characate; public void play(){
System.out.println("我们喜欢撸啊撸");
}
}

  

/*
* 1.请设计多个类,程序员,医生,演说家,歌手四个类
设计相关属性和职业行为,并且看怎么优化设计
共性的属性有:姓名,年龄,性别,职业
共性的方法有:自我介绍,吃饭,睡觉
特性的方法有:各自如何赚钱
特有的属性:各自特有的属性
*
*/
package com.class1106; public class Class01 { public static void main(String[] args) {
// TODO Auto-generated method stub Person pg=new Programmer();
pg.introduce();
pg.eat();
pg.sleep();
pg.getmoney(); } } class Person{
String name;
int age;
String sex;
String profession; public void introduce(){
System.out.println("我是"+name+",性别是"+sex+",今年"+age+"岁"+",职业是"+profession);
}
public void eat(){
System.out.println("我会吃饭");
}
public void sleep(){
System.out.println("我还会睡觉");
}
public void getmoney()
{ }
} class Programmer extends Person{
String thought;
public void getmoney()
{
System.out.println("我通过写代码赚钱");
}
} class Doctor extends Person{
String cloth;
public void getmoney(){
System.out.println("我通过给人治病赚钱");
}
} class Speaker extends Person{
String eloquence;
public void getmoney(){
System.out.println("我通过演讲赚钱");
}
} class Singer extends Person{
String sound;
public void getmoney()
{
System.out.println("我通过唱歌赚钱");
}
}

  

/*
* 2.人物采访:
要求:主持人主持一档节目,叫做人物访谈,可以采访各种职业的人
采访过程:
1.主持人先报广告赞助商
2.被采访人自我介绍
3.被采访人介绍自己的赚钱方式
4.主持人说下集预告
设计程序,要求主持人可以采访任何类型的职业人,采访流程不变。
加一个新的采访职业。老师
*/
package com.class1106; public class Class02 { public static void main(String[] args) {
// TODO Auto-generated method stub Host h=new Host();
People p1=new Doctor1("华佗",100,"医生","院长");
h.interview(p1); People p2=new Teacher1("曹操",111,"老师","三国军事学院");
h.interview(p2); }
} class Host{
String name="陈鲁豫"; public void interview(People p)
{
System.out.println("我是主持人"+name+",本节目由五粮液冠名播出");
p.introduce1();
p.makemoney();
System.out.println("本期节目到这里就结束了,感谢cctv,我们下期再见");
}
} class People{
String name;
int age;
String profession; public void introduce1()
{ }
public void makemoney()
{ }
} class Doctor1 extends People{
String level;
public Doctor1(String name,int age,String profession,String level){
this.name=name;
this.age=age;
this.profession=profession;
this.level=level;
}
public void introduce1()
{
System.out.println("我是"+name+",今年"+age+"岁,"+"我的职业是"+profession+",我的级别是"+level);
}
public void makemoney()
{
System.out.println("我是通过做手术赚钱的");
}
}
class Teacher1 extends People{
String school;
public Teacher1(String name,int age,String profession,String school)
{
this.name=name;
this.age=age;
this.profession=profession;
this.school=school;
} @Override
public void introduce1()
{
System.out.println("我是"+name+",今年"+age+"岁,"+"我的职业是"+profession+",我所在的学校是"+school);
}
@Override
public void makemoney()
{
System.out.println("我是通过教学生知识赚钱的");
}
}

  

八.作业

做一个学员管理系统
功能:1.添加学员
2.查看学员信息
3.删除学员
4.修改学员

思路:创建学员对象
创建学员对象数组
每个功能对应一个方法,可以反复使用

提示:

---------------------------------
欢迎使用学员管理
---------------------------------
功能选择:
1.添加学员
2.查看学员信息
3.删除学员
4.修改学员
请选择:1
添加学员:
姓名:杜典
年龄:16
性别:女
电话:15232654565
籍贯:长沙
添加成功!
是否继续?y/n:y

功能选择:
1.添加学员
2.查看学员信息
3.删除学员
4.修改学员
请选择:2
姓名 年龄 性别 电话 籍贯
杜典 16 女 152656545 长沙
李祥 18 男 154854623 岳阳
是否继续?y/n:y

功能选择:
1.添加学员
2.查看学员信息
3.删除学员
4.修改学员
请选择:3
请输入要删除的学员姓名:李祥
删除成功!
是否继续?y/n:y

功能选择:
1.添加学员
2.查看学员信息
3.删除学员
4.修改学员
请选择:4
请输入要修改的学员姓名:杜典
姓名:哈哈
年龄:88
性别:女
电话:15232654565
籍贯:常德
修改成功!
是否继续?y/n:y

功能选择:
1.添加学员
2.查看学员信息
3.删除学员
4.修改学员
请选择:2
姓名 年龄 性别 电话 籍贯
哈哈 88 女 152656545 长沙
李祥 18 男 152454544 常德

package com.class1104;

import java.util.Scanner;

public class Test1 {

	public static void main(String[] args) {
// TODO Auto-generated method stub
//菜单各种询问,各种调用
Start st=new Start();
int s1;
String s2;
StuManager sm=new StuManager();
do{
st.select();
Scanner sc=new Scanner(System.in); System.out.print("请选择:");
s1=sc.nextInt(); switch(s1)
{
case 1:
System.out.println("添加学员:");
sm.addStu();
System.out.println("添加成功!");
break;
case 2:
sm.queryStu();
break;
case 3:
sm.deleteStu();
break;
case 4:
sm.updateStu();
break;
default:
System.out.println("输入错误");
break;
}
System.out.print("是否继续?y/n:");
s2=sc.next();
System.out.println();
}while(s2.equals("y")); }
} class Start{
public Start()
{
for(int i=0;i<25;i++)
{
System.out.print("-");
}
System.out.println();
System.out.println(" 欢迎使用学员管理");
for(int i=0;i<25;i++)
{
System.out.print("-");
}
System.out.println();
}
public void select()
{
System.out.println("功能选择:");
System.out.println(" 1.添加学员");
System.out.println(" 2.查看学员信息");
System.out.println(" 3.删除学员");
System.out.println(" 4.修改学员");
}
} class Student{
// 各种属性。要求封装
private String name;
private int age;
private String sex;
private String phone;
private String place; public void setName(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
public void setSex(String sex)
{
this.sex=sex;
}
public String getSex()
{
return sex;
}
public void setPhone(String phone)
{
this.phone=phone;
}
public String getPhone()
{
return phone;
}
public void setPlace(String place)
{
this.place=place;
}
public String getPlace()
{
return place;
}
} // 学员管理类
class StuManager{
Student stu[]=new Student[50];
Scanner sc1=new Scanner(System.in);
public void addStu()
{
Student stu1=new Student();
for(int i=0;i<stu.length;i++)
{
if(stu[i]==null)
{
stu[i]=stu1;
break;
} }
System.out.print("姓名:");
stu1.setName(sc1.next());
System.out.print("年龄:");
stu1.setAge(sc1.nextInt());
System.out.print("性别:");
stu1.setSex(sc1.next());
System.out.print("电话:");
stu1.setPhone(sc1.next());
System.out.print("籍贯:");
stu1.setPlace(sc1.next()); }
public void queryStu()
{
System.out.print("姓名"+"\t");
System.out.print("年龄"+"\t");
System.out.print("性别"+"\t");
System.out.print("电话"+"\t");
System.out.print("籍贯"+"\t"); for(int i=0;i<stu.length;i++)
{
if(stu[i]!=null)
{
System.out.println();
System.out.print(stu[i].getName()+"\t");
System.out.print(stu[i].getAge()+"\t");
System.out.print(stu[i].getSex()+"\t");
System.out.print(stu[i].getPhone()+"\t");
System.out.print(stu[i].getPlace()+"\t");
}
}
}
public void deleteStu()
{
System.out.print("请输入要删除的学员姓名:");
String name1=sc1.next();
boolean b1=false;
for(int i=0;i<stu.length;i++)
{
if(stu[i]!=null)
{
if(stu[i].getName().equals(name1))
{
b1=true;
stu[i]=null;
int j=i;
while(j<stu.length-1)
{
stu[j]=stu[j+1];
j++;
if((j+1)==stu.length-1)
{
stu[j+1]=null;
}
}
i--;
}
}
}
if(b1)
{
System.out.println("删除成功!");
}else{
System.out.println("未找到该学员!");
}
}
public void updateStu()
{
System.out.print("请输入要修改的学员姓名:");
String name2=sc1.next();
boolean b2=false;
for(int i=0;i<stu.length;i++)
{
if(stu[i]!=null)
{
if(stu[i].getName().equals(name2))
{
b2=true;
System.out.print("姓名:");
stu[i].setName(sc1.next());
System.out.print("年龄:");
stu[i].setAge(sc1.nextInt());
System.out.print("性别:");
stu[i].setSex(sc1.next());
System.out.print("电话:");
stu[i].setPhone(sc1.next());
System.out.print("籍贯:");
stu[i].setPlace(sc1.next());
}
}
}
if(b2)
{
System.out.println("修改成功!");
}else{
System.out.println("未找到该学员!");
}
}
}