面向对象06
1、final:最终的,不能改变的
-
修饰变量
final int a = 1; //a = 5; 编译错误,final修饰的变量不能被改变
-
修饰方法
public class Demo01 { public static void main(String[] args) { } final void show(){ } } class TestDemo01 extends Demo01{ //void show(){ } 编译错误,final修饰的方法不能被重写 }
-
修饰类
final public class Demo01 {} class TestDemo01 extends Demo01{ }//编译错误,final修饰的类不能被继承 public class Demo01 {} final class TestDemo01 extends Demo01{ }//正确,可以当爸爸,不能当儿子
2、static final:常量
-
声明同时必须初始化
final static double Pi;//编译错误,常量在声明时就应该初始化
-
常常通过类名点来访问,不能被改变
-
命名规则:常量名所有字母都大写,多个单词用_分隔
public class Demo01 { final static double Pi = 3.14;//常量名所有字母都大写 final static double APP_WIDTH = 10;//多个单词用_分隔 } class TestDemo01 { public static void main(String[] args) { System.out.println(Demo01.Pi);//通过类名点来访问 //System.out.println(Demo01.Pi = 5); 编译错误,常量不能被改变 } }
-
编译器在编译时,会将常量直接替换为对应的数字,效率高(静态变量存在方法区中,使用时到方法区中获取变量值并使用)
-
在数据永远不变,并且经常用时使用常量
3、抽象方法
-
由abstract修饰
-
只有方法的定义,没有具体实现(连{}都没有)
这代表这个方法没有意义,必须被重写才能被使用
4、抽象类
-
由abstract修饰
-
包含抽象方法的类必须是抽象类(抽象类未必有抽象方法)
-
抽象类无法被实例化(new 对象)
-
抽象类需要被继承,派生类:
-
重写抽象类的所有抽象方法(若有抽象方法)
-
也声明为抽象类
-
-
抽象类的意义
- 封装共有的属性和行为(代码复用)
- 为所有派生类提供统一的类型(向上造型)
- 可以包含抽象方法,为所有派生类提供统一的入口(向上造型后能点出来),同时可以达到强制重写的目的(相当于制定一个标准)-------即要想被统一操作,必须实现继承,只要继承,必须实现抽象方法
补充:
-
设计规则:
- 将派生类所共有的属性和行为,抽到超类中-------------抽共性
- 若派生类的行为/代码都一样,设计为普通方法
- 若派生类的行为/代码都不一样,设计为抽象方法
-
抽象类(方法)的意义
抽象方法存在的意义是什么?
保证当发生向上造型,通过超类的引用能点出来那个方法----------保证能点出方法来
既然抽象方法的意义是保证能点出来,那为什么不设计为普通方法呢?
设计为普通方法,意味着派生类可以重写也可以不重写,但设计为抽象方法,则可以强制派生类必须
重写------------达到强制派生类重写,统一的目的