7C00.ME/houmu 2012-04-23

《Java程序设计语言(第4版)》阅读笔记(1)

说明,第一章名字叫“快速浏览”,简要的过了一般Java中的这几个基本概念和技术。虽然之前有自学过Java,也做了一段时间Android开发,但是对这里的一些基础内容还是之前不知道的和不很清楚的内容,简单做个笔记。

1 方法的几个概念

public static void main(String[] args)
{
//...
}

修饰符:public和static; 返回类型:void; 方法签名:方法名和参数列表,即main和String[] args; 方法头:修饰符、返回类型和方法签名,即public static void main(String[] args); 方法体:{}之间的代码; 方法声明:1-4行全部。

2 枚举类型

每个枚举常量都是一个指向其值所对应的对象的静态字段,而非整型数值。这个和C、C++中的枚举类型有些区别,而C#中的枚举类型是怎样的,记不甚清矣。

3 for循环

在初始化部分声明循环变量是for特有的,其他控制流语句不允许在语句内部声明变量(这个没注意过,也没试过)。而循环变量的作用域是循环体内。

4 创建对象和静态方法

实例化,分配到栈的内存区域;所有对象都是通过引用访问的。静态方法不能直接访问非静态成员,因为没有特定的对象,即this引用。

5 String和printf

String不是字符数组,不能将字符数组赋值给String引用,可以将字符数组作为参数给String构造方法创建String对象。String对象是只读或不可变的!

System.out.printf(“The value of pi is % .3f %n”,Math.PI);

这里的%n不等同于\n,会因操作系统而异!(这个一直不知道。)

6 覆盖override

做法是实现和超类具有相同方法签名和返回类型的方法。这里做了简单的实验,代码如下:

class A
{
    public void println()
    {
        System.out.println("A");
    }
}

class B extends A
{
    public void printlnB()
    {
        System.out.println("B");
    }
}

class C
{
    public static void main(String[] args)
    {
        new B().println();
    }
}

(1)这样的代码,直接编译执行,没有问题,显示的结果当然是A; (2)把Class B的printlnB改成println,编译执行,也没有问题,显示的结果是B,这很好理解; (3)接上,把Class B的println的public改成private,编译执行就会有编译错误了,报错截图如下图:

(4)接上,把new B().println();注释掉,编译报的上半部分的错误; (5)接(3),把new B().println(),改成new B().super.println()和new B().super().println()都没法通过编译(当然这样做可能没有什么意义,全当实验了)。 这里面还是有些东西可以去研究的,等看了专门的章节后在去实验。

7 注解

就是用@override什么的,书中给出了这种注解,当然没说清楚,暂时马克一下:

@Reviewed(reviewer = "Joe Smitch", date = 20050331)
// ... 

@interface Reviewed
{
    String reviewer();
    int date();
}

虽然在Android代码中常见到@Override,但一直没怎么注意,还有这种高级用法,怎么用,以后再看。

类有三种成员:字段、方法和嵌套类与嵌套接口。学习类,可以从这三种成员的声明、修饰符、初始化(包括类对象创建)和使用这些角度展开。这里主要讲的是字段和方法。

声明

字段的声明为,修饰符(可选)、类型名、字段名、初始化子句(可选); 方法的声明为,修饰符、返回类型、方法签名(方法名、参数列表)、异常和方法体。

修饰符

整理总结成了一张表,如下:

每一类修饰符,都可以展开成一个很庞大的话题,这里不展开了。表中,“是”表示可以有,“否”表示不适用。

初始化

字段初始化,最直接的就是使用初始化子句。字段初始化子句,可以是常量、其他字段和方法的调用。注意:(1)初始化子句必须保证类型正确;(2)初始化子句不能抛出异常。未被初始化的字段会被赋予默认的初始值。

对象初始化,必须显示初始化。初始化的方式是构造方法(书中称为构造器)和初始化段(类里面,除了字段、方法、嵌套类和嵌套接口之外的用{}包括的代码段,或者用static{}包括的代码段,后者又称静态初始化,显然只能对静态数据成员进行初始化)。

使用

这里有一点颠覆了我的认识,即Java中的方法都是按值传递的,没有按引用传递的。给个测试的例子代码,如下:

class A
{
    int v = 0;
}

class B 
{
    public static void main(String[] args) 
    {
        A a = new A();
        System.out.println(a.v);
        foo(a);
        System.out.println(a.v);
        foo2(a);
        System.out.println(a.v);
    }

    public static void foo(A a)
    {
        a.v = 1;
    }

    public static void foo2(A a)
    {
        a = new A();
        a.v = 2;
    }
}

如果按照以往的按引用传递的观点,输出的值应该是 0、1 、2(分三行显示,下同),而实际是 0、1、 1。这说明了,传递给foo2的参数a,仍然只是一个拷贝,也就是按值传递的意思。