欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java编程思想第四版——读书笔记1

程序员文章站 2022-07-12 17:57:56
...

所有的问题,我都希望能从书本中找到理论的支撑。我的学习方法,爱读书!

 

2.3 永远不需要销毁对象

2.3.1 作用域

P25 尽管以下代码在C和C++中是合法的,但是在Java中却不能这样书写:

{
    int x = 12;
    {
       int x = 56; //illegal
    }
}

编译器将会报告变量x已经定义过。所以,在C和C++里将一个较大作用域的变量“隐藏”起来的做法,在Java里是不允许的。因为Java设计者认为这样做会导致程序混乱。

2.5 方法、参数和返回值

P27

int x = a.f();

这种调用方法的行为通常被称为发送消息给对象。在上面的例子中,消息是f(),对象是a。面向对象的程序设计通常简单地归纳为“向对象发送消息

简单地一个解释,方便在画UML时,理解流程图。

3.7 关系操作符

P44 因为boolean值只能为true或false,大于和小于没有意义。等于和不等于适用于所有的基本数据类型,而其他比较符不适用于boolean类型。

3.8 逻辑操作符

P46 与 或 非 操作只可应用于布尔值。与在C及C++中不同的是:不可将一个非布尔值当做布尔值在逻辑表达式中使用。

可能需要变通了,例如 if( i != 0) 这样就是非0则是true了。
 

int i,j;

if( i && j ){ //这样是不正确的。

}

3.15 类型转换操作符

P55 Java允许我们把任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。

5.4.1 在构造器中调用构造器

P86 尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错。 【注意语法】

5.5.2 你必须实施清理

P88 相反,JAVA不允许创建局部对象,必须使用new创建对象。在Java中,也没有用于释放对象的delete,因为垃圾回收器会帮助你释放存储空间。【注意语法,主要这与C++不同行容易混淆,

局部变量 TestClass test = TestClass();

指针 TestClass * testp = new TestClass();

===>

引用 TestClass test = new TestClass(); 】

5.6 成员初始化

P91 Java尽力保证:所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译时错误的形式来贯彻这种保证。【注意语法,主要这与C++不同行容易混淆】

5.6.1 指定初始化

P93 如果想为某个变量赋初值,该怎么办?有一种很直接的办法,就是在定义类成员变量的地方为其赋值(注意在C++里不能这样做,尽管C++的新手们总想这样做)

public class InitialValue2{
    boolean bool = true;
    char ch = 'x';
}

5.7.2 静态数据的初始化 static

P95 static关键字不能应用于局部变量,因为它只能作用于域。

直接就弹编译错误了:Illegal modifier for the variable a; only final is permitted。出现这样的错,一般都是在方法中声明变量时提示,原因是用了public,private,static等修饰词去修饰方法内部变量,然而在java类的方法里声明变量时,他是只能用final修饰(only final is permitted)(或者不加修饰)。除此之外不能用其他的修饰符修饰,包括static也会报同样的错误。

public,private等是声明作用域的。方法内部定义的变量(只能在方法内部使用),在里面声明作用域无意义,也禁止声明。

但是在方法外面,是可以的。
5.7.4 非静态实例的初始化,代码块

P98 类中的代码块,用于初始化,它使得你可以保证无论调用了哪个显示构造器,某些操作都会发生。

与static 修改的代码块的区别,每次构造的时候都会执行。

老生常谈,程序的运行顺序:当new一个对象的时候,先执行了类中的代码块,后执行的构造函数。

5.8 数组初始化

int[]   al;

int   al[];

编译器不允许指定数组的大小。这里和C++区别挺大。

int a[2] = {0,1};
编译器会提示: Syntax error on token "2", delete this token

java的数组实际上都是new出来的。三种初始化方法:区别于C++的方法如下:

int[] list = new int[] {1,2,3,4};

5.9 枚举类型

讲的太肤浅了。建议参考如下

https://www.cnblogs.com/hyl8218/p/5088287.html

19章 会单独讲解enum,这里忽略了。

6.1 包:库单元

P110 

为什么一个java源文件中只能有一个public类?P121 6.4 类的访问权限

  1.每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用public类来表现。该接口可以按要求包含众多的支持包访问权限的类。如果在某个编译单元内有一个以上的public类,编译器就会给出错误信息。

  2.public类的名称必须完全与含有该编译单元的文件名相同,包含大小写。如果不匹配,同样将得到编译错误。

  3.虽然不是很常用,但编译单元内完全不带public类也是可能的。在这种情况下,可以随意对文件命名。

6.1.3 定制工具库

使用import竟然可以引入类中的方法!第一次见到。

import static net.mindview.util.Print.* ;   //注意Print 是类名。这个* 是类中的静态方法。


关于访问权限修饰符。===========================================

c++中
class A{
public :    //对成员的访问控制
   XXXXXXXXXXXXX
private :
   XXXXXXXXXXXXX
}

而Java中
public class A{   //java中有“类的修饰符”
public func1();
pirvate func2();
}

关于继承 ======================================================
C++中
class A : public B{
}

Java中
class A extend B