java-类
浏览以下内容前,请点击并阅读 声明
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);
字段
字段是类中最外部的变量,与局部变量有明显区别,属于类的成员,字段的声明包含如下部分:
- 最左边可以有0个或多个修饰词,可以为public,private,static等
- 字段的类类型
- 字段的名称
方法
方法是构成类声明的基本成员,一般情况下,方法的声明包含如下部分:
- 修饰词,如public,private等(可有可无)
- 返回数据类型,如果没有返回值,则用void代替
- 方法名称,与变量的命名方法类似
- 由圆括号括起来的参数,参数类型和参数名称成一组,多组由逗号隔开,圆括号内可为空
- throws关键词后跟一系列抛出的异常(可有可无)
- 方法的主体,由花括号括起来,包含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-类的更多相关文章
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- java类与实例
最近在看设计模式,感觉自己对java的三大特性的理解不够清晰,搞不清楚抽象类.接口.泛型的用处和优缺点.设计模式学了一半,想着还是停下来脑补一下java的基础,就从java对象开始吧. 一.java对 ...
- oracle调用JAVA类的方法
导入jar包 在oracle中导入需要的jar包,我们把编辑好的java类打成jar包,直接在oarcle里面写简单的调用就可以了, 1.操作系统需要拥有支持loadjava命令的jdk. 2.加 ...
- Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序
先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...
- hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化
hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...
- kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
该kettle插件功能类似kettle现有的定义java类插件,自定java类插件主要是支持在kettle中直接编写java代码实现自定特殊功能,而本控件主要是将自定义代码转移到jar包,就是说自定义 ...
- Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)
今天重装系统,安装了新的Myeclipse后,导入之前的项目后,,出现了乱码问题.乱码问题主要是java类中的注释,而jsp页面中汉字却完好如初: 右键项目,查看项目的编码格式,UTF-8,把java ...
- Java类初始化
Java类初始化 成员变量的初始化和构造器 如果类的成员变量在定义时没有进行显示的初始化赋值,Java会给每个成员变量一个默认值 对于 char.short.byte.int.long.float. ...
- 深入研究Java类装载机制
目录 1.为什么要研究java类装在机制? 2.了解类装载机制,对于我们在项目开发中有什么作用? 3.装载实现细节. 4.总结 一.为什么药研究Java类装载机制 java类加载机制,便于我们使用自定 ...
随机推荐
- merge
当两个DataFrame相加的时候,如果,其中一个不全则会相加产生NA,所以必须一次性将数据的索引索引确定下来,然后对所有数据重建索引然后,填充0,再相加.否则有数据的和没数据的相加结果都变为了NA, ...
- Eclipse启动时出现错误 An internal error occurred during: “Updating indexes”
在Eclipse的workspace下有个.metadata文件夹,Eclipse出现异常的log文件就在这个目录下. 最近出现了这样的错误: 查看日志文件发现: !ENTRY org.ecl ...
- 通过mysql命令行理解mysql
引言:工具不可谓给我们的生活带来了便利,但有些时候我们却忘记了事物本身的意义.在大多数人都在追捧甚至是盲从各种各样的工具有多先进的时候,你是否有反思过:你目前是否有使用它的资格. 假设你学会了使用一款 ...
- mysql列类型
mysql三大列类型 整型 tinyint(占据空间:1个字节 存储范围 有符号 -128-127 无符号 0-255) smallint mediumint int big ...
- LR结果分析——TPS和吞吐率
针对吞吐率和TPS的关系,这个在结果分析中如何使用,就个人经验和朋友讨论后,提出如下建议指导,欢迎同僚指正. TPS:transaction per second 服务器每秒处理的事务数. 吞吐率:测 ...
- 编程风格规范google版
python's coding style,google 命名
- oracle使用dbms_metadata包取得所有对象DDL语句
当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metadata.get_ddl这个包来查看. dbms_metadata包中的get_ddl函数详细参数 GET_DDL函数返回创建 ...
- JqueryEasyUI 解决IE下加载时页面错乱的问题 分类: JavaScript JqueryEasyUI 2014-09-20 09:50 545人阅读 评论(1) 收藏
问题描述: 一直觉得jqueryeasyui在IE下的渲染效果不大好,尤其刚进入页面时的加载,页面会出现布局错乱,虽然是一闪而过,但是给用户的体验不好: 可以通过在页面onload时,增加一个遮罩层, ...
- Datagard產生gap
本文轉載自無雙的小寶的博客:http://www.cnblogs.com/sopost/archive/2010/09/11/2190085.html 有時候因為網路或備份故障等原因,主機所產生的歸檔 ...
- 限制非安全IP访问
这个是一个检测ip是否非法的php函数,适应于白名单,黑名单功能开发,主要场景应用于:api来源限制,访问限制等. /** * 安全IP检测,支持IP段检测 * @param string $ip 要 ...