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("未找到该学员!"); } } }