Java编程思想学习笔记_3

  • 在继承的时候确保正确清理

  在清理方法中,还必须注意对基类清理方法和成员对象清理方法的调用顺序,以防止某个子对象依赖于另一个子对象的情形的发生.一般而言,首先执行类的所有特定清理动作,其顺序同生成顺序相反(通常这要求基类元素仍然存活.然后再调用基类的清理方法.

  • final参数

  Java允许在参数列表中以声明的方式将参数声明为final.这意味着无法在方法中更改参数的值.(引用无法更改参数指向的对象).

  • final和private关键字

  类中所有的private方法都隐式的被指定为final的,由于无法取用private方法,所以也就无法覆盖它.可以给private方法添加final修饰词,但这并不能给方法增加额外的意义.覆盖只有在能将一个对象向上转型并调用它的方法的时候才会出现,如果方法是private,则它不是基类接口的一部分,仅仅是隐藏与类中的程序代码,当声明一个public protected和包访问权限的方法的话,该方法不会产生在基类中出现的仅仅具有相同名称的情况.此时并没有覆盖方法,仅仅是生成了一个新的方法.下面的代码说明了这个问题:

public class Dad {
    private void say() {
        System.out.println("I am Dad");
    }
    public static void main(String[] args) {
        Dad d=new Son();
        //子类的Public访问权限的say相当于定义在子类的全新的方法,不符合动态绑定的情况,仍然使用父类的say方法
        d.say();//输出I am Dad
    }
}
class Son extends Dad{
    public void say() {
        //在子类中无法访问父类的private方法,private包装在子类对象内部的父类对象内,无法访问.
        //super.say();错误.无法访问,类的访问权限.
        System.out.println("I am son.");
    }
}
  • 初始化以及类的加载

  下面的代码提供了初始化的示例:

import static net.mindview.util.Print.*;
class Insect {
    private int i=9;
    protected int j;
    Insect() {
        print("i="+i+"j="+j);
        j=39;
    }
    private static int x1=printInit("static Insect.x1 initialized.");
    static int printInit(String s) {
        print(s);
        return 47;
    }
}
public class Beetle extends Insect{
    private int k=printInit("Bettle.k initialized");
    public Beetle() {
        print("k="+k);
        print("j="+j);
    }
    private static int x2=printInit("static Bettle.x2 initialized");
    public static void main(String[] args) {
        print("Beetle constructor:");
        Beetle b=new Beetle();
    }
}

  首先在Beetle上运行Java的时候,视图访问Beetle.main,于是加载器开始启动并找出Beetle类的编译代码,在对它进行加载的过程中,编译器注意到它有一个基类,于是它继续进行加载,不管是否打算产生一个基类的对象,这都会发生.

  接下来,根基类的static元素会被初始化,然后是下一个子类,以此类推.这种方式很重要,因为子类的static初始化可能会依赖于基类成员是否被正确初始化.至此,必要的类加载完毕,对象就可以创建了.首先对象中所有的基本类型都会设为默认值,对象的引用被设为null-然后基类的构造器会被调用,基类构造器和子类的一样,以相同的顺序经历相同的过程,在基类构造器完成后,实例变量按次序被初始化.最后,构造器的其余部分被执行.

  • 多态发生时的域

  只有普通的方法调用才可以是多态的.如果直接访问某个域,这个访问就在编译器开始进行解析:

class Super {
    public int field=0;
    public int getField() {
        return field;
    }
}
class Sub extends Super {
    public int field=1;
    public int getField() {
        return field;     //相当于return this.field.
    }
}
public class Test3 {
    public static void main(String[] args) {
        Super sup=new Sub();
        System.out.println("sup.field="+sup.field+",sup.getField="+sup.getField());  //sup.field=0,sup.getField=1
    }
}

  当Sub对象转型为Super引用的时候,任何域访问操作都将有编译器解析,因此不是多态的.Sub实际上包含两个称为field的域,它自己的和从Super处得到的.而在引用Sub中的field域时候所产生的默认域并非Super版本的field域.

时间: 2024-08-29 09:01:47

Java编程思想学习笔记_3的相关文章

【Java编程思想--学习笔记(一)】访问控制-包

Java编程思想–学习笔记(一) 访问控制(或隐藏具体实现)与"最初的实现并不恰当"有关. 1.包:库单元 我们之所以要导入包,就是要提供一个管理名字的空间机制. 每个java文件只能有一个public类.其他私有类为主public·类提供支持. 1.1 代码组织 与编译型语言不同,java可运行程序是一组可以打包并压缩成java文档文件(JAR,使用Java的jar文档生成器)的.class文件. 使用package和import关键字,使得不会出现名称冲突问题. 注意:java包的

JAVA编程思想学习笔记——第一章 对象导论

搞了一年多java,野路子出身,发现java基础这块还是相当的薄弱!故决定学习<Java编程思想>这本书.在此把学习的知识点记录下! 面向对象的五大特性 1.万物皆为对象 2.程序是对象的集合,它们通过发送消息来告诉彼此所要做的 3.每个对象都由自己的由其它对象所构成的存储 4.每个对象都拥有其类型 5.某一特定类型的所有对象都可以接收同样的信息  单根继承结构 所有的类都继承自单一的基类,Object.在单根集成结构中的所有对象都具有一个公用接口,所以他们归根到底都是相同的基本类型.单根集成

[Java编程思想-学习笔记]第3章 操作符

3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("Hello, world"); 我们都会感觉太冗长了,能不能简单一些呢?静态导入可以省略掉System,就像这样 import static java.lang.System.*; public class Hello { public static void main(String[] args) {

【java编程思想--学习笔记(四)】对象导论

写这篇博客的前言: 长话短说,我希望通过阅读<java编程思想>来使我的代码 简洁可用 . 目的的层次不同,首先具体的目标是,了解Java的特性和巩固Java的基础. 更抽象的目的如下: 1.期待以巩固基础的方式,使代码优美,简洁,高效. 2.使自己写的模块能够开放适度,好用. 3.形成一种对代码是否优美的审美观. 于是<Java编程思想>第一章 对象导论 由此开始. 1.1 抽象过程 java 相对于命令式语言的优势在于只针对于待解问题建模.后者所做的主要抽象要求所做问题基于计算

Java编程思想 学习笔记1

一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆对象. 2)程序是对象的集合,它们通过发送消息来告知彼此所要做的.要想请求一个对象,就必须对该对象发送一条消息.更具体的说,可以把消息想象为对某个特定对象的方法的调用请求. 3)每个对象都有自己的由其他对象所构成的存储.换句话说,可以通过创建包含现有对象的包的方式来创建新类型的对象. 4)每个对象都

