-
类的修饰符有三个: final, public, 什么都不写
(内部类可以被private所修饰) -
final:最终,最为一个修饰符
- 可以修饰类,函数,变量
- 被final修饰的类不可以被继承,是为了避免被继承,被子类复写功能
- 被final修饰的方法不可以被复写。
- 被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量买也可以修饰局部变量。
当在描述事物是,一些数据的出现值是固定的,那么这是为了增强阅读性,都给这些值起一个名字,方便与阅读。
而这个值不需要改变,所以加上final修饰,作为常量没常量的书写规范:所有有的字母都大写,如果由多个单词组成,单词间可以通过_
链接。
public final static double double MY_PI = 3.141592653
- 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
-
抽象类:
当多个类中出现相同功能,但是功能主题不同。
这也是进行向上抽取,这时只抽取功能定义,而不抽取功能的主体。
抽象类的特点:(抽取所有子类的公共特点)
- 抽象方法一定定义在抽象类中
- 抽象方法和抽象类都必须要被
abstract
关键字修饰 - 抽象类不可以用new创建对象,因为调用抽象方法没有意义。(抽象类不能被实例化)
- 抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物出现了一些不确定的东西。
这些不确定的部分,也就是该事物的功能,需要明确出现,但是无法定义主体。通过抽象方法来表示。
抽象类比一般类多个抽象函数。就是在类中可以定义抽象方法。
抽象类不可以实例化。
抽象类可以不定义抽象方法,这样做仅仅是不让该类建立对象。
示例:假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性:姓名、工号以及工资。经理也是员工迈出了含有工资的属性外,另外还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中必须提供必要的方法进行属性访问。
员工类:name, id, pay
经理类:继承员工,并有自己特有的bonus.
public abstract class Employee {
private String name;
private String id;
private double pay;
Employee(String name,String id, double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public double getPay() {
return pay;
}
public void setPay(double pay) {
this.pay = pay;
}
public abstract void work();
}
class Manager extends Employee
{
private int bonus;
Manager(String name, String id,double pay,int bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public int getBonus() {
return bonus;
}
public void setBonus(int bonus) {
this.bonus = bonus;
}
public void work()
{
System.out.println("manager work!!!");
}
}
class Pro extends Employee
{
Pro(String name, String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("manager work!!!");
}
}
抽象关键字abstract不可以和哪些关键字共存?
final,private
抽象类是否有构造函数?
可以有,不能实例化,一般是无参构造函数,让子类调用
抽象类中可不可以没有抽象方法?
可以
- 模板方法设计模式
定义:在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分,那么这时候就将不确定的部分暴露出去,由该类的子类去完成。
获取一段程序的运行时间。(但是程序不确定就可以用模板设计模式)
public abstract class GetTime {
public final void getTime() //不可以被子类复写
{
long start = System.currentTimeMillis();
runcode();
long end = System.currentTimeMillis();
System.out.println();
System.out.println("毫秒:" + (end - start));
}
public abstract void runcode(); //不一定要抽象,但是是可以被覆盖的代码。
}
class SubTime extends GetTime
{
public void runcode()
{
for(int i = 0; i < 4000; i++)
System.out.print(i);
}
}
class GettTimeDemo
{
public static void main(String[] args) {
SubTime st = new SubTime();
st.getTime();
}
}
-
接口
接口:初期理解,可以认为是一个特殊的抽象类
当抽象类中的方法都是抽象的,那么该类可以同构接口的形式来表示。
class用于定义类。
interface 用于定义接口。
接口定义时,格式特定:- 接口中常见定义:常量,抽象方法。
- 接口中的成员都有固定修饰符。
常量:public static final
方法:public abstract
void show();
该方法要么是接口类的方法(自动补充上public abstract),要么是抽象类。
记住:接口中的成员都是public的。
接口:是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部都被覆盖后,子类才可以实例化,否则子类也是一个抽象类。
interface Inter //interface是特殊的class
{
public static final int NUM = 3;
public abstract void show();
}
class Test implements Inter
{
public void show()
{
}
}
class InterfaceDemo {
public static void main(String[] args) {
Test t = new Test();
System.out.println(t.NUM); //三种调用方法都可以。
System.out.println(Test.NUM);
System.out.println(Inter.NUM);
}
}
接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。
interface A
{
}
interface B
{
}
class c implements A,B //具体的抽象方法只实现一个
{
}
类与类之间是(单)继承关系,类与接口之间是实现关系,接口与接口之间是(多)继承关系。
接口是对外暴露的规则,程序的功能扩展,用来多实现的。
继承是体系(基类是子类所共有的特点,接口是子类扩展时特有的特点。