Final关键字
Final关键字可以修饰类、变量和函数。
Final类
被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。
Final方法
被final修饰的方法不可以被复写。
常量
被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量也可以修饰局部变量。
当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。而这个值不需要改变,所以加上final修饰,作为常量。常量的书写规范所有字母均大写,如果由多个单词组成,单词间通过_连接。
class A
{
//final double PI; //非法,因为没有给常量指定值
final double PI = 3.14;
public double getArea(final double r)
{
r = 89; // 非法,因为不允许再改变r的值
return PI*r*r;
}
public final void speak()
{
System.out.println("hello");
}
}
class B extends A
{
/*非法,不能重写speak方法
public void speak()
{
System.out.println("您好");
}
*/
}
public class Example
{
public static void main(String args[])
{
B b = new B();
System.out.println(b.getArea(100));
b.speak();
}
}
Abstract类和方法
抽象类的特点:
1.抽象方法一定在抽象类中。
2.抽象方法和抽象类都必须被abstract关键字修饰。
3.抽象类不可以用new创建对象,因为调用抽象方法没意义。
4.抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
public abstract class 机动车
{
abstract void 启动();
abstract void 加速();
abstract void 刹车();
}
public class 手动档轿车 extends 机动车
{
void 启动()
{
System.out.println("踏下离合器,换到一档");
System.out.println("然后慢慢抬起离合器");
}
void 加速()
{
System.out.println("踩油门");
}
void 刹车()
{
System.out.println("踏下离合器,踏下刹车板");
System.out.println("将档位换到一档");
}
}
public class 自动档轿车 extends 机动车
{
void 启动()
{
System.out.println("使用前进挡");
System.out.println("然后轻踩油门");
}
void 加速()
{
System.out.println("踩油门");
}
void 刹车()
{
System.out.println("踏下刹车板");
}
}
public class Example
{
public static void main(String args[])
{
机动车 car = new 手动档轿车(); //向上转型
car.启动();
car.加速();
car.刹车();
car = new 自动档轿车();
car.启动();car.加速();
car.刹车();
}
}
}
结果为:
踏下离合器,换到一档
然后慢慢抬起离合器
踩油门
踏下离合器,踏下刹车板
将档位换到一档
使用前进挡
然后轻踩油门
踩油门
踏下刹车板
模版方法:
在定义功能时,功能的一部分是确定的,但有一部分是不确定的,而确定的部分在使用不确定的部分,那么这时就将不确定的部分暴露出去,由该类的子类完成。
abstract class GetTime
{
public final void getTime() //不允许复写此方法
{
long start = System.currentTimeMillis(); //获取当前时间
runcode();
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();
}
class SubTime extends GetTime
{
public void runcode()
{
for(int x = 0;x < 1000;x++)
{
System.out.print(x);
}
}
}
public class TemplateDemo {
public static void main(String args[])
{
SubTime sb = new SubTime();
sb.getTime();
}
}