现在的位置: 首页 > 综合 > 正文

java学习笔记(2)

2014年09月17日 ⁄ 综合 ⁄ 共 1827字 ⁄ 字号 评论关闭

1.java 中的类、超类、子类  

(1)java中子类不能直接访问超类的私有域(私有属性,私有方法)。如果子类一定要访问私有域,必须借助于共有的接口(比如public修饰的方法)。如果子类复写了超类的方法,要想调用超类的被覆写的方法,需使用特定的关键字super,否则将会导致无限次地调用自己,知道整个程序崩溃为止。

(2)在覆盖一个方法的时候,子类不能低于超类方法的可见性。特别是,如果超类方法是public,子类方法一定要声明为public。经常会发生此类错误:在声明子类方法的时候,遗漏了public修饰符。此时,编译器将会把它解释为试图减低访问权限。

  (3)由于子类不能继承超类的构造方法,因此在子类的构造方法中,对继承的超类成员可以通过调用超类的构造方法完成。当子类定义了带参数的构造方法,使用这些参数来完成对继承的成员变量的初始化,要在子类构造方法的第一行显式的(通过super)调用超类的构造方法作为对子类对象初始化的一部分,尤其是当超类重载构造方法(多个构造方法)时,必须给super()提供合适的参数,如果在子类构造方法中没有通过super显式调用超类构造方法,并不是不调用超类的构造方法,而是隐式的调用超类无参的构造方法.在这种情况下,如果超类没有无参的超类构造方法,将导致编译错误!

(4)关键字this的两个用途 :一是引用隐式参数,二是调用该类其他的构造器。

super 也有两个用途:一是调用超类的方法,二是调用超类的构造器。

有人认为super与this引用是不同的概念:super不是一个对象的引用,不能将super赋给另外一个对象变量,它只是一个指示编译器调用超类方法的   特有关键字。  
   

2.对象克隆 

当拷贝一个变量时,原始变量与拷贝变量引用同一个对象,就是说,改变一个变量所引用的对象将会对另一个变量产生影响.
Employee original =new Employee("John",50000);
Employee copy=original;
copy.raiseSalary(10); //oops-- also changed original
如果创建一个对象的新的copy,它的最初状态与original一样,但以后将可以各自改变各自的状态,那就需要clone 方法.
Employee copy=original.clone();
copy.raiseSalary(10); //ok--original unchanged

不过,clone 方法是Object类的一个proteced方法,也就是说,在用户编写的代码中不能直接调用它.只有Employee类才能克隆Employee对象.这种限制有一定的道理.查看一下Object类实现的clone方法.由于这个类对具体的类对象一无所知,所以只能将各个域进行对应的拷贝.如果对象中的所有数据域都属于数值或基本类型,这样拷贝与没有任何问题.但是,如果在对象中包含了子对象的引用,拷贝的结果会使得两个域引用同一个子对象,因此原始对象与克隆对象共享这部分信息.

如果原始对象与千客隆对象共享的子对象是不可变的,将不会产生任何问题:例如,子对象属于像String类这样的不允许改变的类;也有可能子对象在其生命期内不会发生变化,既没有更改它们的方法,也没有创建对它引用的方法.

然而子对象可变的情况,必须重新定义clone方法,以便实现克隆子对象的深拷贝.在列举的实例中,hireDay域属于Date类,这就是一个可变的子对象.

类必须1) 实现Cloneable接口 2)使用public访问修饰符重新定义clone方法.

注意:在这里,Cloneable接口的出现于接口的正常使用没有任何关系.尤其是,它并没有制定clone方法,这个方法是从Object类继承而来的.接口在这里只是作为一个标记,表明类设计者知道要进行 克隆处理.如果一个对象需要克隆,而没有实现Cloneable接口,就会产生一个已检验异常(checked exception).

3.内部类*

内部类是定义在另一个类中的类.其作用:
1)内部类方法可以访问该类定义所在的作用域中的数据,包括私有的数据.
2)内部类可以对同一个包中的其他类隐藏起来.
3)当想要定义一个回调函数且不想编写大量代码时,使用匿名内部类比较便捷.
有时候,使用内部类只是为了把一个类隐藏在另外一个类的内部,并不需要内部类引用外围类的对象.为此,可以将内部类声明为static,以便取消产生
的引用.


抱歉!评论已关闭.