JAVA创建⼀个抽象类Role,有姓名、性别等变量
问题描述:
定义⼀个抽象的"Role"类,有姓名,年龄,性别等成员变量
1)要求尽可能隐藏所有变量(能够私有就私有,能够保护就不要公有),
再通过Getter()和Setter()⽅法对各变量进⾏读写。具有⼀个抽象的play()⽅法,
该⽅法不返回任何值,同时⾄少定义两个构造⽅法。Role类中要体现出this的⼏种⽤法。
2)从Role类派⽣出⼀个"Employee"类,该类具有Role类的所有成员(构造⽅法除外),
并扩展salary成员变量,同时增加⼀个静态成员变量“职⼯编号(ID)”。
同样要有⾄少两个构造⽅法,要体现出this和super的⼏种⽤法,还要求覆盖play()⽅法,
并提供⼀个final sing()⽅法。
3)“Manager"类继承"Employee"类,有⼀个final成员变量"vehicle”
在main()⽅法中制造Manager和Employee对象,并测试这些对象的⽅法。
问题思路:
我们可根据题⽬要求创建相关类与⽅法、变量等。
1)⾸先创造⼀个抽象类,定义私有变量姓名、年龄、性别;定义getter、setter⽅法对相应变量进⾏读取写⼊功能(Employee⼦类中输出⽗类私有属性时会⽤到);定义两个以上构造⽅法(对成员变量进⾏初始化操作可⽤构造⽅法也可⽤setter⽅法,此处有setter⽅法使⽤setter);体现this⽤法(1.this调⽤类中属性,2.this调⽤类中⽅法(构造⽅法、普通⽅法),注意:构造⽅法调⽤不能成“环”,3.this 代表当前对象)
2)Employee类继承⽗类Role,定义salary、ID成员变量(相对于⽗类来说为扩充属性);定义⾄少两个构造⽅法,体现this和super⼏种⽤法(⼦类调⽤⽗类⽆参构造时super()语句可省略,此时可使⽤this语句调⽤⼦类中⽅法或属性,但调⽤⽗类有参构造时⼦类构造⽅法⾸⾏必须明确使⽤super(参数),指明调⽤⽗类哪个有参构造,此时⼦类构造⽅法中不可存在this语句调⽤本类构造⽅法的使⽤,因在构造⽅法中this和super调⽤构造⽅法时均需要位于构造⽅法⾸⾏);覆写play()⽅法,即在⼦类中具体实现⽗类中的抽象⽅法;定义final sing()⽅法,即只能继承(使⽤)不能修改。
3)⽣成Manager类继承Employee类,相当于间接也继承了Role类,在Manager中定义final vehicle成员变量。
4)在主类中分别⽣成Employee类与Manager类对象,进⾏测试程序。
源代码如下:
abstract class Role{//抽象类
private static String name="张三";//static家族与对象⽆关,即在加载类时⽣成
private static int age=18;
private static String sex="男";
public Role(){
System.out.println("1.这是⽗类Role的⽆参构造");
}
public Role(String name){
this();//调⽤⽆参构造
System.out.println("2.这是⽗类Role⼀个有参构造");
}
public Role(String name,int age){
this(name);
System.out.println("3.这是⽗类Role两个有参构造");
}
public Role(String name,int age,String sex){
this(name,age);
System.out.println("4.这是⽗类Role三个有参构造");
this.play();//调⽤普通⽅法play()
}
}
public void setName(String name){
this.name=name;//this调⽤本类属性
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age=age;
}
public int getAge(){
return this.age;
}
public void setSex(String sex){
this.sex=sex;
}
public String getSex(){
return this.sex;
}
public void fun(){
System.out.println("4.>>>>>");
}
public abstract void play();//抽象⽅法,即只声明没有具体实现
}
class Employee extends Role{//⼦类Employee(相对于Role类来说)
private static int salary;
private static int ID;
public void fun(){//⽅法覆写
System.out.println("5........................");
}
public Employee(){
this(salary);//调⽤⼀个参数的有参构造
this.play();//调⽤普通⽅法play()
this.sing();
}
public Employee(int salary){
this.salary=salary;
System.out.println(salary);
}
public Employee(int salary,int ID){
super("张三",18,"男");
this.salary=salary;
this.ID=ID;
抽象类的使用this.sing();
}
public void play(){
System.out.println(getName()+"今年"+getAge()+"性别"+getSex());
//调⽤getter⽅法得到各成员变量数值
}
public final void sing(){
System.out.println("年薪为"+this.salary+"⼯号为"+this.ID);
}
}
//⼦类Manager(相对于Employee类⽽⾔,对于Role类Manager为孙⼦类,也间接继承了Role类)class Manager extends Employee{
private final int vehicle=23;
public void fun(){//⽅法覆写(覆写Employee类中fun()⽅法)
System.out.println("6.+++++++++++++++++++++++");
}
}
public class Test{
public static void main(String[] args){
Role role1=new Employee(30000,12345);
//因Role类为抽象类⽆法直接实例化对象,但可通过Employee类对象向上转型访问
//因Role类为抽象类⽆法直接实例化对象,但可通过Employee类对象向上转型访问
//⽣成Employee类实例化对象role1,调⽤两个参数的有参构造
role1.fun();//调⽤fun()⽅法,结果为覆写后内容
Role role2=new Manager();//⽣成Manager类实例化对象role2,调⽤⽆参构造
role2.fun();
}
}
输出结果如下:
序号1到序号5为实例化Employee类后结果,序号1到序号6为实例化Manager类后结果。程序运⾏分析图:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
C#反射概念及应用场景
« 上一篇
java抽象类注入,spring向抽象类注入问题
下一篇 »
发表评论