final关键字
继承弊端:打破了封装性。
final关键字:
-
final是一个修饰符,可以修饰类,方法,变量。
-
final修饰的类不可以被继承
-
final修饰的方法不可以被覆盖
-
final修饰的变量是一个常量,只能赋值一次。
为什么要用final修饰变量。其实在程序如果一个数据是固定的,那么直接
使用这个数据就可以了,但是这样阅读性差,所以它该数据起个名字,而
这个变量名称的值不能变化,所以加final固定。
写法规范:常量所有字母都大写,多个单词,中间用_(下划线)连接。
calss Fu{
void method(){
//调用底层系统的资源
}
}
class Zi extends Fu{
public static final double MY_PI=3.14;//全局常量
void method(){
final int NUMBER=9;
System.out.println(MY_PI);
}
}
class FinalDemo{
public static void main(String[] args){
System.out.println("Hello World");
}
}
面向对象——抽象类——概述
抽象类:
抽象:笼统,模糊。看不懂,不具体。
abstract class Demo{
abstract void show();
}
class DemoA extends Demo{
void show(){
System.out.println("demoa show");
}
}
class DemoB extends Demo{
void show(){
System.out.println("demob show");
}
}
class AbstractDemo{
public static void main(String[] args){
System.out.println("Hello World");
}
}注:abstract抽象的意思。
抽象类特点
特点:
1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰,
抽象方法必须定义在抽象类中,该类必须也被abstract修饰。
2,抽象类不可以被实例化。例:Person p=new Person();
为什么?因为调用抽象方法没有意义。
3,抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。
否则,这个子类还是抽象类。
抽象类——细节
1,抽象类中有构造函数吗?
有,用于给子类对象进行初始化
2,抽象类可以不定义抽象方法吗?
可以的。但是很少见。目的就是不让该类创建对象。AWT的适配器对象就是
这样的类,通常这个类中有的方法有方法体,但是却没有内容。
abstract class Demo{
void show()
{}
void show2()
{}
}
3,抽象关键字不可以和那些关键字共存?
private 不可以
final 不可以
static 不可以
4,抽象类和一般类的异同点?
相同点:抽象类和一般类都是用来描述事物的,都在内部定了成员
不同:1,一般类有足够的信息描述
抽象类描述事物的信息有可能不足
2,一般类中不能定义抽象类方法,只能定非抽象方法。
抽象类中可以定义抽象方法,同时也可以定义非抽象方法
3,一般类可以被实例化。
抽象类不可以被实例化。
5,抽象类一定是一个父类吗?
是的。因为需要子类覆盖其方法后才可以对子类实例化。
抽象类——练习
雇员实例:
需求:公司中程序员有姓名,工号,薪水,工作内容
项目经理除了有姓名,工号,薪水,还有奖金,工作内容
对给出需求进行数据建模。
分析:
这个问题领域中,先找出涉及的对象。通过名称提炼法。
程序员:
属性:姓名,工号,薪水
行为:工作
经理:
属性:姓名,工号,薪水,奖金
行为:工作
程序员和经理不存在直接继承关系。
但是程序员和经理却具有共性内容。可以进行抽取。因为他们都是公司的雇员。
可以将程序员和经理进行抽取,建立体系。
//描述雇员
abstract class Employee{
private String name;
private String id;
private double pay;
Empioyee(String name,String id, double pay){
this.name=name;
this.id=id;
this.pay=pay;
}
public abstract void work();
}
//描述程序员
class Proqrammr extends Employee(
Proqrammr(String name,String id,double pay;){
super(name,id,pay)
}
publid void work();{
System.out.println("code...");
}
)
//描述经理
class Manager extends Employee{
private int bonus;
Manager(String name,String id,double pay,int bouns){
super(name, id , pay)
this.bouns=bouns;
}
public void work();{
System.out.println("managa");
}
}
class AbstractTest{
public static void main(String[] args){
System.out.println("Hello World");
}
}