Java注解(Annotations)基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shaoyedeboke/article/details/88219466

1、注解能做什么?

           源码:在源代码上做注释,生成文档注释

           编译:编译时候检查代码错误和警告

            JVM:可以利用Annotations生成代码,XML文件等

2、注解的使用

            @注解名称(属性名=属性值,属性名={属性值1,属性值2,.......},.........)

             在一个类元素上可以放置多个注解,每个注解占用一行

             可以重复使用同一个注解

package java注解;

import java.util.ArrayList;
import java.util.List;

public class AnnotationTest extends java.lang.Object{
	
	@Override     //覆盖,重写【错误检查】
	@SuppressWarnings({ "unused", "rawtypes" })  //压制警告
	public String toString() {
		// TODO 自动生成的方法存根
		
		List list=new ArrayList();
		String name="king";
		//System.out.print(name);
		String age="15";
		
		return super.toString();
	}
	
	public static void main(String[] args) {
		
	}
}

使用eclipse的小技巧(快捷键):

                               .Alt+?   方法补全

                                Ctrl+Shift+O     导入需要的jre 包

                                 F11        保存好后可直接运行

3、预定义注解

                       @Deprecated      //未来可能会舍弃的变量、方法、函数等

package 预定义注解;

public class TestDeprecated {
	
	 public static void main(String[] args) {
		
		Caculator caculator=new Caculator();
		double result=caculator.caculate(5);
		System.out.print(result);
	}
}

class Caculator{
	
	@Deprecated     //未来可能会舍弃变量PI
	public final static double PI=3.1415926;
	
	@Deprecated      //未来可能会舍弃方法caculate
	public double caculate(double radius) {
		
		return PI*radius*radius;
	}
}

                        @Override      子类继承父类时,方法的覆盖、重写检查

package 预定义注解;

public class TestOverride extends java.lang.Object{
    
	
	@Override       //方法的重写  检查
	public String toString() {
		// TODO 自动生成的方法存根
		
		
		return super.toString();
	}
	public static void main(String[] args) {
		
	}
}

class Bycle{
	
	int speed;
	void speedUp() {
		speed++;
	}
}

class MountainBycle extends Bycle{
	@Override
	void speedUp() {     //方法的重写  检查
		this.speed=(speed++)*2;
	}
	
}

                   @SuppressWarnings   :压制警告信息,变量名(value,可省略)

package 预定义注解;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class TestSuppressWarnings {
	
	
	@SuppressWarnings({ "deprecation", "unused", "rawtypes", "unchecked"})  //压制警告
	public static void main(String[] args) {
		
		Date now =new Date();
		int year=now.getYear();
		
		// 方法一: List<String> list=new ArrayList<String>();
		List list =new ArrayList<>();
		
		list.add("king"); //类型安全:方法 add(Object)属于原始类型 List。应该将对通用类型 List<E> 的引用参数化  
		                 //  方法二: @SuppressWarnings( "unchecked")
	}

}

                    @SafeVarargs     注释可变长参数,压制警告

//方法重载来实现
	public static void printPameter(int a) {
		
		System.out.println(a);
	}
	
	public static void printPameter(int a,int b)
	{
		
		System.out.println(a);
		System.out.println(b);
	}
	//可变长参数来实现
	public static void printPameter(int...a) {  //使用  (数据类型...变量名)
		
		for(int i:a) {   
     //			这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
     //			foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。
     //			foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。
     //			foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){    引用了x的java语句;  }
			
			System.out.println(i);
		}
	}
//使用泛型T,来实现可变长参数化
	
	@SafeVarargs   //去掉参数a上的警告
	public static <T> void printPameter(T...a) {  //内部使用泛型时,在返回值上加上  <T>
		
		for(T i:a) {
			
			System.out.println(i);
		}	
	}

                  @FunctionalInterface   ;压制"非功能接口"

//使用 实现接口 来完成
package 预定义注解;

public class TestFunctionalInterface {
	
	private Greet greet;
	
	public TestFunctionalInterface(Greet greet) {
		
		this.greet=greet;
	}
	
	public static void main(String[] args) {
		
		Greet greet=new MyGreet();
		TestFunctionalInterface test=new TestFunctionalInterface(greet);
		test.greet.greeting("shaohang");
	}
}

interface Greet{
	
	public void greeting(String name);
}


class MyGreet implements Greet{
	
	@Override
	public void greeting(String name) {
		// TODO 自动生成的方法存根
		
		System.out.println("早上好:"+name);
		
	}
}
//使用 匿名内部类 实现
package 预定义注解;

public class TestFunctionalInterface {
	
	private Greet greet;
	
	public TestFunctionalInterface(Greet greet) {
		
		this.greet=greet;
	}
	
	public static void main(String[] args) {
		
		TestFunctionalInterface test=new TestFunctionalInterface(new Greet() {
			
			@Override
			public void greeting(String name) {
				// TODO 自动生成的方法存根
				
				System.out.println("早上好:"+name);
				
			}
			
		});
		test.greet.greeting("shaohang");
	}
}

interface Greet{
	
	public void greeting(String name);
}

//当接口有多个方法时,使用 @FunctionalInterface 解决
package 预定义注解;
    
public class TestFunctionalInterface {
	
	private Greet greet;
	
	public TestFunctionalInterface(Greet greet) {
		
		this.greet=greet;
	}
	
	public static void main(String[] args) {
		
		TestFunctionalInterface test=new TestFunctionalInterface((String name)->System.out.println("早上好:"+name));
		test.greet.greeting("tom");
	}
}   
   

//功能接口:只能有一个方法的接口,若出现两个以上的方法,用 @FunctionalInterface 压制
@FunctionalInterface
interface Greet{
	
	public void greeting(String name);
	public void greetings(String name);
}

4、自定义注解:

          语法格式:

                          public | default  @interface    注解名称 {

                              属性类型   属性名()  default  默认值;

                          }

          例子:

//自定义注解,起到注释作用
package 自定义注解;

public @interface MyAnnotation {
	
	String author();
	String date();
	String lastModified() default  "N/A";
	String lastModifiedBy() default "N/A";
	String[] revievers();
	String value();
}

5、元注解:  定义注解的注解(约束和显示其他注解的注解)

                 反射读取注解:得到Class类中的class实例,就相当于得到了class文件,——.>就可以得到A.class中所有的内容(包括私有属性,方法,构造器,父类,子类,实现的接口,以及定义的注解等)

猜你喜欢

转载自blog.csdn.net/shaoyedeboke/article/details/88219466