thinking in Java ---03-06操作符&流程&初始化清理&权限访问
2015-04-06 16:07
267 查看
3操作符
equal() 比较值是否相等
== 比较是否是同一个对象。
逗号运算符,java中 for()循环使用
4流程控制
goto 跳转到指定的标签。
5初始化和清理
1。用构造器确保初始化。
2.方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。
方法重写
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
区别:
方法重载:就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同!
方法重写:它是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同!
this用法:
1、表示对当前对象的引用
2、表示用类的成员变量,而非函数参数,
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!
虽然夸张,但是却充分说明this不能在static方法中使用!
super
1.子类的构造函数如果要引用super的话,必须把super放在函数的首位.
2.在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名。
3.用super直接传递参数:
super和this的异同:
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,
基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;
如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
5)调用super()必须写在子类构造方法的第一行,否则编译不通过。
每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
6)super()和this()类似,区别是,
super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
7)super()和this()均需放在构造方法内第一行。
8)尽管可以用this调用一个构造器,但却不能调用两个。
9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,
其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
10)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
java中清理:
1.对象可能不被回收
2.垃圾回收并不等于析构
3.垃圾回收只与内存有关
无论是垃圾回收还是终结,都不保证一定会发生。
终结条件:
(1)发现无用信息对象;
(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
垃圾回收工作原理:
引用记数(reference counting)
这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。
引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被过长中断的实时系统来说有着天然的优势。
但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。
在现代的垃圾回收算法中,引用记数已经不再使用。
追踪算法(tracing)
基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象便是需要回收的垃圾。
追踪算法基于标记并清除.这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶段,未标记的对象被释放,并使其在内存中可用。
紧凑算法(compacting)
在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧张的JVM内存资源来说是非常不利的。由此出现了紧凑算法。
基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。
拷贝算法(copying)
这是另一种针对内存碎片的算法。基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用内存时,对该区域内存进行标记,并将标记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当前可用,继续执行该算法。
拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。
分代算法(geneational)
针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:
1.被大多数程序创建的大多数对象有着非常短的生存期。
2.被大多数程序创建的部分对象有着非常长的生存期。
简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。
分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每次经过年轻一代的垃圾回收总会有未被收集的活对象,这些活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。
分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许多JVM使用的垃圾回收算法。
适应算法(adaptive)
其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。
初始化顺序:
(1)父类的初始化>子类的初始化
(2)静态变量>普通变量>构造器。
(3)变量定义的顺序决定初始化的顺序。
(4)静态变量和静态块是一样的,变量和非静态块是一样的。即可以把静态块看作是静态变量,把非静态块看作是变量。
6访问权限控制
去的类成员访问权限:
1.类的该成员 设为public
2.类不加任何访问权限,置于同一包下
3.继承该类,
4.提供setter 和 getter方法
接口和实现
封装
equal() 比较值是否相等
== 比较是否是同一个对象。
逗号运算符,java中 for()循环使用
4流程控制
goto 跳转到指定的标签。
5初始化和清理
1。用构造器确保初始化。
2.方法重载
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
方法重载通常用于创建完成一组任务相似但参数的类型或参数的个数不同的方法。
方法重写
子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。
区别:
方法重载:就是在同一个类中,方法的名字相同,但参数个数、参数的类型或返回值类型不同!
方法重写:它是指子类和父类的关系,子类重写了父类的方法,但方法名、参数类型、参数个数必须相同!
this用法:
1、表示对当前对象的引用
2、表示用类的成员变量,而非函数参数,
3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!
虽然夸张,但是却充分说明this不能在static方法中使用!
super
1.子类的构造函数如果要引用super的话,必须把super放在函数的首位.
2.在Java中,有时还会遇到子类中的成员变量或方法与超类(有时也称父类)中的成员变量或方法同名。
3.用super直接传递参数:
super和this的异同:
1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)
2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)
3)super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,
基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)
4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;
如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)
5)调用super()必须写在子类构造方法的第一行,否则编译不通过。
每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
6)super()和this()类似,区别是,
super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。
7)super()和this()均需放在构造方法内第一行。
8)尽管可以用this调用一个构造器,但却不能调用两个。
9)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,
其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
10)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
11)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
java中清理:
1.对象可能不被回收
2.垃圾回收并不等于析构
3.垃圾回收只与内存有关
无论是垃圾回收还是终结,都不保证一定会发生。
终结条件:
(1)发现无用信息对象;
(2)回收被无用对象占用的内存空间,使该空间可被程序再次使用。
垃圾回收工作原理:
引用记数(reference counting)
这是一种不使用根集的垃圾回收算法。基本思想是:当对象创建并赋值时该对象的引用计数器置1,每当对象给任意变量赋值时,引用记数+1;一旦退出作用域则引用记数-1。一旦引用记数变为0,则该对象可以被垃圾回收。
引用记数有其相应的优势:对程序的执行来说,每次操作只需要花费很小块的时间。这对于不能被过长中断的实时系统来说有着天然的优势。
但也有其不足:不能够检测到环(两个对象的互相引用);同时在每次增加或者减少引用记数的时候比较费时间。
在现代的垃圾回收算法中,引用记数已经不再使用。
追踪算法(tracing)
基于根集的最基本算法。基本思想是:每次从根集出发寻找所有的引用(称为活对象),每找到一个,则对其做出标记,当追踪完成之后,所有的未标记对象便是需要回收的垃圾。
追踪算法基于标记并清除.这个垃圾回收步骤分为两个阶段:在标记阶段,垃圾回收器遍历整棵引用树并标记每一个遇到的对象。在清除阶段,未标记的对象被释放,并使其在内存中可用。
紧凑算法(compacting)
在追踪算法中,每次被释放的对象会让堆空间出现碎片,这会使得内存的页面管理变得非常不稳定,可能在还有足够内存空间时就发生溢出,这对于本来就紧张的JVM内存资源来说是非常不利的。由此出现了紧凑算法。
基本思想是:在追踪算法进行垃圾回收的基础上,每次标记清扫时顺便将对象全部整理到内存的一端,这样每次分配内存时便都能从顺序的空间开始。每次更新时,对象句柄都指向实际的对象,所有参考他的引用都将通过参考对象句柄来得到对象的实际位置。
拷贝算法(copying)
这是另一种针对内存碎片的算法。基本思想是:将内存划分为两块,一块是当前正在使用;另一块是当前未用。每次分配时使用当前正在使用内存,当无可用内存时,对该区域内存进行标记,并将标记的对象全部拷贝到当前未用内存区,这是反转两区域,即当前可用区域变为当前未用,而当前未用变为当前可用,继续执行该算法。
拷贝算法需要停止所有的程序活动,然后开始冗长而繁忙的copy工作。这点是其不利的地方。
分代算法(geneational)
针对拷贝算法的不足,有的最新JVM采用了分代算法。其思想依据是:
1.被大多数程序创建的大多数对象有着非常短的生存期。
2.被大多数程序创建的部分对象有着非常长的生存期。
简单拷贝算法的主要不足是它们花费了更多的时间去拷贝了一些长期生存的对象。
分代算法的基本思想是:将内存区域分两块(或更多),其中一块代表年轻代,另一块代表老的一代。针对不同的特点,对年轻一代的垃圾收集更为频繁,对老代的收集则较少,每次经过年轻一代的垃圾回收总会有未被收集的活对象,这些活对象经过收集之后会增加成熟度,当成熟度到达一定程度,则将其放进老代内存块中。
分代算法很好的实现了垃圾回收的动态性,同时避免了内存碎片,是目前许多JVM使用的垃圾回收算法。
适应算法(adaptive)
其主要思想是:在不同的条件下采用不同的回收算法。即动态改变垃圾回收策略。该算法对于垃圾回收的适应性和灵活性有着非常好的调整。
初始化顺序:
(1)父类的初始化>子类的初始化
(2)静态变量>普通变量>构造器。
(3)变量定义的顺序决定初始化的顺序。
(4)静态变量和静态块是一样的,变量和非静态块是一样的。即可以把静态块看作是静态变量,把非静态块看作是变量。
6访问权限控制
去的类成员访问权限:
1.类的该成员 设为public
2.类不加任何访问权限,置于同一包下
3.继承该类,
4.提供setter 和 getter方法
接口和实现
封装
相关文章推荐
- thinking in java笔记 6 访问权限控制
- Thinking in Java第三版读书笔记-第四章:初始化与清理
- Thinking In Java笔记(第五章 初始化与清理(二))
- Thinking in java 之'数据初始化'
- Thinking in JAVA笔记——第五章 初始化与清理
- thinking in java笔记 6 访问权限控制
- 【Thinking in java】运算符 & 流程控制
- Thinking In Java笔记(第五章 初始化与清理(三))
- 【Thinking in java】运算符 & 流程控制
- Java - Thinking in Java 第6章 访问权限控制
- java_think 第五章 初始化和清理
- C++和java对于 "多态 访问权限"的区别
- Thinking In Java 学习笔记 - 初始化与清理
- Thinking In Java笔记(第六章 访问权限控制)
- Java 继承访问权限与初始化
- 【学习笔记】Thinking in java (第三版)第四章 初始化和清除(Initialization & Cleanup)
- 《Java 编程思想》--第四章:控制执行流程,第五章:初始化与清理
- Thinking in Java 读书笔记-初始化与清理
- Thinking in JAVA笔记——第六章 访问权限控制
- Thinking in JAVA笔记——第三章 操作符 &第四章控制执行流程