《Core Java》读书笔记
《Java核心技术 ·卷Ⅰ(原书第10版)》读书笔记!
field,域是一种属性,可以是一个类变量,一个对象变量,一个对象方法变量或者是一个函数的参数。(补充,class‘s variables,类的实例变量和静态变量称为class’s variables,类属变量,也称类变量或数据域,其实翻译成属性也可以,类属性,听起来不会怪怪的,来自百度百科)。
Java中的域说的就是类的成员变量,也叫属性,不是方法,还有对成员变量的操作要放在方法中.
类变量:在java中,类变量(也叫静态变量)是类中独立于方法之外的变量,用static 修饰。(static表示“全局的”、“静态的”,用来修饰成员变量和成员方法,或静态代码块(静态代码块独立于类成员,jvm加载类时会执行静态代码块,每个代码块只执行一次,按顺序执行))。
类变量:(静态变量)独立于方法之外的变量,用 static 修饰。(C++解释:类中定义的静态变量,这个变量属于这个类,为所有对象共有,所以叫类变量)
局部变量:类的方法中的变量。(C++解释:函数成员里面定义的变量)
实例变量:(全局变量、对象变量):独立于方法之外的变量,不过没有 static 修饰。(C++解释:类中的数据成员,即实例域)
java中的变量分为2种:一种是成员变量,一种是局部变量。
成员变量是在类内定义的变量,成员变量有分为两种,
如果是用static修饰的就是静态变量或者叫类变量;没有被static修饰就是非静态变量或者叫实例变量。
局部变量包括3种:
方法的形参,通过方法的调用进行赋值,并随着方法的结束而结束;
方法内的局部变量,必须在方法内对其进行显式的初始化,随着方法的结束而结束;
代码块内的局部变量,随着的初始化完成后开始生效,随着代码块的结束而结束。
静态工厂方法
创建类的实例的最常见的方式是用new语句调用类的构造方法。在这种情况下,程序可以创建类的任意多个实例,每执行一条new语句,都会导致Java虚拟机的堆区中产生一个新的对象。假如类需要进一步封装创建自身实例的细节,并且控制自身实例的数目,那么可以提供静态工厂方法。
例如Class实例是Java虚拟机在加载一个类时自动创建的,程序无法用new语句创建java.lang.Class类的实例,因为Class类没有提供public类型的构造方法。为了使程序能获得代表某个类的Class实例,在Class类中提供了静态工厂方法forName(String name),它的使用方式如下: Class c=Class.forName(“Sample”); //返回代表Sample类的实例 静态工厂方法与用new语句调用的构造方法相比,有以下区别。
(1)构造方法的名字必须与类名相同。这一特性的优点是符合Java语言的规范,缺点是类的所有重载的构造方法的名字都相同,不能从名字上区分每个重载方法,容易引起混淆。 静态工厂方法的方法名可以是任意的,这一特性的优点是可以提高程序代码的可读性,在方法名中能体现与实例有关的信息
这一特性的缺点是与其他的静态方法没有明显的区别,使用户难以识别类中到底哪些静态方法专门负责返回类的实例。为了减少这一缺点带来的负面影响,可以在为静态工厂方法命名时尽量遵守约定俗成的规范,当然这不是必需的。目前比较流行的规范是把静态工厂方法命名为valueOf或者getInstance。 l valueOf:该方法返回的实例与它的参数具有同样的值,例如: Integer a=Integer.valueOf(100); //返回取值为100的Integer对象 从上面代码可以看出,valueOf()方法能执行类型转换操作,在本例中,把int类型的基本数据转换为Integer对象。 l getInstance:返回的实例与参数匹配,例如: //返回符合中国标准的日历 Calendar cal=Calendar.getInstance(Locale.CHINA); (2)每次执行new语句时,都会创建一个新的对象。而静态工厂方法每次被调用的时候,是否会创建一个新的对象完全取决于方法的实现。
(3)new语句只能创建当前类的实例,而静态工厂方法可以返回当前类的子类的实例,这一特性可以在创建松耦合的系统接口时发挥作用,参见本章11.3.5节(松耦合的系统接口)。 静态工厂方法最主要的特点是:每次被调用的时候,不一定要创建一个新的对象。利用这一特点,静态工厂方法可用来创建以下类的实例。 l 单例类:只有惟一的实例的类。 l 枚举类:实例的数量有限的类。 l 具有实例缓存的类:能把已经创建的实例暂且存放在缓存中的类。 l 具有实例缓存的不可变类:不可变类的实例一旦创建,其属性值就不会被改变。 在下面几节,将结合具体的例子,介绍静态工厂方法的用途。 11.3.1 单例(singleton)类 单例类是指仅有一个实例的类。在系统中具有惟一性的组件可作为单例类,这种类的实例通常会占用较多的内存,或者实例的初始化过程比较冗长,因此随意创建这些类的实例会影响系统的性能。 Tips 熟悉Struts和Hibernate软件的读者会发现,Struts框架的ActionServlet类就是单例类,此外,Hibernate的SessionFactory和Configuration类也是单例类。 例程11-6的GlobalConfig类就是个单例类,它用来存放软件系统的配置信息。这些配置信息本来存放在配置文件中,在GlobalConfig类的构造方法中会从配置文件中读取配置信息,并把它存放在properties属性中。
java中的final与C++中的const的区别
(1)final在java中定义常量,可作用于基本类型或者类类型,若是作用于类类型,则此类类型不能作为父类被继承,也就是说它的下面不能有子类,这样的类叫做原子类。 C++中的const定义常量,
(2)Java中的final如果是对于基本类型,那和C++ const是一样的 但是如果是对对象而言,不同了 (3)final表示这个句柄是不可改变的 final Object obj=(Object)new String(“a”); obj=(Object)new String(“hello”);是非法的 但是依然可以调用obj的方法。如((String)obj).length()是合法的 而C++如果一个对象被定义成const,就不能调用对象的方法。除非这个方法被定义成const.
1 | package test; |
final,static,const在使用上有什么区别
final:
final修饰类:该类不可继承
final修饰方法:该方法不能被子类覆盖(但它不能修饰构造函数)
final修饰字段属性:属性值第一次初始化后不能被修改 使用final可以提高程序执行的效率,将一个方法设成final后编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。
static:
static修饰成员函数则该函数不能使用this对象
static不能修饰构造函数、函数参数、局部成员变量
static修饰成员字段则当类被虚拟机加载时按照声明先后顺序对static成员字段进行初始化。
static修饰语句块:当类被虚拟机加载时按照声明先后顺序初始化static成员字段和static语句块
static所修饰的方法和字段只属于类,所有对象共享,java不能直接定义全局变量,是通过static来实现的。
java中没有const,不能直接定义常量,是通过static final组合来实现的。
https://blog.csdn.net/yiziweiyang/article/details/52317330
浅析Java中的final关键字
https://www.cnblogs.com/dolphin0520/p/3736238.html
构造器和方法的区别
一般我们讲的“函数”就是“方法”;
构造函数=构造方法;
有些地方还将它称为构造子、构造器。
一般情况下,我们叫它构造函数或者构造方法。
https://blog.csdn.net/zqixiao_09/article/details/50550035
字面量、常量、变量
字面量是指由字母,数字等构成的字符串或者数值,它只能作为右值出现,所谓右值是指等号右边的值,如:int a=123这里的a为左值,123为右值。 常量和变量都属于变量,只不过常量是赋过值后不能再改变的变量,而普通的变量可以再进行赋值操作。
return:结束此方法
break:跳出此循环
//for each输出二维数组,看成数组的数组
for(int[] row : a) {
for(int b : row)
System.out.printf(“%4d”, b);
}
一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求。至于main()不是必须要放在public类中才能运行程序。
如果一个类定义在某个包中,那么package语句应该在源文件的首行。
如果源文件包含import语句,那么应该放在package语句和类定义之间。如果没有package语句,那么import语句应该在源文件中最前面。 import语句和package语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。
Java中所有继承都是公有继承。
==与equals
==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。
==比较的是2个对象的地址,而equals比较的是2个对象的内容。
关于Java引用类型变量
基本数据类类型存的是数值本身,而引用类型变量在内存放的是数据的引用,并不是数据的本身,引用类型变量是以间接方式去获取数据。引用类型变量都属于对象类型,如:数组、类、字符串等都属于引用类型变量。所以,引用类型变量里面存放的是数据的地址。
比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个String类型的空间,在运行时是 栈内存里的 s 指向堆内存里的那一块存储空间
Java中的语法糖
lang ->language
java.lang包是Java语言的核心类库,包括了运行Java程序必不可少的系统类,如基本数据类型、基本数学函数、字符串处理、线程、异常处理类等。每个Java程序运行时,系统都会自动地引入java.lang包,所以这个包的加载是缺省的。
Java4Android视频笔记
一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型
一个引用调用的是哪一个方法,取决于这个引用所指向的对象
抽象类可以有构造函数,因为子类调用它自己的构造函数时必定会调用父类的构造函数。
public:可以修饰类、成员变量、和成员函数,同一个包当中,或者不同包当中的类都可以访问(前面需要加包名)
private:可以修饰成员变量、成员函数,只能在本类当中使用
default(默认权限):可以修饰类、成员变量、和成员函数,包权限:只能在本包中使用
public>protected>default>private接口当中的方法都是抽象方法、public权限
《Core Java》读书笔记