Thinking in Java 笔记 - Part I

本文深入探讨Java的基础语法,包括关键字import static的使用,原始数据类型与对象类型的特性,以及运算符、字符串操作、switch语句的细节。此外,还详细讲解了初始化与清理过程,构造函数的作用,以及override、overload、overwrite的区别。最后,文章还介绍了访问控制的概念,包括private、protected等修饰符的使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一章 operators\controlling execution

  1. import static 关键字是直接导入某个类的所有变量和方法到本类,这样就可以直接在当前类中引用导入类的变量和方法
  2. 几乎所有的operator都只作用在原始数据类型上(primitives), 特别的, “=”, “==”, ”!=“作用在所有object上
    额外的,String类支持”+=", “+”
  3. Java数据类型分为原始数据类型和对象数据类型,原始类型如int、boolean、double,
    对象类型即为Java类的实例。如果将一个原始类型赋值给另一个变量,则会复制一份,各自修改值互不干涉。如果将对象类型赋值给另一个变量,则只是赋给它对象的引用(也就是指针),修改该对象的值两者都会修改
  4. == 比较两个对象是否同一个引用。而equals比较两个对象的值是否相同。
  5. 指数表示法:使用e或者E跟随一个整数值表示幂指数,如果是负值,则需要跟f或d表示小数。
  6. 如果为整数则跟L表示long,不跟则表示为int
    float expFloat = 1.39e-43f
    double expDouble = 47e47d // d is optional
    double expDouble2 = 47e47
  7. unsigned right shift >>>, shift同时能和 = 结合, 成为>>>= >>= or <<= <<<=
    8. swtich(c) 条件必须是int 或者char 类型,否则会编译错误(Java SE5)

第二章 Initialization & Cleanup

  1. Java与C的最大区别就是Java的销毁是自动的,由GC完成。
  2. 构造函数是一种特殊的method,因为其没有返回值
    void类的函数可以return nothing 也可以选择返回 something else.
  3. override、overload、overwrite:
    override(覆盖): 当子类从父类继承一个无参方法,而又定义了一个同名同参数列表(返回类型)的方法时,称为覆盖
    overload(重载):继承了父类的某个函数,同时建立了一个同名的但参数列表不同的方法,则称为重载(待修)
    overwrite(重写):当前类的方法,有许多同名,但是参数列表不同(顺序也算)
  4. 在Java中只能根据参数类型来区分同名函数,试想下面的例子:
    void f(){}
    int f(){}
    当你调用f()时,Java将难以分辨你调用了何种,因此,你不能使用return value来区分重载(*)方法。
  5. 非静态方法中默认隐含this以寻找对象,静态方法不含有this。
  6. 除了this.method(…)和super.method(…)的用法外,还能用this(…)来引用当前类的构造方法和super(…)来引用父类的构造方法。
  7. static method表示这个method里不含有this,所以不能在static method里调用non-static method。
    And putting the static method inside a class allows it access to other static methods and to static fields.
  8. GC只能释放new出来对象的memory, 而不能释放一些特殊申请的空间(比如用native methods?)
  9. 并不是所有的Java类都需要提供finalize()方法,只有在该类被销毁时,同时需要释放该类所拥有的一些资源时才需要添加,例如:
public void MyClass{
	  Connection conn;
	  public finalize(){
	    conn.close()
	  }
} 
  1. if the JVM isn’t close to running out of memory, it might not waste time recovering memory through garbage collection.
  2. finalize()可以用来检验一些条件,可以帮助检查一些bug是否发生,例如:
protected void finalize(){
	if(checkedOut){
		System.out.println("Something wrong here!");
	}
}
  1. 引用计数是垃圾回收的一种算法,建立一个全局计数器,记录每个对象的引用次数,如果为0则表示可以被回收。
  2. 回收时额外建立一份heap, 将需要继续使用的内存复制上去(基于chunk, big block),再将所有引用修正。
  3. 标记删除算法是垃圾回收的另一种算法,对于已经回收的对象标记它已经被删除了,下次需要的时候会先使用这些空间,这样避免了垃圾回收时内存对象移动带来的开销。
  4. JIT just-in-time compiler
  5. static first then non-static
  6. 可变变量 如果某一个参数后面跟一个省略号,则表示可以是任意个数的同类型变量。
  7. 如果有很多同名的函数,然而参数都只有可变数组类型,在可变数组为0个时,会导致编译器不知道决定使用哪一个函数。
  8. In fact, enums are classes and have their own methods.

第三章 Access Control

  1. 一个工作程序是一捆能被打包压缩进JAR文件的.class文件。JAVA解释器负责对这些文件的寻找,加载,解释。
  2. 包的名称由"."分割,第一个通常是报的组织名,如com、org、net等;第二个通常是公司名;第三、四个单词通常会使范围逐渐缩小。
  3. 编译后的Java类是按照包名为路径存储的,因此,命名空间有两个好处,一个是指定类的寻址方式,一个是指定类的存储方式。
  4. JAVA并不会总是访问当前路劲作为搜寻的起点。如果你不在CLASS PATH里将’.'作为其中一条path, Java并不会访问当前路径。
  5. 如果.java文件没有注上包名,都会被统一分配到"default package"下。所有在同package下的文件可以互相access, 所以"default package"下的文件有互相access的能力。
  6. private不能修饰类,只能修饰变量和方法。并且由private修饰的变量或方法,只能被该类自身所访问和修改,而不能被任何其他类(包括子类)来获取和引用。–最高级别保护
  7. 有时候你可能会想要控制一个对象的创建方式,并且防止别人直接接触一个特殊的构造函数,可以参考下面的例子实现:
class Sundae{
	private Sundae(){}
	static Sundae makeASundae(){
		return new Sundae();
	}
}

public class IceCream {
	public static void main(String[] args){
		//! Sundae x = new Sundae();
		Sundae x = Sundae.makeASundae;
	}
}
  1. protected修饰的成员变量可以被其他3种类所引用:该类自身、与它在同一个包中的其它类、在其他包中的该类的子类。
    使用protected修饰符的主要作用是允许其他包中该类的子类访问父类的特定属性。

  2. 不带修饰符的方法仅对同一个包中的任意类可见。

  3. 由于你不能用private修饰类,所以对类的访问控制只有两种选择:package access 和 public.

  4. 如果你不想让任何人接触某一个类,你可以使其所有构造函数都private。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值