`

类的定义

 
阅读更多

类的定义

   [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.夏天
		}
	}
	
	
}

 

分享到:
评论

相关推荐

    点、线、圆、矩形、抛物线的类定义

    在C++编程中,"点、线、圆、矩形、抛物线的类定义"是一个涉及面向对象编程的重要主题。面向对象编程(OOP)是C++的核心特性,它通过类来封装数据和功能,使得代码更加模块化和易于管理。在这个场景下,我们将分别...

    c++ 基本知识--类定义、初始化、析构(曹阳).ppt

    C++ 基本知识 - 类定义、初始化、析构 本文将对 C++ 中的类定义、初始化和析构进行详细的阐述。 1.1 类的定义 在 C++ 中,类是一种新的数据类型,而对象是具有这种类型的变量。类就是对同类对象的属性和行为进行...

    双向链表.cpp 双向链表类定义及测试代码 c++

    双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材

    win7中vfp软件安装后出现 0: 找不到MSXML2.DOMDOCUMENT.4.0类定义

    win7中vfp软件安装后出现 0: 找不到MSXML2.DOMDOCUMENT.4.0类定义,此中是Dll文件下载,直接放在c:\windows\system目录下即可!msxml4.cab

    HID设备类定义中文版

    HID设备类定义的中文版,本汉语版为USB爱好都编写,仅供参考。为保证原书语意,书中的专有名词均采用英语原文。原书为 ”Device Class Definition for Human Interface Device(HID)”。

    类定义与实现如何相互关联

    以下是对类定义与实现关联的详细解释。 **类定义与实现的区分** 1. **声明与定义**: - 声明(Declaration):向编译器表明一个标识符(如变量、函数、类等)的存在,但不提供完整的实现细节。例如,`void func...

    Java:使用抽象类定义一个“形状类”,能够计算周长和面积。

    在这个场景中,我们使用抽象类来定义一个"形状类",该类包含计算周长和面积的通用方法。这允许我们创建一个统一的接口,使得所有形状都遵循相同的规范。 首先,我们可以定义一个名为`Shape`的抽象类,它包含两个...

    【zfind】简单的C/C++宏定义和类定义搜索工具

    zfind是本人写的一个简单的C/C++宏定义和类定义搜索工具,z是左的意思,即本人姓氏。取此名字是因为windows下有find命令,为避免冲突。另外本工具是本人在32位WIN7环境下使用的,其余环境本人不保证兼容。 写此工具...

    用c++定义一个Book(图书)类

    定义一个Book(图书)类,在该类定义中包括: (1) 数据成员:bookname(书名)、price(价格) 和number(存书数量)。 (2) 成员函数:display()显示图书的情况;borrow()将存书数量减1。并显示当前存书数量;restore( )...

    吉林大学多项式类的定义以及运算符重载.zip

    对如下多项式编写类定义: +++…+ 其中,n为多项式的次数。完成如下功能: (1)可存储任意大的多项式(提示:可用动态数组实现)。 (2)定义构造函数、析构函数、拷贝构造函数。 (3)包含一个static成员存储定义...

    03Java类定义.pdf

    Java 类定义 Java 类是 Java 编程语言的基础概念之一,它是对象的蓝图,用于描述对象的状态和行为。在 Java 中,类是用户自定义的数据类型,对象是类的实例。类定义了对象的属性和行为,对象则是类的实例化结果。 ...

    COM对象转类定义模块.rar

    本资源"COM对象转类定义模块.rar"包含了一个易语言类定义模块的源码,旨在帮助开发者理解如何将COM对象转换为类定义,以便于在易语言环境中使用这些对象。 首先,了解COM的基本概念是非常重要的。COM是一个二进制...

    python类定义的讲解.docx

    Python 类定义是面向对象编程的基础,它允许程序员创建自定义的数据结构并定义与这些结构相关的操作。类定义在Python中是通过`class`关键字来实现的,它为封装数据和行为提供了一种方式。 首先,类定义的基本语法...

    基于Objective-C的JSON数据生成Objective C类定义设计源码

    本设计源码提供了一个基于Objective-C的JSON数据生成Objective C类定义的工具,包含21个文件,其中包括4个gitignore文件,4个m源文件,3个h头文件,2个xib文件,2个md文档,1个pbxproj文件,1个xcworkspacedata文件...

    HID设备类定义中文版pdf

    HID(Human Interface Device)设备类定义中文版PDF是一份详细阐述USB(Universal Serial Bus)人机交互设备标准的文档,对于理解与开发HID设备的软件或硬件工程师来说至关重要。这份文档通常会涵盖HID协议的基本...

    一个类是一个模板或蓝图,描述了对象的属性和行为 而对象则是类的一个实例,它具有类定义的属性和行为

    代码定义了一个名为Person的类,它有两个属性name和age,以及一个名为sayHello()的方法。在Main类的main()方法中,我们创建了...类定义了对象的属性和方法,而对象是根据类定义创建的实例,可以设置属性值和调用方法。

    定义时钟类,完成相应功能

    本cpp采用C++编写,利用Clock类定义一个带“AM”,“PM”的新时钟类NewClock,显示时间带有上午下午标志

    HID设备类定义(中文).doc

    《HID设备类定义(中文)》文档详细阐述了USB人机交互设备(Human Interface Device,简称HID)的相关规范,旨在为HID设备制造商提供生产USB兼容设备所需的指导,并规定了驱动程序如何从USB设备获取数据。...

Global site tag (gtag.js) - Google Analytics