继承与多态、抽象类与接口
继承与多态
一、什么是类的继承
1.继承的概念
[修饰符] class <类名> { 各种成员变量的定义; 各种成员方法的定义; }
在Java 中,往往在声明一个类的同时需要继承另一个类,这时就需要使用extends关键字来指明其父类。创建类的完整的语法格式如下:
[修饰符] class <类名> [extends 父类名][implement 接口列表]{ 各种成员变量的定义; 各种成员方法的定义; }
3.继承中的protectd
super [参数列表];
(2)使用super关键字访问父类中与子类同名的成员方法和成员变量
super. 成员变量; super. 成员方法[参数列表];
二、final关键字
1.final修饰变量
public class Person { private String name=""; private String address=""; //定义构造方法 public Person ( String name, String address) { this. name = name; this. address = address; } }
(2)定义Employee类并继承Person类。
//继承Person类 public class Employee extends Person{ private String ID = ""; private double wage = 0; private int age = 0; public Employee(String name, String address, String ID, double wage, int age){ super(name, address); //调用父类的构造方法 this. ID = ID; this. wage = wage; this. age = age; } public double add (String position){ //判断职位 if(position = = "0" ) wage = wage *1.2; } else{ wage = wage * 1.1; } return wage; } //设置 get/set方法 public double getWage(){ return wage; public void set Wage (double wage){ this. wage = wage; } }
(3)定义Manger并继承Employee 类。
public class Manager extends Employee{ private String level = ""; //1为普通员工,0为经理 public Manager( String name, String address, String ID, double wage, int age, String level) { super( name, address, ID, wage, age); this. level = level; //设置get/set方法 public String getLevel (){ return level; public void setLevel ( String level){ this. level = level; } }
(4)定义测试类Test, 完成相应的操作。
public class Test { public static void main( String[] args){ //新建对象 Manager normal = new Manager( "wsl", "jit" , " 12" , 1000, 2, "1"); Manager manager = new Manager(" ctl" , "jitt" , " 123" , 5000, 10, "0"); //传入职位,Manager类型的对象没有add()方法,所以自动搜寻其父类,调用add()方法 normal. add( normal. getLevel()) ; manager. add (manager. getLevel()); System. out. println ("TT资:" +normal. get Wage()); System. out. println ("经理的T资:" +manager. getWage()); } }
5.运行结果

抽象类与接口
一、什么是抽象类
1.抽象类的定义
在面向对象的概念中,所有的对象都是通过类来描绘的。但是反过来, 并不是所有的类都是用来描绘对象的, 如果一个类中没有包含足够的信息来描绘一个具体的对象, 这样的类就是抽象类。 简单来说,在Java 中, 如果一个类中包含了抽象方法(只包括方法声明, 而不包含方法体)。则该类就必须定义成抽象类,抽象方法的具体实现则由抽象类派生出的各子类来完成。这使程序的功能描述和功能实现得以分离,此外, 由于一个抽象类可派生多个子类。 因此, 抽象类中的一个抽象方法可以在多个子类中有多种实现方式,这也实现了程序的多态性。
(1)抽象类的定义的语法格式
public abstract class 类名 // 声明抽象类 } { // 声明抽象类成员 }
(2)抽象类成员组成
[public] interface 接口名 [extend 接口1,接口2......] //声明接口 { //声明接口成员 }
[修饰符] class<类名> [extends <父类名>] [implement接口名]
(2)接口成员组成
[修饰符] class <类名> [extends <父类名>] [implements <接口1>,<接口2>......]
3.接口的使用
接口的定义和使用很容易, 但要注意一点,由于系统要求继承接口的类中必须实现接口的全部方法, 因此, 一旦修改了接口内容,很可能会导致相关类变成抽象类,而抽象类是不能实例化的。
三、设计学生管理系统
1.任务描述
2.任务目标
3.实现思路
4.实现代码
(1)定义一个学生类
package studentsystem; public class Stu{ //基本属性 public String name, tel, age; public boolean sex; public static int i=0; //人数总和 private Stu[] s=new Stu[5]; //创建学生表, //返回表 public Stu[] TheStuArrar() { return s;} public Stu(){ } //有参构造方法用来向表添加学生 public Stu( String a, String b, String c, boolean d){ name=a; age=b; tel=c; sex=d; } //相关属性的get/set方法 public String getName(){ return name; } public void setName(String name) { this. name = name; } public String getTel(){ return tel; } public void setTel(String tel){ this, tel = tel; } public String getAge() { return age; } public void setAge (String age){ this. age = age; } public boolean getSex(){ return sex; } public void setSex( boolean sex){ this. sex = sex; } }
(2)定义一个教师接口
package studentsystem; public interface Teacher1{ //教师拥有对表的操作权限 abstract public void jiemian (Stu [] st) ; //初始界面,选择操作 abstract public void set ( Stu [] st); //存储 abstract public void ShowStu(Stu [] st) ; //查看 }
(3)定义一个具体教师类来实现教师接口
package studentsystem; import java. util. Scanner; public class TeacherCan implements Teacher1{ //界面 public void jiemian(Stu[] st) //参数是执行的对象 } System. out. println(" --------学生管理系统-------"); int a; Scanner sc = new Scanner( System. in); //一直执行操作,直到某些情况满足就break退出循环 for(;;){ System. out. println (" 1. 查看生信息"); System. out. println("2. 存储生信息"); System. out. println("按数字0退出系统"); a = sc. nextlnt(); if(a= =0) break; //用switch判断用户的选择,非法输入无效 switch (a){ case 1:ShowStu(st); break; case 2:set(st); break; default: System. out. println("输入无效! In"); } } } //查看 public void ShowStu(Stu[] st){ System. out. println("序号"+" \t 姓名:"+" \t年龄:"+ "\t性别:"+" \t电话:"); //过滤掉空的元素,这里不用成员变量i,所以不担心变量名重复 //doo用来展示序号,i遍历st数组 for( int i=0, doo = 0; i<st. length; i++, doo++){ if(st[i] = =null) | doo--; continue; } System. out. println( (doo+1)+" \t "+st[i]. getName() +" \t "+st[i]. getAge() +" \t" +st[i]. getSex()+" \t "+st[i]. getTel() +" \t "); } } //存储 public void set(Stu[] st) { Scanner s= new Scanner( System. in); String a,b,c,f; boolean d; int e; //往数组的空元素插入数据 //条件设置成<=,是为了在内存用完后继续增加时提示空间不足 for( int it=0; it<= st. length; it++) { //控制语句,当内存10个用完了时还调用该方法增加人员,提示并退出 if(Stu. i>=st. length){ System. out. println("e不足,对象内存(" +st. length+" )已用完! \n"); break; } if(st[it] = = null) | System. out. println("第"+(Stu. i+1) +"个学生的信息:"); System. out. print("名:"); a=s. nextLine(); System. out. println (":"); b=s. nextLine(); System. out. println("电话:"); c=s. nextLine(); System. out. println(": (true, false女生)"); d=s. nextBoolean(); //往空元素插入新学生 st[ it] = new Stu(a,b,c,d); //人数标记+1 Stu. i++; System. out. println("写入成功!按数字0退出,按1继续"); e=s. nextInt(); if(e==0) break; else s. nextLine(); //这里会产生回车残留,需要用nextLine()吸收 } } } }
(4)定义类Run,完成相应的操作
public class Run{ public static void main ( String [] args){ teacherCan t1 = new teacherCan() ; //new老师 stu st= new stu() ; //new学生表 t1. jiemian(st. TheStuArrar()) ; //老师进行操作 } }
5.运行结果

浙公网安备 33010602011771号