JAVA面向对象进阶实例【教练和运动员日常安排】
编程目标
分别执行乒乓球和篮球的教练和学生行为,如下:
乒乓球教练|乒乓球学生|篮球教练|篮球学生
工作内容|教学 |练乒乓球 | 教学 |练篮球
餐饮 |教练餐 |学生餐 |教练餐 |学生餐
额外内容|学英语 |学英语 |无 |无
个人属性(姓名,年龄)
思路
接口:说英语
父类:人类
教练类:继承人类
学生类:继承人类
乒乓球教练:继承教练类+接口
乒乓球学生:继承学生类+接口
篮球教练:继承教练
篮球学生:继承学生
最后输出:测试类
实现步骤
1、接口,定义一个抽象的无参方法-说英语
接口是对动作的抽象
接口代码:
package person;
public interface speakeng {
void speakeng();
}
2、人类的代码:创建一个人的抽象类
抽象类是对属性的抽象
2.1通用属性,设置两个通用参数上name和age,
用private封装有参方法保证数据安全性,直接访问参数只能在类中完成
其他类中需要调用时必须通过private所在类中的get set 方法
2.2构造一个和类同名的无参方法和有参方法,完成对对象的初始化
(构造方法是一种特殊的方法,它是一个与类同名且没有返回值类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。)
有参方法中用this访问类中的参数 name和 age,
在构造方法中的this指的是:this所在的构造方法的变量
2.3写set、get方法,让其他类中可以访问private修饰的name和age参数
2.4创建一个eat的抽象方法(abstract修饰)
抽象方法:
抽象方法与实例方法最大的区别就是抽象方法一定要被普通子类重写并实现
抽象方法可以是父类认为必须实现的功能
抽象类继承抽象类可以不重写父类的抽象方法,普通类继承抽象类必须重写父类中的抽象方法,实现接口也是同样的道理
抽象方法用abstract来修饰,且没有方法体
一般方法
在程序中如果要重复多次地用到某种功能时,可以将这个功能写到一个方法中并调用,以减少代码的冗余。
可以自定义它的方法名,且一定会有返回值的修饰,如果这个方法没有返回值,则要用void修饰。一个方法一般能实现某种功能,但也可以是完全没有任何功能或者说是毫无意义的。
package person;
public abstract class person {
private String name;
private int age;
public person(){
}
public person(String name, int age){
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public abstract void eat();
}
3、教练类-创建一个教练的抽象类,继承人类
3.1构造教练类(人类的子类)的无参方法和有参方法,用super重复父类中的执行;
子类构造方法调用父类的构造方法重点是:子类构造方法无论如何都要调用父类的构造方法。
子类构造方法要么调用父类无参构造方法(包括当父类没有构造方法时。系统默认给的无参构造方法),要么调用父类有参构造方法。
super相当于执行父类的相应构造方法中的语句
当子类构造方法调用父类无参构造方法,一般都是默认不写的,要写的话就是super(),且要放在构造方法的第一句。
当子类构造方法要调用父类有参数的构造方法,那么子类的构造方法中必须要用super(参数)调用父类构造方法,且要放在构造方法的第一句。
3.2创建一个teach的抽象方法,是teach类中独有的
3.3重写继承至人类中的eat抽象方法(abstract修饰,没有方法体)(此处也可以选择不写,在后续实例化的教练类中重写),此处重写了就是一个一般方法类,在测试的时候可以直接调用,不用再重写。
package person;
public abstract class teach extends person{
public teach(){}
public teach(String name, int age){
super(name,age);
}
public abstract void teach();
@Override
public void eat() {
System.out.println("教练吃教练餐");
}
}
4、学生类代码:(思路与教师类相同)
package person;
public abstract class student extends person {
public student() {}
public student(String name, int age){
super(name,age);
}
public abstract void student();
@Override
public void eat() {
System.out.println("学生吃学生餐");
}
}
5、乒乓球学生代码:(继承学生类,加入学英语的接口)
5.1构造乒乓球学生类的方法
5.2重写学生类的student抽象方法
5.3eat类的抽象方法前面已经重写过了,此处可以不重写,如内容不同也可以重写
5.4重写speateng的接口内容
package person;
public class pingpangstudent extends student implements speakeng{
public pingpangstudent() {
}
public pingpangstudent(String name, int age) {
super(name, age);
}
@Override
public void student() {
System.out.println("乒乓球学生学习乒乓球");
}
/*
@Override
public void eat() {
super.eat();
}
*/
@Override
public void speakeng() {
System.out.println("乒乓球员学英语");
}
}
6、乒乓球教练代码:(同乒乓球学员)
package person;
public class pingpangteach extends teach implements speakeng{
public pingpangteach() {
}
public pingpangteach(String name, int age) {
super(name, age);
}
@Override
public void eat() {
super.eat();
}
@Override
public void teach() {
System.out.println("乒乓球教练教乒乓球");
}
@Override
public void speakeng() {
System.out.println("说英语");
}
}
7、篮球学生代码:(同乒乓球学员,不用加接口)
package person;
public class basektballstudent extends student{
public basektballstudent() {
}
public basektballstudent(String name, int age) {
super(name, age);
}
@Override
public void student() {
System.out.println("篮球运动员学篮球");
}
}
8、篮球教练代码:(同篮球学员)
package person;
public class basketteach extends teach{
public basketteach() {
}
public basketteach(String name, int age) {
super(name, age);
}
@Override
public void teach() {
System.out.println("篮球教练教篮球");
}
}
9、最后输出的测试代码:(测试类,用main语句)
9.1用new将pingpangstudent类实例化对象,得到pps实例对象
9.2用set语句对人类中的private修饰的参数name、age参数赋值,用get语句读取name、age参数值,将值打印出来
9.3调用之前重写了的student、eat方法、speakeng方法;
9.4重复以上动作应用与其他三个类中
9.5完成整体测试
package person;
public class persondemo {
public static void main(String[] args) {
pingpangstudent pps= new pingpangstudent();
pps.setName("乒乓球员");
pps.setAge(30);
System.out.println(pps.getName() +","+ pps.getAge() );
pps.student();
pps.eat();
pps.speakeng();
System.out.println("--------");
pingpangteach ppt = new pingpangteach();
ppt.setName("乒乓球教练");
ppt.setAge(30);
System.out.println(ppt.getName() +","+ ppt.getAge());
ppt.teach();
ppt.eat();
ppt.speakeng();
System.out.println("--------");
basektballstudent bbs = new basektballstudent();
bbs.setName("篮球运动员");
bbs.setAge(32);
System.out.println(bbs.getName() +","+ bbs.getAge());
bbs.student();
bbs.eat();
System.out.println("--------");
basketteach bt = new basketteach();
bt.setName("篮球教练");
bt.setAge(40);
System.out.println(bt.getName() +"," + bt.getAge());
bt.teach();
bt.eat();
}
}
适用于进阶练习的实例,可以便于深刻理解父类、子类、接口、面向对象、抽象方法、private的应用
本文地址:https://blog.csdn.net/weixin_52723971/article/details/110264783