Core Java(十三)

 
Java API5.0新特性:
优化的功能:对编译器进行的优化
静态引入:
什么是静态引入?将类的静态成员预先引用进来,直接使用就可以了,例如:System.out,直接写成out.printl();就可以了
语法:
        import static 包名.类名.静态成员名
/**
 * 知识点:
 * staticimport:静态引入
 * 程序目标:
 * 测试静态引入的用法
 */
package MY.module12.staticimport;
import static java.lang.Math.*;
import static java.lang.System.out;
public class Test1 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              System.out.println(Math.abs(-21.57));
              out.println(abs(-30.57));
       }
 
}
注意事项:
        import同名冲突
/**
 * 知识点:
 * 静态引入的注意点:同名静态成员使用冲突
 * 程序目标:
 * 测试同名静态成员使用冲突
 */
package MY.module12.staticimport;
import static java.lang.Integer.*;
import static java.lang.Long.*;
public class Test2 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
//          System.out.println(MAX_VALUE);
//          System.out.println(MAX_VALUE);//冲突
              System.out.println(Integer.MAX_VALUE);
              System.out.println(Long.MAX_VALUE);
       }
 
}
自动封箱/解箱:Auto-boxing/unboxing
将基本数据类型与Wrapper class做自动转换。
可直接把基本数据类型与Wrapper class做算术运算
/**
 * 知识点:
 * autoboxing/unboxing
 * 程序目标:
 * 测试autoboxing/unboxing的功能
 */
package MY.module12.autoboxing;
 
public class Test1 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Integer i1=1;//autoboxing
              int a=i1;//unboxing
              int sum=i1+a;//可直接把基本数据类型与Wrapper class做算术运算
       }
 
}
在容器中体现自动装箱解箱:
/**
 * 知识点:
 * 自动封箱
 * 程序目标:
 * 测试在容器中直接添加基本类型数据,体现封箱的特点
 */
package MY.module12.autoboxing;
import java.util.*;
public class Test2 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List list=new ArrayList();
              //list只能添加对象,基本数据类型不行,在这里,1自动装箱为包装类
              //的对象
              list.add(1);
              list.add(2);
              System.out.println(list);
       }
 
}
当调用一个方法并且传参数时,在方法重载的时候,先找同类型的参数方法,如果没有,找比它大的参数类型,如果还没有,找包装类型的参数,三次:
1.一样的
2.比自己大的
3.相对应的包装类型
/**
 * 知识点:
 * Autoboxing/unboxing
 * 程序目标:
 * 当方法重载的时候,调用的情况
 */
package MY.module12.autoboxing;
import static java.lang.System.*;
public class Test3 {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              int i=10;
              Integer i2=100;
              f1(i);
              f1(i2);
       }
       public static void f1(char i){
              out.println("long's"+i);
       }
       public static void f1(Integer i){
              out.println("int's"+i);
       }
 
}
for-each循环:
语法:for(集合元素类型 变量名: 集合)
/**
 * 知识点:
 * for-each循环
 * 程序目标:
 * 使用for-each循环将list中的对象显示出来
 */
package MY.module12.foreach;
import java.util.*;
import static java.lang.System.*;
public class TestForeach {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List list=new ArrayList();
              list.add("hello");
              list.add("world");
              for(Object obj:list){
                     out.println(obj);
              }
       }
 
}
 
可变长参数:varags
什么意思?在方法中参数的个数可以不确定
       使用注意:
              vargas参数的声明必须是所有参数声明的最后一个
              一个方法的声明中,只能有一个vargas
              在重载时,不能与数组并存
/**
 * 知识点:
 * 可变长参数varags
 * 程序目标:
 * 测试可变长参数
 */
package MY.module12.varags;
import static java.lang.System.*;
public class TestVarags {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              int sum=f2(1,2,3,4,5);
              out.println(sum);
              String s=f1("hello","world");
              out.print(s);
       }
       public static String f1(String...s){
              out.println(s.length);
              String str="";
              for(String x:s){
                     str+=x;
              }
              return str;
       }
      
       public static int f2(int...i){
              int length=i.length;
              int sum=0;
              out.println(length);
              for(int a:i){
                     sum+=a;
              }
              return sum;
       }
       //如果有了varags,在重载方法中,就不能使用数组了,因为代表的是
       //一个意思
