黑马程序员------面向对象(No.5)(final、抽象类)

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ---------------------- 

 

微笑final:最终,作为一个修饰符。

 

1.可以修饰类,函数,变量。

2.被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。

3.被final修饰的方法不可以被重写。

4.被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,又可以修饰局部变量。

当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字。方便阅读。

当这个值不需改变,所以加上final修饰作为常量,常量的书写规范是所有字母都大写,多个单词要用_连接。

5.内部类定义在类中的局部位置上,只能访问该局部被final修饰的局部变量。

class Demo{
	final int x = 3;
	public static final double MY_PI = 3.14;
	final void show(){
	}
}
class SubDemo extends Demo{
	//void show(); 编译出错
}
class FinalDemo{
	public static void main(String[] args){
	}
}

 


微笑抽象类。

 

当多个类中出现相同功能,但功能主体不同,可以进行向上抽取,这时只抽取功能定义,而不抽取功能主体。

 

抽象类的特点:

1.抽象方法一定在抽象类中;

2.抽象方法和抽象类必须被abstract关键字修饰;

3.抽象类不可以用new创建对象,因为调用抽象方法没有意义。

4.抽象类中抽象方法要被使用,必须由子类重写所有的抽象方法,建立子类对象调用。

   如果子类只覆盖了部分抽象方法,那么子类还是一个抽象类。

/*
当多个类中出现相同功能,但是功能主体不同,可以进行向上抽取;
这时,只抽取功能定义,而不抽取功能主体。

抽象类,抽象类中抽象方法要被使用,必须由子类重写所有的抽象方法,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么子类还是一个抽象类。
*/
abstract class Student{
	abstract void study();
	abstract void study2();
}
class BaseStudent extends Student{
	void study(){
		System.out.println("BaseStudent");
	}
	void study2(){}
}
class AdvStudent extends Student{
	void study(){
		System.out.println("AdvStudent");
	}
	void study2(){}
}
class AbstractDemo{
	public static void main(String[] args){
		new BaseStudent().study();
	}
}

抽象类与一般类区别:

抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体。通过抽象方法表示。


1.抽象类多了抽象方法,就是在类中可以定义抽象方法。
2.抽象类不能实例化。

 

特殊:
抽象类中,可以不定义抽象方法,这样做仅仅是不让该类建立对象。

/*
抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。
这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体。通过抽象方法表示。
*/
abstract class Student{
	abstract void study();
	abstract void study2();
	void sleep(){
		System.out.println("sleep");
	}
}
class BaseStudent extends Student{
	void study(){
		System.out.println("BaseStudent");
	}
	void study2(){}
}
class AdvStudent extends Student{
	void study(){
		System.out.println("AdvStudent");
	}
	void study2(){}
}
class AbstractDemo{
	public static void main(String[] args){
		new BaseStudent().study();//输出BaseStudent
		new BaseStudent().sleep();//输出sleep
	}
}


什么是模版方法呢?

 

在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定部分在使用不确定的部分,那么这时就将不确定的部分暴漏出去 。由该类的子类去完成。

/*
需求:获取一段程序运行的时间。
原理:获取程序开始和结束的时间并相减
*/
abstract class GetTime{
	//不允许子类重写final。
	public final void getTime(){
		long start = System.currentTimeMillis();
		runcode();
		long end = System.currentTimeMillis();
		System.out.println("time:"+(end-start));
	}
	public abstract void runcode();
}
class SubTime extends GetTime{
	public void runcode(){
		for(int i = 0;i<100;i++)
			System.out.print(i);
		System.out.println();
	}
}
class TemplateDemo{
	public static void main(String[] args){
		SubTime t = new SubTime();
		t.getTime();
	}
}


 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ---------------------- 

详情请查看:http://edu.csdn.net

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值