final
package com.yuzhenc.oop;
public class Test08 {
public static void main(String[] args) {
final int BIRTH_YEAR = 1997;
final String string = new String("123");
a(string);
b(string);
}
public static void a(String s) {
s = new String("123");
}
public static void b(final String s) {
}
}
class Fruit {
final public void play() {
System.out.println("水果");
}
}
class Banana extends Fruit {
}
final class Tool {
}
abstract
package com.yuzhenc.oop;
public abstract class Person7 {
public void say() {
System.out.println("我对说话很满意!");
}
public abstract void eat();
public abstract void sleep();
}
class Boy extends Person7 {
@Override
public void eat() {
System.out.println("小男孩吃东西");
}
@Override
public void sleep() {
System.out.println("小男孩睡觉");
}
}
class Demo {
public static void main(String[] args) {
Boy boy = new Boy();
boy.say();
boy.sleep();
boy.eat();
Person7 p7 = new Boy();
p7.say();
p7.eat();
p7.sleep();
}
}
- 抽象类中一定有构造器,构造器的作用是给子类初始化对象的时候要先super调用父类的构造器
- 抽象类不能被final修饰,因为抽象类设计的初衷就是给子类继承用的,要是被final修饰了这个抽象类了,就不存在继承了,就没有子类
interface
package com.yuzhenc.oop;
public class Test09 {
public static void main(String[] args) {
MeiTuan mt = new MeiTuan(0,"WeiXin");
mt.setFood(new String[]{"炸鸡","可乐"});
mt.setPayMethod("ZhiFuBao");
mt.settleMoney();
}
}
class WaiMai {
String[] food;
public void setFood(String[] food) {
this.food = food;
}
public String[] getFood() {
return food;
}
public double createOrder(String[] food) {
return Math.round(Math.random()*100);
}
}
interface WeiXin {
String name = "微信支付";
default void wPay(double money) {
System.out.println("正在使用微信支付,支付金额为"+money+"元!");
};
public static void getPayMethod(){
System.out.println(name);
}
}
interface ZhiFuBao {
String name = "支付宝支付";
default void zPay(double money) {
System.out.println("正在使用支付宝支付,支付金额为"+money+"元!");
};
}
class MeiTuan extends WaiMai implements WeiXin,ZhiFuBao{
private double youHuiQuan = 0;
private String payMethod = "WeiXin";
public MeiTuan() {}
public MeiTuan(double youHuiQuan, String payMethod) {
this.youHuiQuan = youHuiQuan;
this.payMethod = payMethod;
}
public double getYouHuiQuan() {
return youHuiQuan;
}
public void setYouHuiQuan(double youHuiQuan) {
this.youHuiQuan = youHuiQuan;
}
public String getPayMethod() {
return payMethod;
}
public void setPayMethod(String payMethod) {
this.payMethod = payMethod;
}
@Override
public void wPay(double money) {
wPay(money);
WeiXin.super.wPay(money);
}
@Override
public void zPay(double money) {
System.out.println("使用支付宝成功支付:"+money+"元");
}
public void settleMoney() {
if ("WeiXin".equals(this.getPayMethod())) {
this.wPay(super.createOrder(super.food)-this.getYouHuiQuan());
} else if ("ZhiFuBao".equals(this.getPayMethod())) {
this.zPay(super.createOrder(super.food)-this.getYouHuiQuan());
} else {
System.out.println("支付失败!");
}
}
}
- 抽象类
- 抽象类使用abstract修饰
- 抽象类不能实例化
- 有抽象方法的类一定是抽象类,必须用abstract修饰
- 抽象类不一定要有抽象方法
- 如果一个子类实现了父类(抽象类)的所有抽象方法,该类可以是抽象类,也可以不是抽象类
- 抽象类中的抽象方法只有方法声明,没有方法实现
- 接口
- 接口使用interface修饰
- 接口不能实例化
- 一个类只能继承一个类,可以实现多个接口
- 多态的应用场合
(1)父类当做方法的形参,传入具体的子类的对象
(2)父类当做方法的返回值,返回的是具体的子类的对象
(3)接口当做方法的形参,传入具体的实现类的对象
(4)接口当做方法的返回值,返回的是具体的实现类的对象