目录
1、多态
1.1 认识多态
1.1.1 对象多态
1.1.2 行为多态
1.1.3 成员变量不谈多态
1.2 使用多态的好处
1.3 多态下的类型转换问题
2、final
2.1 认识final
2.1.1 修饰类
2.1.2 修饰方法
2.1.3 修饰变量
2.2 补充知识:常量详解
3、抽象类abstract
3.1 认识抽象类
3.2 使用抽象类的好处
3.3 抽象类的常见应用场景:模版方法设计模式
3.3.1 模版方法设计解决了什么问题
3.3.2 模版方法设计模式的写法
3.3.2.1 People父类
3.3.2.2 Student子类
3.3.2.3 Teacher子类
3.3.2.4 main
3.3.2.5 多学一招使用final修饰模版方法
4、接口
4.1 接口概述
4.1.1 IDEA创建接口
4.1.2 认识接口
4.1.3 接口的好处
4.1.3.1 一个类同时可以实现多个接口
4.1.3.2 让程序面向接口编程,灵活切换多个业务(下图存在A/B司机)
4.2 接口的综合案例
4.2.1 创建实体类Student2
4.2.2 创建接口StudentOperator
4.2.3 定义第一套实现类StudentOperatorImpl1
4.2.4 定义第二套实现类StudentOperatorImpl2
4.2.5 创建数据处理类ClassManager
4.2.6 主函数
4.3 接口的其他细节:
4.3.1 jdk8接口新增三种方法
4.3.1.1 默认方法:必须使用default修饰,默认会被public修饰
4.3.1.2 私有方法:必须使用privata修饰(jdk9以上)
4.3.1.3 静态方法:必须使用static修饰
4.3.2 接口的多继承
4.3.3 使用接口的注意事项[了解]
前言:多态是在继承/实现情况下一种现象,表现形式为:对象多态、行为多态
父类
学生类
老师类
多态下怎么使用子类的独有功能 见 1.3
一般工具类会加final
package com.runa.staticdemo;
public abstract class People {
// 开始设计模版方法设计模式
// 1 定义有一个模版方法出来
public final void write(){
System.out.println("\t\t\t\t\t《我的码农经历》");
System.out.println("\t\t《我的码农经历》");
// 2 模版方法不清楚正文内容,子类肯定要写
System.out.println(writeMain());
System.out.println("\t\t结尾了");
}
// 3 设计一个抽象方法写正文,具体的实现交给子类实现
public abstract String writeMain();
}
package com.runa.staticdemo;
public class Student extends People{
public String writeMain(){
return "\t\t正文我是来学习python的";
}
}
package com.runa.staticdemo;
public class Teacher extends People{
public String writeMain(){
return "\t\t正文我是java老师";
}
}
package com.runa.staticdemo;
public class TestTemplate {
public static void main(String[] args) {
// 开头相同
//正文不同
//结尾相同
Teacher t = new Teacher();
t.write();
System.out.println("===============================================");
Student s = new Student();
s.write();
}
}
改版
package com.runa.staticdemo;
public class TestTemplate {
public static void main(String[] args) {
// 开头相同
//正文不同
//结尾相同
People t = new Teacher();
t.write();
System.out.println("===============================================");
People s = new Student();
s.write();
}
}
传统的接口里面只能有成员变量和成员方法,接口中定义的变量是常量;接口中定义的方法是抽象方法;并且接口也不能创建对象
package com.runa.staticdemo;
public interface D {
// 多此一举 public static
public static String SCHOOLNAME = "S";
String NAME = "S";
// 成员方法(抽象方法) public static 多此一举 ,成员方法不能构造器和方法体
void test();
}
接口D
package com.runa.staticdemo;
public interface D {
// 成员方法 public static 多此一举 ,成员方法不能构造器和方法体
void testd1();
void testd2();
}
接口C
package com.runa.staticdemo;
public interface C {
void testc1();
void testc2();
}
实现类E
package com.runa.staticdemo;
//实现类
public class E implements C, D{
@Override
public void testc1() {
}
@Override
public void testc2() {
}
@Override
public void testd1() {
}
@Override
public void testd2() {
}
}
main
package com.runa.staticdemo;
public class TestIm {
public static void main(String[] args) {
E e = new E();
e.testc1();
e.testc2();
e.testd1();
e.testc2();
}
}
package com.runa.staticdemo;
public class Student2 {
private String name;
private char sex;
private double score;
public Student2() {
}
public Student2(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;
}
}
定义2个抽象方法,接收全部学生信息
package com.runa.staticdemo;
import java.util.ArrayList;
public interface StudentOperator {
void printAllInfo(ArrayList students);
void printAverageScore(ArrayList students);
}
package com.runa.staticdemo;
import java.util.ArrayList;
public class StudentOperatorImpl1 implements StudentOperator{
@Override
public void printAllInfo(ArrayList students) {
System.out.println("==============全班全部学生信息如下:===================");
for (int i = 0; i < students.size(); i++) {
Student2 s = students.get(i);
System.out.println("姓名:" + s.getName() + "性别:" + s.getSex()+ "成绩:" + s.getScore());
}
System.out.println("=======================================");
}
@Override
public void printAverageScore(ArrayList students) {
double allScore = 0.0;
for (int i = 0; i < students.size(); i++) {
Student2 s = students.get(i);
allScore += s.getScore();
}
System.out.println("平均分:" + allScore / students.size());
}
}
package com.runa.staticdemo;
import java.util.ArrayList;
public class StudentOperatorImpl2 implements StudentOperator{
@Override
public void printAllInfo(ArrayList students) {
System.out.println("==============全班全部学生信息如下:===================");
int count1 = 0;
int count2 = 0;
for (int i = 0; i < students.size(); i++) {
Student2 s = students.get(i);
System.out.println("姓名:" + s.getName() + "性别:" + s.getSex()+ "成绩:" + s.getScore());
if(s.getSex()== '男'){
count1 ++;
}else {
count2 ++;
}
}
System.out.println("男生人数:" + count1 + "女生人数:" + count2 );
System.out.println("总人数:" + students.size() );
System.out.println("=======================================");
}
@Override
public void printAverageScore(ArrayList 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++) {
Student2 s = students.get(i);
if(s.getScore() > max) max = s.getScore(); //简写
if(s.getScore() < min) min = s.getScore();
allScore += s.getScore();
}
System.out.println("最高分:" + max + "最低分:" + min );
System.out.println("平均分:" + (allScore - max - min) / (students.size() - 2));
}
}
这里我使用了2个构造方法,无参合有参,有参的调用在主函数注释了
package com.runa.staticdemo;
import java.util.ArrayList;
public class ClassManager {
private ArrayList students = new ArrayList<>();
private StudentOperator studentOperator = new StudentOperatorImpl2();// 这里切换方案
public ClassManager() {
students.add(new Student2("迪丽热巴",'女',99));
students.add(new Student2("古力娜扎",'女',100));
students.add(new Student2("马尔扎哈",'男',90));
students.add(new Student2("卡尔",'男',60));
}
public ClassManager(ArrayList students) {
this.students = students;
}
//打印全班全部学生信息
public void printInfo(){
studentOperator.printAllInfo(students);
}
// 打印全班全部学生平均分
public void printScore(){
studentOperator.printAverageScore(students);
}
}
package com.runa.staticdemo;
import java.util.ArrayList;
public class TestImplMain {
public static void main(String[] args) {
// ArrayList ss = new ArrayList<>();
// Student2 s1 = new Student2("迪丽热巴",'女',99);
// Student2 s2 = new Student2("古力娜扎",'女',100);
// Student2 s3 = new Student2("马尔扎哈",'男',90);
// Student2 s4 = new Student2("卡尔",'男',60);
// ss.add(s1);
// ss.add(s2);
// ss.add(s3);
// ss.add(s4);
// ClassManager c = new ClassManager(ss);
// c.printInfo();
// c.printScore();
ClassManager c = new ClassManager();
c.printInfo();
c.printScore();
}
}
package com.runa.staticdemo;
public class TestInterfaceEx {
public static void main(String[] args) {
}
}
interface AA{
}
interface BB{
void test1();
}
interface CC{
void test2();
}
interface DD extends CC,BB,AA{
}
class EE implements DD{
@Override
public void test1() {
}
@Override
public void test2() {
}
}
签名冲突
继承了父类和接口重名方法
默认方法同名