`

类的定义

阅读更多

类的定义

   [public|default]  [abstract|final] class 类名 [extends 父类] [implements 接口1[,接口2[,接口n]]]{

      [{初始代码块}]

      [static{静态初始化代码块}]

     //零个或多个构建器

     [public|protected|private|default] 类名  (参数类型 参数值[参数类型 参数值]){

           [this([参数值])|super([参数值])]

           方法体

      }

     //零个或多个属性

      [public|protected|private|default] [static] [final] 属性类型 属性名 [=属性值];

    //零个或多个方法

      [public|protected|private|default] [static] [ final] 返回值类型 方法名 (参数类型 参数值[参数类型 参数值]){

           方法体

           [return obj]

      }

      [public|protected|default] [abstract] 返回值类型 方法名 (参数类型 参数值[参数类型 参数值]

  }

 

1. 类名定义:
  [public|default]  [abstract|final] class 类名 [extends 父类] [implements 接口1[,接口2[,接口n]]]{
 [public|default] 指类的可见范围,总的来控制哪个范围内可以引用该类。 如果不能引用(import)类,更不要谈方法调用了(虽然方法有可能是public的)。因此类签名上的public|default 总的决定了类的可见范围、方法或属性的可见范围应小于等于类的可见范围。

     public  该类可以被任何类引用

     default    默认没有修饰符,指在与该类同包内的类可以引用

      abstract  该类是一个抽象类,该类不可以被实例化

       final 说明该类不可被继承

   类只能有扩展一个父类,但可以实现多个接口。

   类必须实现接口定义的方法和父类的抽像方法,除非该类是抽像类,可以将具体实现交给子类来实现。

 

2.  属性定义:

[public|protected|private|default] [static] [final] 属性类型 属性名 [=属性值];

    [public|protected|private|default] 只允许其中一个

    public 属性可以被任何类引用(前提Class是public的,否则等同于default)

    protected 同包内的类可以引用或子类可以引用

    private 该属性不能被其它类引用

    default  默认没有修饰符,同包内的类可以引用

 

    任何属性都可以在本类中被引用。

 

 

    引用范围 由大至小为 public->protected->default->private

 

   [static] 该属性为静态属性,在由字节码的class文件生成Class对象时就已初始化,static属性属于Class对象,由于在jvm中每个类(在每个ClassLoader中)只有一个class对象,static属性也只有一个,对于类的多个实例共享。未用static 标注的属性属于类的实例,每个的实例在内存中都有自已的一块区域保存属性方法等,因此非static属性唯一的属于一个类实例,与另一个类实例的同名属性内存地址不同,值也可能不同。

    [final] 该属性被赋值后不可以再次被赋值。

        赋值三种方式:1. 定义时初始化:final Map map = new HashMap(); 

                                     2.final Map map; 然后在构建器里初始化。

                                     3.final Map map ;然后在初始化代码块中初始化

         final 型变量如果未赋值,系统不会自动给默认值,因此引用时会编译报错。

                          

  非final属性可以在定义和初始化时不赋值,系统会自动赋默认值:

          int,byte,char,short,long, 默认值为0。

          float,double 默认值为0.0.

          boolean 默认值为:false

          引用对象型属性默认值为null;

  

3.局部变量

         局部变量定义在方法内或初始化代码块内,格式为 :[final] 属性类型 属性名 =属性值;

         局部变量定义时必须赋值。

         局部变量的作用域:局部变量定义代码所在的大括号内。

        方法的参数是另一种局部变量,方法调用时参数才被赋值,基本数据类型和String类型参数 是值传递,其它对象类型参数是引用传递。 值传递变量改变不会影响原值(调用者里的值),因为值相同于复制了一份,新的不会影响老的。  引用传递变量的值是对象的内存地址,该值变化对原对象没有影响,相当于指向了另一内存地址,但通过引用传递变量操作了引用对象,应会对原对象产生景响。

    

4.方法定义

 [public|protected|private|default] [static] [ final] 返回值类型 方法名 (参数类型 参数值[,参数类型 参数值])

     [public|protected|private|default] 只允许其中一个

    public 方法可以被任何类引用(前提Class是public的,否则等同于default)

    protected 方法同包内的类可以引用或子类可以引用

    private 该方法不能被其它类引用

    default  默认没有修饰符,同包内的类可以引用

 

    任何属性都可以在本类中被引用。

 

  [static] 该方法属于静态方法,调用方式【类名.方法名】,静态方法在字节码的class文件被加载生成Class对象时就准备好了,与类实例无关,所以在反射调用静态方法时不需要类的实例 、静态方法不可以调用非静态方法和非静态变量(非静态方法和属性需要实例对象才能调用)。

  [final] 该方法不可以被子类覆盖(override)

 

5.方法的重载(overload)

   方法重载: 多个方法,方法名相同,但参数个数或类型不同,与修饰符和返回值无关。

   方法重载的多个方法一般用于实现相同功能,其中某些方法简化了参数(使用默认值)等。方便用户的调用。

 

6.方法的覆盖( override )  

方法的覆盖:用子类的方法覆盖父类的方法,在调用中调用的是子类的方法而不是父类的方法。  

 

父类的方法在子类中可见,才能够被覆盖,否则即使子类的方法签名与父类完全相同,也达不到覆盖的作用。

 

子类覆盖方法

1.方法签名:方法名,参数列表,需要与父类方法完全相同

2.  父类的方法在子类中可见

3. 子类的方法修饰符范围不能比父类的小。

4. 返回值类型与父类返回值类型相同或是其子类

5. 子类抛出的异常与父类异常类型相同或是其子类

6. 子类的方法签名可以增加 final 和synchronized

7. 子类中调用父类方法可以使用 super.方法名。

8. 父类的static 方法的子类覆盖方法必须是static的

8. 父类的非static 方法的子类覆盖方法必须是非static的

 

7.子类与父类 属性名相同

   子类方法访问的是子类的属性,父类方法访问的是父类的属性,这两个属性完全不同。 

   子类需要访问父类的属性需要使用super、

   注:父类中的static属性,子类中不能有同名属性

 

8.构建器

  

   用于类实例化时被调用,做初始化工作。

   

  [public|protected|private|default] 类名  (参数类型 参数值[参数类型 参数值]){

           [this([参数值])|super([参数值])]

           方法体

      }

    public  该类可以被任何类实例化(前提Class是public的,否则等同于default)

    default    默认没有修饰符,同包内的类才可以实例化该类

    protected 方法同包内的类或子类才可以实例化该类

    private 该方法不能被其它类实例化,只能该类本身可以实例化,如单例模式

 

  一个类可以不定义构建器,默认有一个空参数的构建器。

 

  由参数不同可以有多个构建器,构建器之间的调用需要使用this关键字,并且为第一行代码,调用父构建器需要使用super关键字,并且为第一行代码。

 父类中没有默认构建器,则子类构建器中必须显示调用父构建器,并且为第一行代码.

 构建器的调用顺序:父类构建器先执行,然后是子类的构建器。

 

9.初始化代码块

   [{初始代码块}] --优先于构建器执行

      [static{静态初始化代码块}] --类加载时执行

  

10.类的实例化顺序

   类的实例化分成两大步

   一. 加载类,同一个类只加载一次,static属性及static代码块也只被执行一次。

     加载类时static 代码块被执行,执行顺序是:    父类static初始化完成后才是子类static初始化

        1.父static 属性初始化。

         2.父static代码块执行。

         3.子类static 属性初始化

         4.子类static 代码块执行

      

   二.实例化类,多次实例化,则调用多次,执行顺序是:父类先于子类执行

       1.父类非static属性初始化

       2.父类非static代码块执行。

       3.父类构建器执行

        4.子类非static属性初始化

       5.子类非static代码块执行。

       6.子类构建器执行

     

  

 

 接口的定义

 [public|default] interface 接口名 extends 接口1 接口2,{

      //零个或多个属性

      [public||default] [static] [final] 属性类型 属性名 =属性值;

 

 //零个或多个方法

 

      [public|default] [abstract] 返回值类型 方法名 (参数类型 参数值[,参数类型 参数值]);

 

}

接口中定义的属性默认为 static final的,定义时必须被赋值。

接口中定义的方法默认是public的

 

 枚举定义:

 [public|default] enum 枚举类名{

实例名1[(构建器参数)][{

 

//重写枚举类方法,实现多态

 

}]

[,实例名N[(构建器参数)]{

 

//重写枚举类方法,实现多态

 

}];

 

[public|protected|defalut|private] [final] 属性类型 属性名 [=属性值];

[private 枚举类名({构建器形参}){方法体}]

 

//零个或多个属性

      [public|protected|private|default] [static] [final] 属性类型 属性名 [=属性值];

    //零个或多个方法

      [public|protected|private|default] [static] [ final] 返回值类型 方法名 (参数类型 参数值[,参数类型 参数值]){

           方法体

           [return obj]

      }

      [public|protected|default] [abstract] 返回值类型 方法名 (参数类型 参数值[,参数类型 参数值]);//由子类实现

 

}

 

枚举类用来定义固定数量的常量类型。

 固有方法:

   values();//静态方法 返回枚举实例数组,按声明顺序

   valueOf(String name)://静态方法,name与枚举实例名相同,则返回该枚举实例,都不相同则报错

 

枚举类的父类为Enum类,因此所有枚举类实例均可以调用父类的方法:

   toString()://返回枚举实例名

   name()://返回枚举实例名

   ordinal()://返回枚举实例在枚举类中的顺序号。 按声明顺序,由0开始。第三个实例的  ordinal()为2.

   

 

 

protected  Object clone()
          抛出 CloneNotSupportedException。
 int compareTo(E o)
          比较此枚举与指定对象的顺序。
 boolean equals(Object other)
          当指定对象等于此枚举实例时,返回 true。
   
 Class<E> getDeclaringClass()
          返回与此枚举实例的枚举类型相对应的 Class 对象。
 int hashCode()
          返回枚举实例的哈希码。
 String name()
          返回此枚举实例的名称,在其枚举声明中对其进行声明。
 int ordinal()
          返回枚举实例的序数(它在枚举声明中的位置,其中初始常量序数为零)。
 String toString()
          返回枚举实例的名称,它包含在声明中。
static
<T extends Enum<T>>
T

valueOf(Class<T> enumType, String name)
          返回带指定名称的指定枚举类型的枚举实例。

静态方法。可以直接使用 Enum.valueOf()方法将字符串转换为指定的枚举实例

 

 

    

 示例 :

package temp.java;

public enum Season {
	SPRING(3,5),SUMMER(6,8),AUTUMN(9,11),WINTER(12,2){

		@Override
		protected boolean isMonthMatch(int month) {
			// TODO Auto-generated method stub
			return (startMonth==month )|| (endMonth>=month && month >0);
		}
		
	};
	int startMonth ;
	int endMonth;
	private Season(int startMonth,int endMonth){
		this.startMonth =  startMonth;
		this.endMonth = endMonth;
	}
	
	public static Season getSeason(int month)  throws Exception {
		Season [] seasons = Season.values();
		for(Season season :seasons){
			if(season.isMonthMatch(month)){
				return season;
			}
		} 
		throw  new Exception(" invalid month:"+month);
	}
	protected   boolean isMonthMatch(int month){
		return this.startMonth<= month && this.endMonth>=month;
	}
	
	
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return this.name()+":  from "+this.startMonth+" month to "+this.endMonth+" month";
	}

	public static void main(String args []){
		Season [] seasons = Season.values();//返回枚举实例数组,按声明顺序
		for(Season season :seasons){
			System.out.println("seasonName:"+season.name()//返回枚举实例名
					+" ordinal:"+season.ordinal()//ordinal()方法 返回枚举实例的数值,按实例声明顺序,由0开始
					+"  "+season.getDeclaringClass());
		}//输出结果:
	//	seasonName:SPRING ordinal:0  class temp.java.Season
	//	seasonName:SUMMER ordinal:1  class temp.java.Season
	//	seasonName:AUTUMN ordinal:2  class temp.java.Season
	//	seasonName:WINTER ordinal:3  class temp.java.Season
		try{
			int month=6;
			Season season = Season.getSeason(month);
			System.out.println(month +" month is in "+season.name()+", ("+season.toString()+")");//输出:6 month is in SUMMER, (SUMMER:  from 6 month to 8 month)
			switch(season){//输出:夏天。。
			case SPRING:
				System.out.println("春天。。");break;
			case SUMMER:
				System.out.println("夏天。。");break;
			case AUTUMN:
				System.out.println("秋天。。");break;
			case WINTER:	
				System.out.println("冬天。。");break;
			}
		}catch(Exception e){}
		
		String seasonName ="SUMMER";
		Season season  = Season.valueOf(seasonName);//字符串与实例名相同,才转换成为枚举
		System.out.println(season.toString());//输出:SUMMER:  from 6 month to 8 month
		try{
		seasonName ="夏天";
		season  = Season.valueOf(seasonName);
		}catch(Exception e){
			e.printStackTrace();
			//输出异常:Exception in thread "main" java.lang.IllegalArgumentException: No enum const class temp.java.Season.夏天
		}
	}
	
	
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics