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

java基础问题总结

2014-06-11 11:45 141 查看
1. Int,double类型是否是一种类?

不是。

一般参考书上都会说Java是一种完全面向对象的语言,其实这会带来一定的误解。Java中有个叫Object的类,它是所有类的基类(超类)。读者很容易认为像int,double这种类型,也是继承Object的类,其实这种看法是错误的。像int这种基本类型并不是继承Object的。确切的说,Object是除基本类型外的所有类的超类(除了基本类型,其他都是类,string也是类)。

2. 方法的参数是如何实现的?

是通过传值实现的,而不是引用调用。Java中的变量有两种:1.基本数据类型(如int,double,bool等 2.对象引用。其中基本数据类型,比如int a,在声明变量a时,为a开辟了空间,a代表的就是这个实例(开辟的内存本身),这个实例是存放在栈中的。而对象引用,如对于子类ChildObject,当声明ChildObject时,如ChildObject a,此时并未开辟内存空间,a仅仅是代表指向类型为ChildObject类的引用。如果此时调用a的方法,如a.function时会报错,因为此时对象实例还没有,要创建对象实例,需要写ChildObject
a = new ChildObject. 对于类而言,对象实例存放在堆中,而对象引用存放在栈中(和基本类型一样,其实这个对象引用就等于是对象实例的地址,即指针)。

对于方法如,functions(int x),我们是通过传值实现的,即将实参复制一份给形参,这样对于基本类型的实参,通过function(int x)是无法改变实参值的。要改变实参的值必须想其他办法了。对于方法如function(object x),是一样的传值,对与实参复制一份传给形参,当然由于x代表的是对象引用,并不是像基本类型数据,是实例本身,故这里形参与实参同时指向一个对象实例,当对形参起作用时,对象实例会发生变化,这样就会影响到实参。

3. 静态方法与静态域的理解

静态方法与静态域是类的属性,而不是具体对象的属性,如果在类ChildObject中定义静态方法Static function(int a),那么就可以直接用ChildObject.function(a)来调用静态方法,当然也可以用ChildObject的对象来调用这个方法,如ChildObjectb,然后b.function(a)。我们需要注意的是,实域以及非静态方法是属于对象所有,而不是类所用,这说明要调用非静态方法或者实域就必须首先创建出对象才行。

Java语法中对静态方法有规定:静态方法不能直接引用非静态方法以及实域,注意这里只是不能直接引用,并不是说不能引用,例如对于如下静态方法:

Public static void main(String[] args)

{

ChildObject a = newChildObject;

a.function(); //这里function是非静态方法。

}

4. 对象的创建过程

静态方法可以在对象未创建前就执行,因为静态方法并不属于特定的对象,故它不需要在构造函数之后才执行。当然对于类的方法而言,它仅仅是代表一种处理手段,而不是说一定要去执行,这一点是我的一个思维误区。类中的一个例外是main函数,它在类中是执行的。每一个类都有main函数(作为程序入口函数,也有特别的类没有main函数),main函数同时也可以用来测试每个类用。

对象的创建过程为以下4步:

1) 所有数据域被初始化为默认值(0,false或null)

2) 按照在类声明中出现的次序,一次执行所有域初始化语句和初始化模块。

3) 如果构造器第一行调用了第二个构造器,则执行第二个构造器主体

4) 执行这个构造器的主体。

说明:与c++不同,java中的域可以不在构造函数中初始化,可以写域的初始化模块,且初始化模块式在构造函数之前执行。

5.Clone的使用方法

Clone是Object中的一个方法,是protected类型,它的用处是明显的,即传统的赋值方法(=)仅仅是将对象引用复制了一下而已,当对复制后的对象引用进行操作时,会影响到对象本身,从而影响原先的对象引用。而利用clone方法可以产生两个一样的对象实例,这样就不会相互影响。

然而在写clone时,会遇到一个问题,就是深拷贝与浅拷贝的问题,默认是浅拷贝,仅仅将对象用等号操作了一下而已,如果要深拷贝的话就必须重写clone函数,另外由于clone在Object中的protected类型的,故在其子类中,如果要用到clone,则改写时需要将类型改成public。

为了能够利用到instance of 这条语句,ainstance of A 可以用来判断a是否是A的实例,这里A可以是类,也可以是接口。

要clone的类为什么还要实现Cloneable接口呢?Cloneable接口是一个标识接口,不包含任何方法的!这个标识仅仅是针对Object类中clone()方法的,如果clone类没有实现Cloneable接口,并调用了Object的 clone()方法(也就是调用了super.Clone()方法),那么Object的clone()方法就会抛出 CloneNotSupportedException异常。

我们可以通过ainstance of Cloneable来判断a是否可以克隆。

6.final问题

当final对类进行修饰时,说明这个类不能被继承的。这个类中的域可以是final,也可以不是。对于final类的方法,它默认就是final了,不能更改。对于域而言,如果加了final,说明它是个常值,不能被改变。

7. 抽象类与接口

抽象类中定义的抽象方法,和接口中给出的方法一样,在子类继承时,必须要重写(这是Java中的规定,不重写会报错)。对于抽象类而言,抽象函数一定不能是privatae,不然就不能重写了;对于接口而言,不能包含实域和静态方法,方法一定是public类型的,并且接口方法默认是abstract的。

Abstract与static是矛盾的,不能共用,因为写了abstract就意味着要求子类重写,而static是只能继承,不能重写。那么为什么static不能重写呢?因为对于静态方法,在编译时就已经定了,这样就不能动态绑定了。

8. 访问问题

修饰符public,protect,private,以及默认的不加修饰。它代表的是不同的可见范围,注意这要和import包区分开来,可见的前提就是要求先import,然后才能讨论可见问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: