您的位置:首页 > 编程语言 > Java开发

Java面向对象的基本知识<二>

2016-02-18 14:20 495 查看
一、实例变量的初始化

实例变量的赋值,也就是实例变量的初始化有三种方式:定义实例变量时初始化、非静态初始化块中对实例变量进行初始化和在构造方法中对实例变量进行初始化。

创建对象时,先执行定义实例变量初始化或者非静态初始化块中的初始化,定义实例变量初始化和非静态初始化块初始化实例变量的执行顺序与它们在代码中的排列顺序相同,然后才执行构造方法初始化实例变量。

二、初始化块

1.初始化块的特点

先定义的初始化块先执行,后定义的初始化块后执行。

初始化块不能被调用,也不能接受任何参数。

2. 静态初始化块

初始化块的唯一修饰符是static,使用的static的初始化块称为静态初始化块,静态初始化块是在类加载阶段的初始化阶段执行的。

三、构造器、初始化块在继承关系的执行顺序

当创建一个对象的时候,程序的执行顺序为先执行父类的非静态初始化块,然后执行父类构造方法,最后执行子类的非静态初始化块,子类的构造方法(向上追溯到java.lang.Object类)。对于静态初始化块,会在类加载的初始化阶段执行静态初始化块时,先执行父类静态初始化块,然后才是子类静态初始化块(向上追溯到java.lang.Object类)。

四、基本数据类型的包装类

通过Java的包装类,基本数据类型的变量或者值能包装成包装类的实例来使用。

基本数据类型和包装类的对应关系:

基本数据类型

包装类
byte
Byte
boolean
Boolean
short
Short
char
Character
int
Integer
long
Long
float
Float
double
Double
除了Integer和Character类以外,其他六个包装类的名字都是将基本数据类型的第一个字母改为大写。
1.基本数据类型与包装类实例之间的转换

把基本数据类型变量包装成包装类的实例可以通过对应包装类的构造方法,如int i = 5;Integer iobj = new Integer(i);

还可以通过在构造方法中传入一个字符串(Character类型为new Character('c')),把基本数据类型的值包装成包装类的实例,如Integer iobj = new Integer("5");

如果要获得包装类实例中的包装的基本数据类型的值,可以通过包装类提供的xxxValue方法,如int i= iobj.intValue();

jdk1.5以后提供了自动装箱和自动拆箱的功能。

自动装箱就是直接将一个基本数据类型的值包装成包装类的实例,如Integer iobj = 5;

自动拆箱就是直接从一个包装类的实例得到一个基本数据类型的值,如int i = iobj;

2.基本数据类型与字符串之间的转换

字符串转基本数据类型的值:

包装类静态方法parsexxx(String s)(Character无此方法),如String s = "123",int i = Integer.parseInt(s)

包装类构造方法xxx(String s)(Character类型为new Character('c')),如String s = "123",int i = new Integer(s)

将基本数据类型转字符串:

String类提供多个重载的valueOf()方法,int i = 123,String s = String.valueOf(i)

五、toString()方法

toString方法是Object类中的一个实例方法,那么所有的类的实例都有toString()方法。 当将对象转成字符串类型的时候就会调用toString()方法返回类名+@+hashCode值,可以通过重写toString()方法返回一些对象内部的信息。

六、==和equals方法

==运算符:对于基本数据类型,值相等(数据类型不一定要相等)返回true。对于引用类型,指向的对象相同返回true;

equals方法:对于 String类型,字符串字符序列相等返回true。对于除了String类型外的引用类型,指向的对象相同返回true,如果需要改变判断的标准,那么可以重写equals()方法。

七、final修饰符

final修饰符可以修饰类,变量,方法。

final变量

成员变量:final修饰的成员变量,包括静态变量和实例变量。Java中规定,final修饰的成员变量必须在初始化的时候赋予初始值(不会进行默认初始化赋予默认值)。

final修饰的是一个实例变量,要么在定义该实例变量时赋值,要么在非静态初始化块中赋值,要么在构造方法中赋值。

final修饰的是一个静态变量,要么在定义该静态变量的时候赋值,要么在静态初始化块中赋值。

局部变量:final修饰形参的时候,如下:

public class Test
{
public void test(final int a)
{
System.out.println(a);
}
public static void main (String[] args)
{
Test t= new Test();
t.test(1);
t.test(2);
}
}1 2
为什么a可以赋值了呢?这其实是因为每一次方法执行完后,局部变量a都会被回收,所以每一次的a都是新定义的a。

final修饰引用变量的时候,final保证这个引用变量指向的对象的内存地址不变,但是对象里的内容如变量等是可以改变的。

final变量的宏替换:在定义final变量的时候赋予了初始值,并且这个初始值在编译时就被确定下来,那么这个final变量相当于一个直接量。

八、不可变类

不可变类在创建实例时传入参数对实例变量进行初始化,以后就不能再修改实例变量的值。如8个包装类和String类都是不可变类。

九、缓存实例的不可变类

当程序需要创建同一个不可变类的多个实例时,为了避免重复创建具有相同实例变量的不可变类实例,节省内存空间,可以对不可变类的实例进行缓存。

如Integer类通过valueOf(i)方法进行缓存:如果缓存(数组)中存在值为i的实例,返回这个实例,否则创建一个值为 i 的实例并进行缓存,返回这个实例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: