抽象类
抽象类的概念
抽象就是将拥有共同方法和属性的对象提取出来,提取后,重新设计一个更加通用、更加大众化的类,这个类称为抽象类。
抽象类就是指具有共同特性的类,通过关键字“abstract”表示。这些抽象类只是定义了共同特性的方法和属性,但是没有具体实现共同特性的方法。
抽象类不能被实例化,即不能使用关键字“new”来生成实例对象,但可以声明一个抽象类的变量指向具体子类的对象。
抽象类的好处在于,当有的方法在父类中不想实现时,可以不用实现。
抽象类的实例
//创建一个名为school抽象类
abstract class school{
//创建成员变量
String schoolname;
String classname;
String location;
//通过设置器来设置学校名称班级名称
public void setschoolname(String schoolname)
{
this .schoolname=schoolname;
}
public void setclassname(String classname){
this.classname=classname;
}
//通过设置器来设置学校名称班级名称
public String getschoolname(){
re七urn schoolname;
}
public String getclassname(){
return classname;
}
//设计抽象方法
abstract void setlocation(Striag location);
abstract Striag getlocation();
//重写tostring()方法
public String tostring()(
String infor=‘’学校名称:“+schoolname十‘’;”十””+”班级名称‘’十classname;
return infor;
}
}
抽象与接口的区别
接口和抽象在很多方面相似,下面列出其共同点:
都不能创建实例对象,因为它们都是抽象的。
虽然不能直接通过关键字“new”创建对象实例,但可以声明变量,通过变量指向子类或实现类的对象,来创建对象实例。
两者的不同点如下:
Java不支持多重继承,即一个子类只能有一个父类,但一个子类可以实现多个接口
接口内不能有实例字段,只能有静态变量,抽象类可以拥有实例字段。
接口内方法自动设置为“public”的,抽象类中的方法必须手动声明访问控制符。
枚举
枚举的实现原理
在具体编写的项目中,如何定义星期几或性别的变量呢?对于星期一到星期天,有些程序员用1一7表示,也有些程序员用0--6表示。当一个程序员开发项目时,关于星期变量值为任何形式的值都可以。但是当多个程序员共同开发项日时,如果不把关于星期变量的值统一起来则会报错。
为了解决上述问题,可以使用枚举。枚举的最大作用就是让某种类型的变量的取值只能为若干个固定值中的一个,否则编译器将报错。为了能够深刻理解关于枚举的作用,下面将通过普通类来实现枚举的功能。
public class WeekDay{
private WeekDay(){ //私有构造函数
}
//定义关于星期的静态变量
public final static WeekDay SUN=new WeekDay();//星期日常量
public final static WeekDay MON=new WeekDay();//星期一常量
public final static WeekDay TUE=new WeekDay();//星期二常量
public final static WeekDay WED=new WeekDay();//星期三常量
public final static WeekDay THU=new WeekDay();//星期四常量
public final static WeekDay FN=new WeekDay();//星期五常量
public final static WeekDay SAT=new WeekDay();//星期六常量
//获取下一天的方法
public WeekDay nextDay(){
if(this==SUN){
return MON;
}else if(this==MON){
return TUE;
}else if(this==TUE){
return WED;
)else if(this==WED){
return THU;
}else if(this=二THU)(
return FN;
}else if(this==FN){
return SAT;
}else{
return SUN;
}
}
//重载toString()方法
public String toString(){
if(this==SUN){
return ”星期日”;
}else if(this ==MON){
return "星期一";
}else if(this ==TUE){
return "星期二";
}else if(this ==WED){
return "星期三 ";
}else if(this ==THU){
return "星期四";
}else if(this ==FN){
return "星期五";
}else
return”星期六
}
}
用法
public class VirualEnumTest{
public static void main(String[]args){
WeekDay today=WeekDay.SAT;//today变量
System.out.println(today+”的下一天是”+today.nextDay()); //输出今天的下一天
}
}
反射
所谓反射(Reflection ),其实就是程序自己能够检查自身信自、,就像人会通过镜子反光来查看自己本身一样。反射使得Java语言具有r‘动态性”,即程序首先会检查某个类中的方法、属性等信息,然后再动态地调用或动态地创建该类或该类的对象。
反射的基石
Class类。注意这是大写的Class,而不是小写class
该类用来描述了java中的一切类事物,该类描述了关于类事务的类名字、类的访问属性、类所属于的包名、字段名称的列表、方法名称的列表等。例如Class类的getName()方法可以获取所描述类的类名。
反射的基本应用
所谓反射就是把Java类中的各种成分映射成相应的Java类。通过反射在具体编写程序时不仅可以动态地生成关于某个类中所需要的成员,而且还能动态地调用相应的成员。查看API帮助文档,可以发现不仅一个Java类可以用类Class的对象表示,而且Java类的各种成员:成员变量、方法、构造方法、包等也可以用相应的Java类表示。
反射一般会涉及如下类:Class(表示一个类的类)、Field(表示属性的类)、Method(表示方法的类)和Constrctor(表示类的构造方法的类)。那么如何获取关于这些类(除了class类)的对象呢?通过查看API帮助文档,可以发现Class类里存在一系列的方法来获取相关类中的变量、方法、构造方法、包等信息。
具体的应用场景可以看一下这几篇文章:
标注
标注的简单使用
当使用myeclipse开发时,每当自动重写一个方法时总会在重写的方法上边自动加上一行代码“@override”。其中@override就是一个标注。现在越来越多的框架支持更多丰富的标注。
泛型
我们在 java的API文档中会看到类似于 Vector, ArrayList 这样的描述,这里E就是泛型。
所谓的泛型就是一个占位符代表,代表一个参数的类型。
为什么要使用泛型
比如Vector使用时, 既可以初始化为 Vector 也可以定义为 Vector。它可以代表多种数据类型。所以用E泛型来代表。