//   public static int f2(int[] i){
//          return 0;
//   }
 
}
 
泛型:
什么是泛型?
是一种数据类型,这个类型是不确定的,也可以指定类型,不确定是说可以参数化的,又叫参数化类型
语法:
       类型变量<占位符或者指定类型>
有什么用呢?
增强了类型安全,例如:list是可以加入任何类型的对象的,但是我们有时候需要他加入特定类型的对象,这个时候我们就可以使用泛型
/**
 * Java文件说明:
 * Car.java:汽车类,有颜色属性
 * Color.java:给汽车设置颜色的类,有三种颜色
 * Test.java:得到汽车,给汽车着色,但是上色的范围只能是这三个颜色,并且只能
 * 通过Color类给汽车上色
 * 发现问题:
 * 不能满足程序的目标,参数的类型不安全
 */
package MY.module12.Fanxing.yinli;
 
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Car car=new Car();
              car.setColor(Color.Blue);
              car.setColor("red");//参数类型不安全,我只希望设置Color类中的值,然而不能实现这一要求
       }
 
}
package MY.module12.Fanxing.yinli;
 
public class Car {
       private String Color;
 
       public String getColor() {
              return Color;
       }
 
       public void setColor(String color) {
              Color = color;
       }
      
}
package MY.module12.Fanxing.yinli;
 
public class Color {
        static String Blue="1";
        static String Red="2";
        static String GREEN="3";
}
 
/**
 * 程序目标:
 * People.java:有个属性:姓名
 * Car.java:有个属性:大小
 * Test.java:把People的对象放到List容器中,List不应该再放其他的类型对象了
 * 发现问题:
 * list本身是没有对象类型的限制的,所以,当我们想让这个容器只能添加一个
 * 类型的对象的时候,处理起来比较麻烦,不合理,那么应该怎么解决这个问题呢?
 */
package MY.module12.Fanxing.yinli2;
import java.util.*;
import static java.lang.System.*;
public class Test {
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List list=new ArrayList();
              list.add(new People("zhang san"));
              list.add(new People("li si"));
              list.add(new Car(10));
             
              Iterator iterator=list.iterator();
              while(iterator.hasNext()){
                     People p=(People)iterator.next();//结果会出现异常
                     //因为里面有一个Car类的对象,这样不符合要求,我只想这个容器
                     //加入People类对象,现在这种情况是类型不安全的
                     out.println(p.getName());
              }
       }
 
}
package MY.module12.Fanxing.yinli2;
 
public class Car {
       private int size;
 
       public Car(int size) {
              super();
              // TODO Auto-generated constructor stub
              this.size = size;
       }
 
       public int getSize() {
              return size;
       }
 
       public void setSize(int size) {
              this.size = size;
       }
      
}
package MY.module12.Fanxing.yinli2;
 
public class People {
       private String name;
 
       public People(String name) {
              super();
              // TODO Auto-generated constructor stub
              this.name = name;
       }
 
       public String getName() {
              return name;
       }
 
       public void setName(String name) {
              this.name = name;
       }
      
}
通过泛型我们可以解决类型安全的问题:
/**
 * 知识点:
 * 参数化类型
 * 程序目标:
 * 只能让List加入指定的People对象
 */
package MY.module12.Fanxing.yinli2;
import java.util.*;
public class Test1 {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List<People> list=new ArrayList();
              People p1=new People("zhang san");
              People p2=new People("li si");
              Car car=new Car(1000);
              list.add(p1);
              list.add(p2);
//          list.add(car);只能添加参数化的类型People
              System.out.println(list.get(0).getName());
             
              People p=list.get(1);
              System.out.println(p.getName());
             
              Iterator<People> it=list.iterator();//要想得到对象,必须也参数化list中的参数化类型
              while(it.hasNext()){
                     People pp=it.next();
                     System.out.println(pp.getName());
              }
             
              for(People ppp:list){
                     System.out.println(ppp.getName());
              }
       }
 
}
多个占位符:
/**
 * 知识点:
 * 多个占位符
 * Java文件说明:
 * People.java,Car.java,Test2.java
 * 程序目标:
 * 使用有多个占位符的类型变量
 */
package MY.module12.Fanxing.yinli2;
import java.util.*;
import static java.lang.System.*;
public class Test2 {
      
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Map<Integer,People> map=new HashMap<Integer,People>();//也可以在HashMap后面写上
              map.put(1,new People("yuchen"));
//          map.put("hello",new People("lisi"));
//          map.put(2,new Car(10));
              People p=map.get(1);
              out.println(p.getName());
       }
 
}
 
 
                     小结:
                     (1)泛型是一种带占位符的类型,使用时
                            提供实际参数(参数化类型)。
                     (2)泛型类型解决了类型安全问题
                            如:在将数据放入Collection时,
                            通过泛型类型的声明,确保只有
                            同一类型的对象会加入到容器中,
                            在取出时,不用做类型的转换
                     (3)泛型不能使用基本类型
                            如:Set<char>或者List<int>
泛型也可以充当一个占位符,可以被参数化:
package MY.module12.Fanxing.yinli2;
import static java.lang.System.*;
import java.util.*;
public class Test3 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List<People> list=new ArrayList();
              list.add(new People("zhang san"));
              list.add(new People("li si"));
             
              List<Car> list2=new ArrayList<Car>();
              list2.add(new Car(3));
              list2.add(new Car(5));
             
              Map<Integer,List<People>> map=new HashMap<Integer,List<People>>();
//          map.put(1,list2);
              map.put(1,list);
             
//          List list3=map.get(1);如果写成这样,for-each循环中报错
              //因为,list3中得到的对象都是People类型的,list3指向的是list对象
              //list对象是<People>所以应该按下面的方法写
              List<People> list3=map.get(1);
              for(People p:list3){
                     out.println(p.getName());
              }
       }
 
}
使用时注意的问题:
1.      在1.5中将一些类进行了重写(泛型),所以,当不写泛型参数的话,将提示警告
2.      泛型类型的转换问题:泛型中参数化类型一定要一样,被转换为非参数化是可以的
       ArrayList<Integer> l = new ArrayList<Integer>();
       List<Integer> m = l; // ok
       Collection<Integer> n = l; // ok
       ArrayList<Number> o = l;   // error
       List<Object> lo = l;//error 一个List<X>不允许被转换为一个List<Y>,即使这个X能够被转换为Y
       List listold = l;//ok 参数化类型转换为非参数化类型是允许的
/**
 * 知识点:
 * 注意问题:
 * 2.泛型类型的转换问题:泛型中参数化类型一定要一样,被转换为非参数化是可以的
 * 程序目标:
 * 验证上面那句话
 */
package MY.module12.Fanxing.second;
import java.util.*;
public class Test1 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              ArrayList<Integer> l=new ArrayList<Integer>();
              List list=l;
              List<Integer> list2=l;
              Collection<Integer> c=l;
              Collection c2=l;
             
       //       List<Object> list3=l;
       //       ArrayList<Number> o = l;
       }
 
}
运行时类型安全:
                            泛型设定的信息经过编译后不会
                            保留在.class文件中,即泛型
                            仅提供了编译期的类型安全。
                           
                            使用java.util.Collections中
                            的checkedList()和checkedMap( )
                            方法,通过这个方法,我们可以在
                            运行时,立即捕获类型不匹配错误。
/**
 * 知识点:
 * 运行时类型安全
 */
package MY.module12.Fanxing.second;
import java.util.*;
public class Test2 {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
//          List<Integer> list=new ArrayList<Integer>();
             List list=new ArrayList();
//          List list2=list;
//          list2.add(1);
//          list2.add("hello");
//          Integer i=list.get(0);
              //这里应该编译不能通过的,可是确在运行的时候报错
              //为什么运行时报错而不是编译的时候呢?
              //因为:泛型在编译的时候不将信息保存在.class文件中,这样就通过了
              //编译期类型安全的检查,他会在运行的时候做类型安全检查
              //这里的错误是因为加入的是String对象list2.add("hello");而规定是//Integer
              //所以,我希望在报错的时候,能够在list2.add("hello");给予提示,这样
              //我就清楚为什么出错了,我可以通过下面的方法实现这个目标
              List<Integer> list=new ArrayList<Integer>();
              List<Integer> list2=Collections.checkedList(list,Integer.class);
              List list3=list2;
              list3.add("hello");//运行时,提示这个有错误
              Integer i=list.get(0);
       }
 
}
类型参数通配符:<?>
通配符的作用,和不是泛型的参数的区别?有通配符的参数,在方法中不能随意的添加对象,要按照指定的类型添加,如果参数不是泛型,就没有限制了
/**
 * 知识点:
 * 通配符
 * 程序目标:
 * 测试通配符的功能作用
 * 思考:通配符和不写泛型有什么区别,使用通配符有什么好处
 */
package MY.module12.Fanxing.second;
 
import java.util.*;
 
public class Test3 {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List list=new ArrayList();
              list.add(1);
              display(list);
              display(list);
              display3(list);//如果不是泛型,也可以调用参数为泛型的方法,因为可以类型转换
              List<String> list2=new ArrayList<String>();
              list2.add("zhangsan");
              display(list2);
              display2(list2);
              display3(list2);
              List<Integer>list3=new ArrayList<Integer>();
              list3.add(2);
       //       display(list3);error
              display2(list3);
              display3(list3);
//          List<?>list4=new ArrayList<?>();error
       }
       public static void display(List<String> list){
              for(Object s:list){
                     System.out.println(s);
              }
       }
      
       public static void display2(List list){
              for(Object obj:list){
                     System.out.println(obj);
              }
       }
      
       public static void display3(List<?> list){
              for(Object obj:list){
                     System.out.println(obj);
              }
       }
 
}
界定通配符:
普通的通配符不能很好的保证类型安全,界定的通配符可以解决这个问题
/**
 * 知识点:
 * 界定通配符
 * Java文件说明:
 * People.java
 * Man.java
 * Woman.java
 * 程序目标:
 * 验证界定通配符的作用
 */
package MY.module12.Fanxing.second;
import java.util.*;
public class Test4 {
      
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              List<Integer>list=new ArrayList<Integer>();
              list.add(1);
              list.add(10);
              double d=sumList(list);
              System.out.println(d);
             
              List<People>list2=new ArrayList<People>();
              list2.add(new Man(20));
              list2.add(new Woman(30));
              sumList2(list2);
             
              List<Man>list3=new ArrayList<Man>();
              list3.add(new Man(23));
              sumList2(list3);
       }
       public static double sumList(List<? extends Number> list){
              double d=0.0;
              for(Number n:list){
                     d+=n.doubleValue();
              }
              return d;
       }
       public static void sumList2(List<? extends People>list){
              int age=0;
              for(People p:list){
                     System.out.println(p);
              }
       }
}
package MY.module12.Fanxing.second;
 
public class People {
 
}
package MY.module12.Fanxing.second;
 
public class Man extends People{
       private int age;
 
       public Man(int age) {
              super();
              // TODO Auto-generated constructor stub
              this.age = age;
       }
 
       public int getAge() {
              return age;
       }
 
       public void setAge(int age) {
              this.age = age;
       }
 
       @Override
       public String toString() {
              // TODO Auto-generated method stub
              StringBuffer sb=new StringBuffer();
              sb.append(age);
              return sb.toString();
       }
      
}
package MY.module12.Fanxing.second;
 
public class Woman extends People{
       private int age;
 
       public Woman(int age) {
              super();
              // TODO Auto-generated constructor stub
              this.age = age;
       }
 
       public int getAge() {
              return age;
       }
 
       public void setAge(int age) {
              this.age = age;
       }
 
       @Override
       public String toString() {
              // TODO Auto-generated method stub
              StringBuffer sb=new StringBuffer();
              sb.append(age);
              return sb.toString();
       }
      
}
自定义泛型类:
              首先,在一对尖括号(< >)中
              声明类型变量,以逗号间隔
              变量名列表。命名一个类型变量习惯于一个
              大写字母。
              注意:在类的实例变量和方法中,
              可以在任何类型的地方使用那些类型变量。
              切记,类型变量仅在编译时存在,所以不能使用
              instanceofnew这类运行时操作符来操作类型变量。
/**
 * 知识点:
 * 自定义泛型类
 * Java文件说明:
 * EntrySet.java:自定义的泛型类
 * EntrySetTest.java
 */
package MY.module12.Fanxing.mygenerics;
import static java.lang.System.*;
public class EntrySetTest {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              EntrySet<Integer,String>es=new EntrySet<Integer,String>(1,"zhang san");
              out.println(es.getKey());
              out.println(es.getValue());
              es.setKey(20);
              out.println(es.getKey());
       }
 
}
package MY.module12.Fanxing.mygenerics;
 
