final(关键字)
修饰方法
作用:不能被重写
修饰变量
作用:final 修饰的基本数据类型的变量 不能被重新赋值
被final修饰的对象的地址不能改变(不能重新指向)
修饰类
作用:被修饰类 不能被继承
举例:
public class Demo01 {
public static void main(String[] args) {
}
}
class ClassA {
int num;
public final void fun() {
System.out.println("我是ClassA的fun方法");
}
}
class ClassB extends ClassA {
}
举例
public class Demo02 {
public static void main(String[] args) {
System.out.println(ClassC.MAX_VALUE);
}
}
class ClassC {
public static final int MAX_VALUE = 10;
public void fun(final int i) {
System.out.println(MAX_VALUE);
}
}
多态规则
前提
一种事件的多种形态
1.类与类之间 要产生联系 继承关系
2.要有方法重写(没有方法的重写 多态的意义不大)
3.核心:父类引用(指针)指向子类空间(声明方式)
举例
public class Demo03 {
public static void main(String[] args) {
Animal a1 = new Cat();
a1.cry();
Animal a2 = new Dog();
a2.cry();
}
}
class Animal {
String name;
String kind;
public void cry() {
System.out.println("我是动物叫出声");
}
public String toString() {
return "名字:" + name + " 种类:" + kind;
}
}
class Cat extends Animal {
public void cry() {
System.out.println("喵喵喵");
}
}
多态时 调用成员变量 和 成员方法
在内存中的表现
多态 调用成员变量时
简单记 编译和运行 都看等号 左边(父类引用)
当使用父类引用 指向子类空间时
父类的引用 只能访问到
子类空间中 属于 父类的那部分(super访问的部分)
当本类引用 指向本类的空间时
本类的引用可以访问到整个空间
多态的弊端:
使用多态声明对象时 无法直接调用子类的特有方法
只能通过向下转型后 才能使用子类特有方法
多态好处:
1.代码维护性强(建立在继承的基础上)
2.方法的扩展性强(核心好处)

public class Demo04 {
public static void main(String[] args) {
Father f = new Son();
f.print();
}
}
class Father {
int num = 10;
public void print() {
System.out.println("我是Father类的print方法");
}
}
class Son extends Father {
int num = 20;
public void print() {
System.out.println("我是Son类的print方法");
}
}
举例
定义主板类
主板
启动方法
插卡方法(例如声卡 网卡)
public class Demo08 {
public static void main(String[] args) {
MainBoard mainBoard = new MainBoard();
mainBoard.run();
Audio audio = new Audio();
mainBoard.addCard(audio);
Adapter adapter = new Adapter();
mainBoard.addCard(adapter);
}
}
class MainBoard {
public void run() {
System.out.println("主板启动了");
}
public void addCard(Card card) {
card.strat();
card.stop();
}
}
class Card {
public void strat() {
System.out.println("开始运转");
}
public void stop() {
System.out.println("结束运转");
}
}
class Audio extends Card {
@Override
public void strat() {
System.out.println("播放音乐");
}
@Override
public void stop() {
System.out.println("结束播放");
}
}
class Adapter extends Card {
@Override
public void strat() {
System.out.println("上网");
}
@Override
public void stop() {
System.out.println("断网");
}
}