浏览以下内容前,请点击并阅读 声明

java是面向对象的语言,而对象的创建,则需要借助类,类可以说是一个创建对象的模具(个人理解)。

类的定义

  以下构成定义类的最简单(不能再简单)语句:

class MyClass {
// 字段,构造器,
// 方法等的声明
}

  通常情况下,类的声明一般包含如下组成部分(按顺序):

  • 类的修饰词,如public(可有可无)
  • class关键词+类的名称,一般一大写字母开头
  • extends关键词+继承的类,一个类只能继承一个超类(可有可无)
  • implements+实现的借口,借口可以有多个,以逗号分隔(可有可无)
  • 类的主体,用花括号括起来

  类的修饰词,类的修饰可以为public,也可以没有如果为public则其可视范围没有限制,若没有,则其可视范围为仅程序包内可见(package)。

  类的继承与借口的实现待后再详说。

  类的主体

  类的主体可以由类的成员组成,包括构造器,方法,字段,内含类等,也可以包含代码块(花括号内的代码),由一对花括号括起来。

  类成员的可视范围

  类成员的可视范围的控制可以通过在成员声明时在其左侧加上修饰词实现,修饰词的作用效果如下表所示:

修饰词 包含成员的类 包含所在类的程序包 继承所在类的类 一切范围
public
protected
不含修饰词
private

对于可是范围控制的修饰词,建议使用最严格的可视范围限制,即尽量减小修饰对象的可视范围,尽量用private,尽量少用public修饰类成员,除非该成员是一个常量。

  static修饰词

  当类的成员,如字段,方法的声明时左侧带有static修饰词时,则表示该成员为类成员(静态),而不是属于该类的一个实例,使用时,直接用类,而无需创建一个类的实例,当然也可以由实例引用,但不提倡这样使用,与之相对的则是实例成员,如一下类的定义中:

public class Bicycle {
//以下字段未使用static修饰词,则其为实例字段
private int cadence;
//以下字段使用了static修饰词,则其为类字段(静态字段)
private static int numberOfBicycles = 0;
//实例方法
public int getID() {
return id;
}
}

  类成员的使用无需创建实例,而实例成员的使用需要创建实例:

//使用上述类中的类字段,方法的使用类似
System.out.println(Bicycle.numberOfBicycles);
//使用上述类中的实例字段,方法的使用类似
System.out.println((new Bicycle()).numberOfBicycles);

  字段

  字段是类中最外部的变量,与局部变量有明显区别,属于类的成员,字段的声明包含如下部分:

  1. 最左边可以有0个或多个修饰词,可以为public,private,static等
  2. 字段的类类型
  3. 字段的名称

  方法

  方法是构成类声明的基本成员,一般情况下,方法的声明包含如下部分:

  1. 修饰词,如public,private等(可有可无)
  2. 返回数据类型,如果没有返回值,则用void代替
  3. 方法名称,与变量的命名方法类似
  4. 由圆括号括起来的参数,参数类型和参数名称成一组,多组由逗号隔开,圆括号内可为空
  5. throws关键词后跟一系列抛出的异常(可有可无)
  6. 方法的主体,由花括号括起来,包含java语句,花括号内也可为空。

  方法的签名:方法的签名由两个部分组成,名称和参数。

  方法的重载:一般情况下,一个类中的方法名称都是唯一的,但是java允许在一个类中有多个名称相同的方法,但是方法的签名必须不同,即参数类型或者数量不同,这就叫方法的重载:

public class DataArtist {
...
public void draw(String s) {
...
}
public void draw(int i) {
...
}
}

构造器

创建一个类的实例时,我们需要调用该类的构造器,构造器的声明和方法的声明类似,不同的是,他们的名称和类的名称相同,而且没有返回值,如果没用定义构造器,编译器会自动给该类插入一个其父类的无参数构造器(如果没有使用implements关键词指定父类,则其父类就是Object),称为默认构造器。

构造器和方法的参数

构造器和方法的参数类型可以为基本数据类型,也可以为类,当参数类型为基本数据类型时,在方法和构造器中无论对参数进行如何的操作,调用方法和构造器过后,参数的值都不会变,而当参数为一个对象或者对应一个对象的变量时,方法和构造器中对对象的操作最终会对对象的状态产生影响。传入方法和构造器的变量与对象的对应关系不会发生改变。

参数数量可变

方法或者构造器的参数数量可以是任意长度的,要使用任意长度的参数,就要在参数类型后面紧跟上一个省略号(三点),例如:

public test(int… integerVal){

//此处省略了方法内的代码

}

对象的创建

对象创建的表达式包含两个个部分:

  • new关键词

  • new关键词后跟一个构造器的调用

new关键词会给新创建的对象分配一定的内存,并将该内存(对象)的引用地址返回,一般用于变量的赋值或者用作参数。

对象的使用

对象创建之后,我们便可以使用其成员了,在一个类之外的代码使用该类的成员时,必须使用 对象引用表达式或者变量+点(.)+类成员的格式,如下所示:

//可以使用对应一个对象的变量的形式使用该对像的字段,方法的使用类似

var.fieldName

//或者使用能产生一个对象引用的表达式使用该对象的字段(如构造器),方法的使用类似
//该语句过后,没有对于该对象的引用,所以该对象的资源(内存等)便会被java虚拟机回收
int height = new Rectangle().height;
垃圾回收
对象创建之后变回占用系统的资源,java有一个垃圾回收的机制,即如果java运行时环境认为一个对象不在需要时,便会删除它,以释放其占用的资源。
判断一个对象是否可以被回收是通过判断该对象是否还被引用,如果一个对象仅被一个变量引用,而该变量失效之后,该对象便可被回收,也可以给一个变量赋值为null以消除该变量对于之前对象的引用关系。注意:一个对象可以对应多个变量。 方法的执行
遇到以下任意一种情况,程序会退出方法的执行:
  • 完成方法中所有的语句的执行
  • 执行完return语句过后
  • 抛出异常