public class EntrySet<K,V> {
       private K key;
       private V value;
       public EntrySet(K key, V value) {
              super();
              // TODO Auto-generated constructor stub
              this.key = key;
              this.value = value;
       }
       public K getKey() {
              return key;
       }
       public void setKey(K key) {
              this.key = key;
       }
       public V getValue() {
              return value;
       }
       public void setValue(V value) {
              this.value = value;
       }
      
}
/**
 * 知识点:
 * 自定义泛型类
 * Java文件说明:
 * Car.java:汽车类
 * BMWCar.java:宝马汽车
 * BenZCar.java:奔驰汽车
 * CarFactory.java:生产汽车的简单工厂,功能如下:
 * 生产入库,全部出库,出库(某一辆),查看库存数量,得到出库的权利
 * Test.java:用户实际操作
 */
package MY.module12.Fanxing.third;
import java.util.*;
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              CarFactory<BMWCar> c=new CarFactory<BMWCar>();
              c.add(new BMWCar());
              System.out.println(c.count());
              c.add(new BMWCar());
              System.out.println(c.count());
              System.out.println(c.getAll());
              System.out.println(c.getCar(0));
              Iterator<BMWCar> it=c.iterator();
              while(it.hasNext()){
                     System.out.println(it.next());
              }
       }
 
}
package MY.module12.Fanxing.third;
 
public class Car {
      
}
package MY.module12.Fanxing.third;
 
public class BenZCar extends Car{
       private static final String s="BenZCar";
 
       @Override
       public String toString() {
              // TODO Auto-generated method stub
              StringBuffer sb=new StringBuffer();
              sb.append(s);
              return sb.toString();
       }
      
}
package MY.module12.Fanxing.third;
 
public class BMWCar extends Car{
       private static final String s="BMWCar";
       public String toString() {
              // TODO Auto-generated method stub
              StringBuffer sb=new StringBuffer();
              sb.append(s);
              return sb.toString();
       }
}
package MY.module12.Fanxing.third;
import java.util.*;
public class CarFactory<K extends Car> {
       private List<K> list;//库房
       public CarFactory(){
              list=new ArrayList<K>();
       }
       public void add(K k){//汽车入库
              list.add(k);
       }
       public List<K> getAll(){//全部出库清仓
              return list;
       }
       public K getCar(int i){//出库(某一辆)
              return list.get(i);
       }
       public int count(){//查看库存数量
              return list.size();
       }
       public Iterator<K> iterator(){
              return list.iterator();
       }
}
 
枚举:
引例:
/**
 * Java文件说明:
 * Car.java:汽车类,有颜色属性
 * Color.java:用来给汽车上颜色
 * Test.java:生产汽车,并上颜色
 * 程序目标:
 * 用户买一辆汽车,颜色范围只有三种,不能选择其他的颜色
 * 发现问题:
 * 不能满足业务规则
 */
package MY.module12.enums.first;
 
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Car c=new Car();
              c.setColor(Color.RED);
              c.setColor(1);//编译可以通过,违反了我的业务规则
       }
 
}
package MY.module12.enums.first;
 
public class Car {
       private int Color;
 
       public Car() {
              super();
              // TODO Auto-generated constructor stub
       }
 
       public int getColor() {
              return Color;
       }
 
       public void setColor(int color) {
              Color = color;
       }
      
}
package MY.module12.enums.first;
 
public class Color {
       public static final int BLUE=0;
       public static final int RED=1;
       public static final int GREEN=2;
}
通过枚举类型可以解决上面的问题:
什么是枚举?给出业务需要的取值范围的类型
如何定义一个枚举类型:
语法:    
public enum 名称{
       属性
       构造器
       方法
}
              说明:
                     (1)自动继承java.lang.Enum类。
                     (2)构造器不能用public,protected
                                   修饰。
                     (3)声明枚举类型的值时,直接输入字
                            符,编译器会自动为这些值加上public、
                            static、final修饰符。
                     (4)枚举类型方法或变量必须在
                            枚举值申明的后面。
                     (5)枚举也可定义在一个类的内部。
/**
 * 知识点:
 * 定义一个枚举类型
 */
package MY.module12.enums.second;
 
public enum CarColor {
       RED,
       GREEN,
       BLUE,
}
/**
 * 知识点:
 * enum
 * Java文件说明:
 * Car.java
 * CarColor.java:定义了一个枚举类型
 * 程序目标:
 * 给汽车上颜色,只能有指定的颜色范围
 */
package MY.module12.enums.second;
 
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Car car=new Car();
              car.setColor(CarColor.BLUE);
//          car.setColor(1);
              System.out.println(car.getColor());
       }
 
}
package MY.module12.enums.second;
 
public class Car {
       private CarColor color;
 
       public CarColor getColor() {
              return color;
       }
 
       public void setColor(CarColor color) {
              this.color = color;
       }
      
}
像内部类一样使用:
/**
 * 知识点:
 * enum的内部类写法
 * 程序目标:
 * 测试enum的内部类写法
 */
package MY.module12.enums.second.t1;
 
public class Test2 {
       enum type{
              a,
              b,
              c,
       }
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              System.out.println(type.a);
       }
 
}
 
package MY.module12.enums.second.t2;
import static MY.module12.enums.second.t2.Superior.*;
import static java.lang.System.*;
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              huashanlunjian(Dongxie,XiDu,Nandi,BeiGai);
              out.println(Dongxie);
              out.println(Dongxie.name());
              out.println(Dongxie.getDetail());
              Superior s=Superior.valueOf("BeiGai");
              out.println(s);
       }
       public static void huashanlunjian(Superior...sup){
              for(Superior s:sup){
                     out.println(s.getDetail());
                     out.println(s);//Dongxie等可以看做对象,打印对象调用toString方法
                     //this是说当前对象
              }
       }
}
package MY.module12.enums.second.t2;
 
public enum Superior {
       Dongxie("黄药师", "弹指神通"), XiDu("欧阳峰", "蛤蟆功"), Nandi("段皇爷", "一阳指"), BeiGai(
                     "洪七公", "降龙十八掌");
      
       private String name;
       private String wugong;
       private Superior(String name, String wugong) {
              this.name = name;
              this.wugong = wugong;
       }
       public String getDetail(){
              return (name + " " + wugong);
       }
       public String toString() {
              // TODO Auto-generated method stub
              String desc = null;
              switch (this) {
              case Dongxie:
                     desc = "桃花岛主";
                     break;
              case XiDu:
                     desc = "白驼山主";
                     break;
              case Nandi:
                     desc = "大理皇帝";
                     break;
              case BeiGai:
                     desc = "丐帮帮主";
                     break;
              default:
                     desc = "Not defined";
              }
              return desc;
       }
}
Enum:
package MY.module12.enums.third;
 
import MY.module12.enums.second.*;
import static MY.module12.enums.second.CarColor.*;
import static java.lang.System.*;
//可用static import将枚举值导入进来
 
/**
 * 演示枚举类的基本方法及枚举使用注意事项
 *
 */
public class Test1 {
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
             
              //compareTo
              //比较两个枚举值的顺序
              int result = RED.compareTo(BLUE);
              out.println("RED.compareTo(BULE) "+result);
             
             
              //equals
              boolean isEqual = RED.equals(RED);
              out.println("RED.equals(BULE) "+isEqual);
             
              //ordinal
              //次序值
              int indexOfRED = RED.ordinal();
              out.println("RED.ordinal() "+indexOfRED);
             
              //name
              //取得枚举值对应的名称字符串
              String s = RED.name();
              out.println("RED.name() "+s);
             
              //valueof
              //跟name方法相反,取得与字符串对应的枚举类型的值
              CarColor color = CarColor.valueOf("RED");
              out.println("color's name "+color.name());
             
              //values
              //取出枚举类型的所有值
             CarColor[] colors = CarColor.values();
             
              //可用for-each循环来遍历所有枚举值
              for(CarColor carcolor:colors){
                     out.println(carcolor);
              }
             
              //枚举值也可用在switch语句中
              CarColor colorKey = CarColor.valueOf(args[0]);
              switch(colorKey){
              case RED:
                     out.println("your select is "+colorKey);
                     break;
              case BLUE:
                     out.println("your select is "+colorKey);
                     break;
              default:
                     out.println("your select is others");
              }
             
       }
 
}
注释:Annotations
什么是注释?添加到代码中的修饰符,用来为相关程序提供额外的信息
分三种:
1.      直接用的注释
2.      注释的注释
3.      自定义的注释
 
