学习笔记(三)复用类

《Java编程思想》整理的一些学习笔记,不喜勿喷。

1.  toString()方法。每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你却只有一个对象时,该方法就会被调用。例:

public class Test {
private String s ;
Test(){
s = new String("Hello");
}
public String toString(){
return s ;
}
public static void main(String[] args){
Test a = new Test();
System.out.println(a);
}
}


此时System.out.println()接收的是一个对象引用,这种情况下就会调用toString()方法,将字符串变量s输出。

2. 子类如果想调用基类中的方法,需要用到关键字super,不能直接调用,否则会产生递归,这并不是我们所希望的。在继承 的过程中,并不一定非得使用基类的方法,也可以在子类中添加新方法。继承并不只是复制基类的接口,当创建了一个子类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。二者却别在于,后者来自外部,而基类的子对象被包装在子类的对象内部。对基类子对象正确初始化很重要,且仅有一种方法:在构造器中调用基类构造器来执行初始化,基类构造器具有执行基类初始化所需的所有知识和能力。Java会自动在子类的构造器中插入对基类构造器的调用。

class Root{
public Root(){
System.out.print("Hello");
}
}
public class Stem extends Root{
public Stem(){
System.out.print("World");
}
public static void main(String[] args){
new Stem();
}
}

在例中输出为: Hello World 。 可见,先调用基类构造器,再调用子类构造器。如果想调用一个带参数的基类构造器,就必须用super关键字显示的编写调用基类构造器的语句,并配以相应的参数列表。语法为:在子类的构造器中加入 super(参数)。

3. Java的基类拥有某个已被多次重载的方法名称,那么在导出类中重新定义该方法名称并不会屏蔽其在基类中的任何版本。因此,无论是在该层或者它的基类中对方法进行定义,重载机制都可以正常工作。

4. 组合和继承都允许在新的类中放置子对象,组合是显示的这样做,继承是隐式的做。组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非嵌入对象的接口。为取得自效果,需要在新类中嵌入一个现有类的private对象(详细区别参阅:分类:Java相关知识中转载的组合和继承的帖子)。

5. 向上转型:把某个对象的引用视为其基类型的引用的做法,即对象既可以作为它自己本身的类型使用,也可以作为它的基类型使用。向上转型是从一个较专用的类型向较通用的类型转换,所以很安全。在向上转型的过程中,唯一可能发生的事是丢失方法。

6. final 关键字。(1)final 数据,在Java中,用final定义常量时,这类常量必须是基本数据类型,定义为public,则可以被用于包之外,定义为static,则强调只有一份,定义为final,则说明它是一个常量。注意,带i有恒定初始值的final static基本类型全用大写字母命名,并且字与字之间用下划线隔开。当对对象引用运用final时,引用恒定不变,对象可以变(值),只是指向该对象的引用一直指向该对象。这一限制也适用于数组。Java允许生成“空白final”,即被声明为final但却没有赋值,不过编译器都会保证在其使用前被初始化。必须在字段定义处或者每个构造器中用表达式对final进行赋值,这正是final字段在使用前总是被初始化的原因。(2)final 方法,使用final方法的原因有两个:一是想确保在继承中使方法行为保持不变,并且不会被覆盖。二是效率。private方法都被隐式的指定为final类型的。(3)final 类,当某类被定义为final时,这意味着不打算拥有子类,永远不要改动。

7.继承与初始化。在运行Java文件时,第一件事情就是访问mian方法(一个static方法),于是加载器开始启动被找出该类的编译代码(它被编译到了一个名为.class文件之中)。在对它进行加载的过程中,编辑器注意到它有一个基类,于是它继续进行加载。不管你是否打算产生一个该基类的对象,这都要发生。如果该基类还有其自身的基类,那么第二个基类就会被加载,如此类推。接下来,根基类中的static初始化即会被执行,然后是下一个导出类,以此类推。这种方式很重要,因为在导出类的static初始化可能会依赖于基类成员能否被正确初始化。至此为止,必要的类都已经加载完毕,对象就可以被创建了。首先,对象中所有的基本类型都会呗设为缺省值,对象引用被设为null——这是通过将对象内存设为二进制零值而一举生成的。然后,基类的构造器会被调用,之后子类的构造器被调用。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值