在方法的声明中如果指定返回类型,则必须在方法主体中使用return语句以返回指定类型的值,当然如果声明中没有指定返回类型(即返回类型为void),也可以在方法中使用return语句以跳出该方法的执行,但return关键词后不能跟返回的值,否则会编译出错。
方法的返回类型可以为基本数据类型,也可以为类或者是借口,当返回类型为类或者是借口时,方法中实际返回的值可以是返回类的子类或者是返回借口的实现的类,这就叫java的共变返回类型。
this关键词
在实例方法或者是构造器中,this关键词是对包含该方法或者构造器的对象的引用(注意类方法中不能使用this关键词)。当方法或构造器需要引用被隐藏的字段(含有与字段名称相同的参数)或者当一个构造器需要引用另外一个构造器时,我们就需要使用this关键词,this的使用方法参照如下示例:
public class Rectangle {
private int x, y;
private int width, height; public Rectangle() {
//在构造器中如果需要调用类中其他的构造器,则需要用到this关键词
this(0, 0, 1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
//该方法含有与字段名称相同的参数,要想使用该字段,则需要使用this关键词
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
...
}

字段的初始化
一般对于字段的初始化比较简单,比如
      int a=0;

  或者不对其进行赋值,然而如果要字段初始化的值需要进行比较复杂的运算比如循环时,我们可以在构造器里面进行运算,另外,我们还可以使用其他的方法。
静态字段的初始化
静态字段的初始化可以使用静态初始化代码块,静态初始化代码块在类主体的最外层,由static关键词后跟一个由花挂号括起来的代码块,静态初始化代码块内的代码在类初始化时按照顺序执行。
另外一种静态字段初始化的方法就是在类中定义静态方法,然后在字段声明中调用该静态方法。
实例字段的初始化
与静态初始化代码块类似,初始化代码块能够对实例字段进行初始化,初始化代码块相对于静态初始化代码块没有static关键词,每次创建一个对象时,初始化代码块中的代码都会按顺序执行。
同样,实例字段的声明中也可以调用类中的方法进行初始化。

java-类的更多相关文章

  1. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  2. jvm系列(一):java类的加载机制

    java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...

  3. java类与实例

    最近在看设计模式,感觉自己对java的三大特性的理解不够清晰,搞不清楚抽象类.接口.泛型的用处和优缺点.设计模式学了一半,想着还是停下来脑补一下java的基础,就从java对象开始吧. 一.java对 ...

  4. oracle调用JAVA类的方法

    导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了,  1.操作系统需要拥有支持loadjava命令的jdk.  2.加 ...

  5. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  6. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  7. kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件

    该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...

  8. Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)

    今天重装系统,安装了新的Myeclipse后,导入之前的项目后,,出现了乱码问题.乱码问题主要是java类中的注释,而jsp页面中汉字却完好如初: 右键项目,查看项目的编码格式,UTF-8,把java ...

  9. Java类初始化

    Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于  char.short.byte.int.long.float. ...

  10. 深入研究Java类装载机制

    目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定 ...

随机推荐

  1. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. NYOJ题目916胖子小的百宝袋

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsQAAAL6CAIAAAC+R9cJAAAgAElEQVR4nOydO5LcvM6GzyYmn4U47o

  3. ASP.NET Web API 使用Swagger生成在线帮助测试文档

    Swagger-UI简单而一目了然.它能够纯碎的基于html+javascript实现,只要稍微整合一下便能成为方便的API在线测试工具.项目的设计架构中一直提倡使用TDD(测试驱动)原则来开发,sw ...

  4. java-解决业务操可能数据冲突问题

    问题提出,由于业务会出现多人同时操作,或者业务人员反复的操作,因此在业务流程中,需要对业务操作数据进行保护,由于使用数据库锁可能会引起一些难以预料的问题,因此考虑使用内存锁,设计思想:在内存中使用一个 ...

  5. 【PHP&&mysqli】

    msyqli和mysql只有一个字母的差别,真正的含义是msyql的增强版扩展. MySQL可以处理满足程序员对MySQL数据库操作的各种需要了,为什么还需要mysqli呢?因为mysqli支持面性对 ...

  6. JAVA 堆栈知识和Volatile关键字

    栈内存:存放基本类型的变量和对象的引用 堆内存:存放用new创建的对象和数组 栈帧:保存了局部变量表,操作数栈,方法的返回地址以及其它的附加信息 volatile修饰的变量,jvm虚拟机只是保证从主内 ...

  7. PostgreSQL的时间/日期函数使用

    PostgreSQL的常用时间函数使用整理如下: 一.获取系统时间函数 1.1 获取当前完整时间 select now(); david=# select now(); now ----------- ...

  8. 随机生成字符串-php-js

    js <script language="javascript"> function randomString(len) { len = len || 32; var ...

  9. hdu 1851 尼姆+巴什博弈

    先在每堆中进行巴什博弈,然后尼姆 #include<stdio.h> int main() { int T; int i,n; int ans,m,l; scanf("%d&qu ...

  10. 深入理解ASP.NET 5的依赖注入

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:ASP.NET 5整个底层都架构于依赖注入机制之下,今天介绍的文章详细介绍了内置依赖注 ...