[Java编程思想-学习笔记]第1章 对象导论

1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, Run Anywhere". 所谓的抽象过程,可以理解为对待解问题建模.比如待解问题是一个人,那么我们可以对人进行建模,它的类型是人,有属性姓名.性别.年龄,还有行为吃饭.走路.Java能直接完全据此建模编码,而无需考虑具体的计算机结构.所以当我们阅读Java程序时,正如书上说的"当你在

java编程思想学习笔记

1.equals和==的区别(P65) java主要有两类数据类型: 基本数据类型(原始数据类型),主要有八种:byte,char,short,int,long,float,double,boolean   他们之间的比较用"==",比较的是他们的值 复合数据类型   若用"=="对他们进行比较,比较的是他们在内存中存放的地址,也就是他们的句柄,除非他们是同一个对象,他们"=="的比较结果为true,否则为false. "=="

【java编程思想--学习笔记(三)】访问控制-接口实现与类的访问权限

接口实现 什么是数据类型? java中将数据和方法包装在类中,隐藏具体的实现,其结果就是一种数据类型.(封装产生数据类型) 联想到八大基本数据类型,都具有上述的特点. 由于数据类型的上述特点,创造者将权限的边界划在数据类型的内部,将希望被访问的数据和方法与不希望被访问到的方法和数据分开,隐藏不希望被访问到的方法和数据,实际上就实现了接口和具体实现的分离. 也就是说,了解一个类如何去用,懂得其内部公开的变量和方法就可以. 类的访问权限 上面讲的都是将访问权限设置在类的内部,也可以将访问权限修饰词放

Java编程思想 学习笔记12

十二.通过异常处理错误  Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的程序中没有未处理的错误. 1.概念 C以及其他早期语言常常具有多种错误处理模式,这些模式往往建立在约定俗成的基础上,而并不属于语言的一部分.通常会返回某个特殊值或者设置某个标志,并且假定接收者将对这个返回值或标志进行检查,以判定是否发生了错误.然而,对于构造大型.健壮.可维护的程序而言,这种错误处理