只有经过地狱般的磨练,才能炼出创造天堂的力量。只有流过血的手指,才能弹奏出世间的绝唱。 一一泰戈尔
Annotation(注解)
JDK1.5之后提出的一个新的开发技术,利用Annotation可以有效的减少程序配置的代码,并且可以利用Annotation进行一些结构化的定义,Annotation是一种注解的形式实现的程序开发。
- 引入配置文件,在文件之中定义全部要使用的服务器资源;在配置项不多的情况下很好用,但可能会出现配置文件爆多的情况并且如果所有的操作都需要通过配置文件完成,这样对于开发的难度提升了
- 将配置信息重新写回程序里面,可以利用一些特殊的标记与程序代码进行分离,但如果全部使用注解开发,难度又太高了,所以对于程序是配置文件+注解的形式开发的。
准确覆写
如果忘记写extends或者是覆写的方法名错误,会导致覆写失败,所以就引出了准确覆写。
@Override:主要是帮助开发者在程序编译的时候可以检查出程序的错误
class Parent {
public void out() {
System.out.println("这是父类的方法");
}
}
class child extends parent {
@Override
public void out() {
//如果准备覆写的方法名“out”,写错了,那么会由于加了Override的缘故,提示覆写错误,而不是把它当一个新的方法处理
System.out.println("子类覆写后的方法");
}
}
public class JavaDome {
public static void main(String agrs[]) {
new child().out();
}
}
过期声明
在一个软件项目开发过程之中,由于最初设计不得当,导致新版本应用汇有不适应的地方(老版本无影响),这时采用过期声明告诉新用户这些操作不要再用了,老用户依旧可以使用。
@Deprecated:产生提示信息,告诉新用户这些操作不再有用
public Newwork {
@Deprecated
public void connect() {
System.out.println("老操作");
}
public String connection() {
return "新操作";
}
}
public class JavaDome {
public static void main(String agrs[]) {
new Newwork().connect();
//在编译后会出现“注:JavaDemo.java使用或覆盖了已过时的API。有关详细信息,请使用-Xlint:deprecation重新编译”
}//程序依旧可以执行,并输出“老操作”
}
压制警告
以上面的程序为例,编译后会出现,操作过时的提示,这个时候,如果已知这个信息,或者是不想看到这个提示,就可以使用压制警告来处理。
@SuppressWarnings:压制警告提示
public Newwork {
@Deprecated
public void connect() {
System.out.println("老操作");
}
public String connection() {
return "新操作";
}
}
public class JavaDome {
@SuppressWarnings({
{
"deprecation"})//在编译后就不会出现上一个例子的提示信息
public static void main(String agrs[]) {
new Newwork().connect();
}//程序正常执行,并输出“老操作”
}
Java的多态性
多态是在继承的基础上扩展出来的概念。
- 方法的多态性:方法的重载和方法的覆写 (在之前的博客中有介绍)
- 对象的多态性:父子实例之间的转换处理,有两种模式。
- 向上转型:父类 父类实例 = 子类实例;(自动转化)
- 向下转型:子类 子类实例 = (子类) 父类实例;(强制转化)
对象向上转型
主要特点在于对参数进行统一的设计:
class Message {
public void print() {
System.out.println("Mysql数据库连接信息......")
}
}
class DataBaseMessage extends Message {
public void print() {
System.out.println("Oracle数据库连接信息......") ;
}
class WebServerMessage extends Message {
public void print() {
System.out.println("WEB服务器连接信息....") ;
}
}
public class JavaDemo {
public static void main (String args[]) {
/*Message msg = new DataBaseMessage () ; //向上转型
msg.print() ;//打印输出:“Oracle数据库连接信息......”*/
fun(new DataBaseMessage());
fun(new WebServerMessage());
//打印输出:“Oracle数据库连接信息......”和“WEB服务器连接信息....”
}
public Static void fun(Message msg) {
//通过一个参数完成不同子类的实例化,这就是利用了对象的向上转型
msg.print();
}
}
对象向下转型
主要特点在于需要使用子类自己特殊的定义处理
但向下转型并不安全
class Person {
public void print() {
System.out.println("一个正常的人类行为,吃饭、睡觉、打豆豆。");
}
class SuperMan extends Person {
public String fly() {
return "我可以飞。";
}
public String fire() {
return "我可以喷火。。。"
}
}
public class JavaDemo {
public static void main (String args []) {
System.out.println("正常情况下");
Preson per = SuperMan();//向上转型,是个普通人
per.print();
System.out.println("当外星人袭击");
SuperMan man = (SuperMan) per ;//向下转型,变身超人
System.out.println(man.fly());
System.out.println(man.fire());
/*在向下转型之前一定要进行向上转型
System.out.println("正常情况下");
Preson per = Person();//不转型,是个普通人
per.print();
System.out.println("当外星人袭击");
SuperMan man = (SuperMan) per ;//向下转型,但此时SuperMan与Person并没有联系,然后会出现“ClassCastException” 异常。不能变成超人
*/
}
}
instanceof关键字
上面分析了向下转型的安全性,所以需要在进行转型之前进行判断,判断某个实例是否是某个类的对象,这就需要通过instanceof语法实现:
对象 instanceof 类
该判断将返回一个boolean类型,如果是true表示实例是指定类对象,所以在开发过程中,一般在向下转型时先使用instanceof进行判断
class Person {
public void print() {
System.out.println("一个正常的人类行为,吃饭、睡觉、打豆豆。");
}
class SuperMan extends Person {
public String fly() {
return "我可以飞。";
}
public String fire() {
return "我可以喷火。。。"
}
}
public class JavaDemo {
public static void main (String args []) {
Person per = new Person();//不转型
System.out.println(per instanceof Person);//打印true
System.out.println(per instanceof SuperMan);//打印false
}
}