1.      直接用的注释:
@Override:表明该方法为重置方法
@Deprecated:已经过失的方法
@SuppressWarnings("unchecked"):去掉警告
/**
 * 知识点:
 * 三个系统注释
 * Java文件说明:
 * Car.java,BMWCar.java
 * 程序目标:
 * 测试系统注释
 */
package MY.module12.Annotation.t1;
 
import java.util.*;
 
public class BMWCar extends Car{
       private List list=new ArrayList();
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              BMWCar c=new BMWCar();
              c.f2();
       }
 
       @Override
       public void f1() {//表示该方法是重置方法
             
       }
       @Deprecated
       public void f2(){
              System.out.println("已经过时");
       }
      
       @SuppressWarnings("unchecked")
       public void f3(){
              list.add(10);//会警告类型不安全,加上这个注释就不警告了
       }
}
package MY.module12.Annotation.t1;
 
public class Car {
       public void f1(){
             
       }
}
2.      注释的注释:原注释 和自定义注释
用来描述注释的注释
Target:
       用来指定Annotation类型可用在哪些元素上。
Retention
       设定Annotation类型的信息保留到什么时候。
/**
 * 知识点:
 * 自定义注释和原注释
 * 程序目标:
 * UsingMyAnnotation.java:
 * 1.打印被注释的那个方法的名字
 * 2.打印注释的信息
 * 3.执行被注释的那个方法
 * 使用反射的机制
 * MyFirstAnnotation.java:自定义的注释类
 *
 */
package MY.module12.Annotation.t2;
 
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
 
public class UsingMyAnnotation {
       @MyFirstAnnotation("是我的")
       public void info(){//被注释的方法
              System.out.println("hello");
       }
       public static void fenxi(Class c) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
              Object uma=(UsingMyAnnotation) c.newInstance();
              Method[] m=c.getDeclaredMethods();
              for(Method mm:m){
                     String s=mm.getName();
                     if(s.equals("info")){
                            System.out.println("method' name is :"+s);
                            MyFirstAnnotation mfa=mm.getAnnotation(MyFirstAnnotation.class);
                            if(mfa!=null){
                                   System.out.println(mfa.value());
                                   mm.invoke(uma,new Object[]{});
                            }
                     }
              }
       }
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              try {
                     fenxi(UsingMyAnnotation.class);
              } catch (IllegalArgumentException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } catch (InstantiationException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } catch (IllegalAccessException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              } catch (InvocationTargetException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
              }
       }
 
}
package MY.module12.Annotation.t2;
import java.lang.annotation.ElementType.*;
import java.lang.annotation.*;
@Target(ElementType.METHOD)//该注释只能给方法注释
@Retention(RetentionPolicy.RUNTIME)//在运行的时候保存注释信息
public @interface MyFirstAnnotation {
       String value();
}
/**
 * 知识点:
 * 注释类中的注释类
 * 程序目标:
 * L.java:注释类,包含T.java类
 * T.java:注释类
 * Test.java:
 * 通过反射得到注释信息
 */
package MY.module12.Annotation.t3;
@L(name="zhangsan",notice="许可证",
              redistributable=true,
              t={@T(name="1",owner="a"),@T(name="2",owner="b")}
              )
public class Test {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
              // TODO Auto-generated method stub
              Test t1=new Test();
              L l=t1.getClass().getAnnotation(L.class);
              System.out.println(l.name());
              System.out.println(l.notice());
              System.out.println(l.redistributable());
              T[] tt=l.t();
              for(T ttt:tt){
                     System.out.println(ttt.name()+" "+ttt.owner());
              }
       }
 
}
package MY.module12.Annotation.t3;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
import linshi.annotation.t2.Trademark;
 
@Retention(RetentionPolicy.RUNTIME)
 
@Target({ElementType.TYPE, ElementType.PACKAGE})
public @interface L {
       String name();
 
       String notice();
 
       boolean redistributable();
 
       T[] t();
}
package MY.module12.Annotation.t3;
 
public @interface T {
       String name();
       String owner();
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值