关于访问权限的理解
(一)定义访问控制权限的两大原因(尽量让成员都私有化):
1. 防止外部程序去修改类的成员,从而破坏该类的功能,比且是潜在性,该类的创建者还不知道被修改了
2. 对于私有化的成员,类创建者可以任意修改这些成员而不用担心对访问该类的外部程序带来任何影响。
(二)java和c++中访问控制权限修饰符所管范围的区别
Java中有private,包访问权限(无任何修饰词,默认情况),protected,public四种访问控制权限修饰符,而且每个修饰符只能管一个紧跟其后定义的字段
例如: public int a;
int b;
a的访问权限是public的,而b的访问权限是包访问权限
C++中只有private,protected,public三种访问权限,并且一个权限修饰符管到出现另外一个修饰符之前的所有字段
例如: public int a;
int b;
private int c;
a,b的访问权限都是public的,而c的访问权限是private的
(三)private只有在包含该成员的类里才能访问
包访问权限 在同一个包中的所有类都可以访问该成员
Protected 包含“包访问权限”,另外继承自该类的所有子类中也可以访问该成员(以父类实例或super的形式来访问该成员)。当继承的时候,父类中的所有方法和字段都传递给了子类包括访问权限
Public 所有类都可以访问该成员
以上所说的访问是指通过建立该成员所属类的对象来访问它,对于静态成员可以通过类名直接访问。
别名效应:多个引用指向同一个对象
(在方法中传递对象参数的时候,是传的引用,会自动调用别名机制。若要不让形参的修改影响到外部对象,就要用克隆方法)
l
关于向上转型的理解
一个类继承自另一个类的时候,产生差异的两种方式有两种:
(1)覆盖父类中的方法
(2)添加的新的方法
(1),(2)这两种情况下在向上转型过程中产生的影响如:
类A继承自类B,B中有方法t(),A覆盖了方法t()并且新添加了方法q()
那么 B b = new A();//向上转型
b.t(),此时调用的是覆盖后的方法t()体现了多态性
b引用无法访问方法q(),因为在向上转型时失去了子类中新添加的成员
在向上转型中会涉及到多态这个特性
而java是缺省情况下实现多态性的
C++则是需要为那些想具备多态功能的方法添加virtual关键词,它缺省情况下并不是多态的。
Java中的多态机制,实现原理是通过对象所存储的信息来计算所调用方法的实际地址。
l
关于抽象类和接口的理解
抽象类和抽象方法是通过abstract关键字来加以标示的。
Java
中不可以实例化一个抽象类对象的。
抽象类中可以不包含任何抽象方法,但是抽象方法只能存在于抽象类中,即一个类中如果有一个抽象方法,那么这个类一定要声明为抽象类。
当一个类继承自抽象类时,一定要实现其抽象方法,否则该子类还是抽象类。
接口比抽象类更进一步,接口中所有的方法都是抽象方法,不需要实现。
接口也一样不可以实例化的。同时可以实现多个接口,但是不能继承多个抽象类。
编程时建议实现接口而不要继承抽象类。
l
关于堆和堆栈(栈)的区别
栈分配:空间小,系统自动分配,速度快,但是需要在编译时期就明确所存放的变量的类型,数目,和生存周期。栈的存储空间是连续的,通过上移栈指针来分配空间,下移栈指针来释放空间。
堆分配:空间大,空间不连续,通过链表将不连续的空闲内存空间组织在一起,进行堆分配。分配比较灵活,由程序员通过new 一个对象来手动分配空间。所存放对象的类型,数目,和生存周期是在运行时才知道的。所以系统不能自动释放堆空间,像在c++中要通过delete方法来释放空间。而java的特点有一个“垃圾回收机制”,它可以自动将那些不再被使用的对象所占据的堆空间释放掉。所以不用担心内存泄露的问题。也不需要手动来释放空间。虽然堆分配的空间比较大,但是速度要比栈分配慢许多。如果所存放的对象比较大,那这些时间上的耗费影响不大。
Java
中的所有对象都是存放在堆中的,而引用变量和基本类型的变量都是存放在栈中的。
至于c++中的堆和堆栈的区别大体相似,可以参见网页
http://www.cppblog.com/oosky/archive/2006/01/21/2958.html
l
单根继承结构
单根继承结构指的是java中所有对象都隐含得继承自Object类,也就是说向上转型到终极程度时,每个对象都是object类型的。
这种方式可以使“垃圾回收机制”的实现更加容易,即可以在基类Object中定义finalize()方法(当然在每个子类中也可以覆盖Object的finalize方法),垃圾回收器可以通过给每个对象发送该消息(调用finalize方法)来实现对象的释放。
l
向下转型和参数化类型
参数化类型是在
JDK1.5版本以后引入的,借鉴了C++的模板机制。
当我们使用容器类的时候尤其会涉及到向下转型这个概念。因为java中容器里存放的是Object对象,而由于单根继承方式,所有对象都可以向上转型为Object对象,但是当我们取出容器里元素的时候就必须用到向下转型才能得到该对象原先的类型,向下转型是一个不安全的操作,如果我们不清楚当前对象的确切类型的话。如果向下转型错误的话,会抛出运行时异常。
但是当我们想容器里只存放一种类型的对象序列时,就可以通过参数化类型机制来实现,这样就避免了向下转型带来的危险。同时在往容器里添加元素的时候也会自动进行类型检查了。参数化类型可以通过下面的方式来实现:
ArrayList<E> list = new ArrayList<E>{}
list.add(e);//e只能为E类型的变量
E e = list.get(i);//不需要类型转换
但是如果当我们要求容器里的元素存在不只一种类型的时候就不可以使用参数化类型机制了
l Java为什么如此成功和与C++的比较
(一)Java为什么如此成功可以归纳以下4方面:
1. 用java开发的系统易于表达和理解
2. java拥有强大的类库,使用时你只需关注该类库可以做什么,而不必关心是怎么实现的
3. 错误处理机制,java内置了错误处理机制,使得你必须对产生的错误做相应处理,系统更加安全了。不像C中,无法处理错误的时候就只是忽略过去。开发出来的系统安全性不够高
4. java可以用来编写大型程序,而且开发起来也比较简单,因为它可以将问题用面向对象的思想来表述,更加清晰,也更加简单了。
(二)Java与C++的比较:
Java中有了垃圾回收机制,所以更加安全,编程时也更加简单不需要考虑手动回收垃圾,但是带来的代价是运行时开销大,运行速度要慢些。还有一个优点是,java的跨平台性很好。
C++,需要手动来释放内存空间,所以安全性不高,尤其是开发大系统时,复杂性很高。但是带来的好处是性能上要好很多,运行速度比java快很多。至于跨平台性要比java差。
最后开发项目时到底选取哪种语言,还是取决于你的要求和语言本身特性之间的匹配。要好好权衡。