Final Abstract

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();
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值