abstract
/*
!!!抽象类、抽象方法是什么样的?
1.都是用abstract修饰的;抽象方法只有方法签名,不能写方法体。
!!!抽象类有哪些注意事项和特点?
1.抽象类中可以不写抽象方法、但有抽象方法的类一定是抽象类。
2.类有的成员(成员变量、方法、构造器)抽象类都具备。
3.抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。
4.一个类继承抽象类,必须重写玩抽象的全部抽象方法,否则这个类也必须定义成抽象类。
!!!抽象类的场景和好处?
1.父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,
我们设计这样的抽象类,就是为了更好的支持多态。
2.模板方法设计模式:
解决方法中存在重复代码的问题:
1.定义一个抽象类。
2.在里面定义两个方法:
1.一个是模板方法(加final关键字防止子类重写):把相同的代码放进去。
2.一个是抽象方法:具体实现交给子类完成。
*/
interface
/*
接口:
1.Java提供看一个关键字interface,用这个关键字我们可以定义出一个特殊的结构:接口。
public interface 接口名{
//成员变量(常量)
//成员方法(抽象方法)
}
2.注意:接口不能创建对象;接口是用来被类实现的,实现接口的类被成为实现类。
修饰符 class 实现类 implements 接口1,接口2,接口3,...{
}
3.一个类可以实现多个接口(接口可以理解成干爹),实现类实现多个接口,必须重写完全部类的全部抽象方法,否则实现类
必须定义成抽象方法。
!!!使用接口有啥好处?
1.可以解决类单继承的问题,通过接口,我们可以让一个类有一个亲爹的同时,还可以找多个干爹去扩展自己的功能。
!!!为什么我们要通过接口已扩展自己的功能?
1.因为通过接口去找干爹,别人通过你implements的接口,就可以显性的知道你是谁,从而也可以放心的把你当作谁
来使用。
!!!使用接口的第二个好处?
1.一个类我们说可以实现多个接口,同样,一个接口也可以被多个类实现的。这样做的好处是我们的程序就可以面向
接口编程了,这样我们程序员就可以很方便的灵活切换各种业务实现。
!!!JDK8开始,接口中新增了哪些方法?
1.默认方法:使用default修饰,使用实现类的对象调用。
2.静态方法:static修饰,必须用当前接口名调用。
3.私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。
4.它们都会默认被public修饰。
public interface A{
default void test1(){
...
}
private void test2(){
...
}
static void test3(){
...
}
}
!!!JDK8开始,接口中为啥要新增怎这些方法?
1.增强了接口的能力,更便于项目的拓展和维护。
接口的多继承:
1.一个接口可以同时继承多个接口。
接口多继承的作用:
1.便于实现类去实现。
接口其他注意事项:
1.一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承。
2.一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现。
3.一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会优先用父类的。(先后亲爸、后有干爹)
4.一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
*/
interface_case
demand
/*
需求:
请设计一个班级学生的信息管理模块:学生的数据有:姓名、性别、成绩
功能 1:要求打印出全班学生的信息;功能 2:要求打印出全班学生的平均成绩
第 1 套方案:
1.能打印出班级全部学生的信息;能打印班级全部学生的平均分。
第 2 套方案:
1.能打印处班级全部学生的信息(包含男女人数);打印班级全部学生的平均分(要求是去掉最高分和最低分)。
需求:系统可以支持灵活的切换这些实现方案。
*/
package com.item.huang.interface_case;
import java.util.ArrayList;
public interface Print {
//打印全部学生信息
void printAllInformation(ArrayList<Student> students);
//打印全部学生的平均分
void printAverageScore(ArrayList<Student> students);
}
PrintLmol1
package com.item.huang.interface_case;
import java.util.ArrayList;
public class PrintImpl1 implements Print{
@Override
public void printAllInformation(ArrayList<Student> students) {
for (int i = 0; i < students.size(); i++) {
System.out.println("姓名:" + students.get(i).getName());
System.out.println("性别:" + students.get(i).getSex());
System.out.println("成绩:" + students.get(i).getScore());
}
}
@Override
public void printAverageScore(ArrayList<Student> students) {
double allScore = 0.0;
for (int i = 0; i < students.size(); i++) {
allScore += students.get(i).getScore();
}
System.out.println("平均成绩是:"+allScore/students.size());
}
}
PrintLmol2
package com.item.huang.interface_case;
import java.util.ArrayList;
public class PrintImpl2 implements Print{
@Override
public void printAllInformation(ArrayList<Student> students) {
int count1 = 0;
int count2 = 0;
for (int i = 0; i < students.size(); i++) {
System.out.println("姓名:" + students.get(i).getName());
System.out.println("性别:" + students.get(i).getSex());
System.out.println("成绩:" + students.get(i).getScore());
if (students.get(i).getSex()=='男'){
count1++;
}else{
count2++;
}
}
System.out.println("男生有:"+count1+"人"+" 女生有:"+count2+"人");
}
@Override
public void printAverageScore(ArrayList<Student> students) {
double allScore = 0.0;
double max = students.get(0).getScore();
double min = students.get(0).getScore();
for (int i = 0; i < students.size(); i++) {
allScore += students.get(i).getScore();
if (students.get(i).getScore()>max){
max = students.get(i).getScore();
}
if (students.get(i).getScore()<min){
min = students.get(i).getScore();
}
}
System.out.println("平均成绩是:"+(allScore-max-min)/(students.size()-2));
}
}
Student
package com.item.huang.interface_case;
//学生类
public class Student {
private String name;
private char sex ;
private double score;
public Student() {
}
public Student(String name, char sex, double score) {
this.name = name;
this.sex = sex;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
StudentOperator
package com.item.huang.interface_case;
import java.util.ArrayList;
//学生操作类-1.定义打印全部学生信息功能 2.定义打印全班学生平均成绩功能
//Print接口有两个实现类,PrintImpl1 和 PrintImpl2
//根据多态的思想可以改变指向的实现类而使用其不同的方法
public class StudentOperator {
private ArrayList<Student> Students = new ArrayList<>();
private Print print = new PrintImpl2();
public StudentOperator(){
Student s1 = new Student("张三",'男',100);
Students.add(s1);
Student s2 = new Student("李四",'男',90);
Students.add(s2);
Student s3 = new Student("李娟",'女',90);
Students.add(s3);
Student s4 = new Student("魏琳",'女',60);
Students.add(s4);
}
public void printAllInformation(){
print.printAllInformation(Students);
}
public void printAverageScore(){
print.printAverageScore(Students);
}
}
Test
package com.item.huang.interface_case;
public class Test {
public static void main(String[] args) {
StudentOperator studentOperator = new StudentOperator();
studentOperator.printAllInformation();
studentOperator.printAverageScore();
}
}
标签:get,students,void,接口,oop,Student,promax,public,abstractAndInterface
From: https://www.cnblogs.com/qingandji/p/18106180