您的位置:首页 > 编程语言 > Java开发

Head First Java笔记(二)

2016-07-13 21:42 344 查看

ArrayList与一般数组

1.一般数组在创建时必须确定大小,而ArrayList可以自动调整大小
new String[2]
new AyyayList<String>()


2.存放对象给一般数组是必须指定位置,而ArrayLIst可以指定索引值add(Int,Object),也可以不指定add(Object)
myList[1]=b;
arrayList.add(b);
3.数组使用特殊语法[方括号]
4.ArrayList是参数化的
ArrayList<String>
<String>是类型参数,代表String的集合。

使用函数库(Java API)

在Java的API中,类是被包装在包中。
要使用API中的类,你必须知道它被放在哪个包中。
你必须指明程序代码中所使用到的类的完整名称(包名+类名)

a.import
import java.util.ArrayList;

b.type
java.util.ArrayList<Dog> list = new java.util.ArrayList<Dog>();


包的重要性:
1.包可以帮助组织项目或函数库相对于一大堆零散的类,以功能来组织会比较好。
2.包可以制造出名称空间,以便错开相同名称的类。
3.包可以通过限制同一包之间的类才能相互存取以维护安全性。

除了java.lang(预先被引用的基础包)之外,使用到其他包的类都需要指定全名。
javax开头的包:曾经是标准版的扩展类,后来才取得标准名分的类。
import不会把程序变大或变慢,只是帮你省下类前面的包名。

继承与多态

子类继承父类的实例变量和方法,子类可以覆盖(Override)从父类继承的方法,但是不能覆盖实例变量。
JVM会从继承关系树的最下方开始搜索方法。
检验继承:是一个(IS-A)(适用于继承层次的任何地方)
存取权限:
private default protected public
子类会继承父类所有public类型的实例变量和方法,但不会继承父类所有private类型的变量和方法。
继承的意义:
1.避免了重复的程序代码
2.定义出共同的协议
运用多态时,引用类型可以是实际对象类型的父类。
用处:多态数组,多态参数、返回类型。
通过多态,可以编写出引进新型子类时不必修改的程序。

除内部类外,有三种方法可以防止么讴歌类被作出子类:
1.存取控制
2.final修饰符
3.让类只拥有private的构造函数

编译器会寻找引用类型来决定是否可以调用引用的特定方法,而JVM寻找的是堆上的对象。

覆盖的规则:
1.参数必须一样,返回类型必须兼容
2.不能降低方法的存取权限

方法的重载(overload):两个方法名称相同,参数不同。
重载方法与继承或多态无关,只是刚好有相同名字的不同方法。

重载:
1.返回类型可以不同。
2.不能只改变返回类型。
3.可以更改存取权限

接口与抽象类

抽象类:不能创建类的示例,但是可以使用抽象类来生命为引用类型给多态使用
含有抽象方法的类必须被标记为抽象类。
抽象类可以有抽象和非抽象的方法。
具体类必须实现所有的抽象方法。

Java中所有类都是从Object这个类继承出来的。它没有必须被覆盖的方法,所以不是抽象类。
Object类的目的:
1.作为多态让方法可以应付多种类型的机制
2.提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有类都会继承到)
3.线程同步化

编译器是根据引用类型来判断有哪些method可以调用的。



Java不支持“多重继承”的原因:
“致命方块”



解决方式:接口
接口的全部方法设为抽象,子类必须实现这些方法,因为这些方法都是public与abstract的。
public interface Pet{
public abstract void beFriendly();//接口的方法一定是抽象的,所以必须以分号结束,他们没有内容
public abstract void play();
}

public class Dog extends Canine implements Pet{
public void beFriendly()  {...}
public void play()  {...}
public void roam() {...}
public void eat()   {...}
}


当使用类作为多态类型时,相同类型必须来自同一个继承树,而且必须是该多态类型的子类。
而使用接口来作为多态类型时,对象可以来自任何地方(必须实现此接口)

如何判断该设计类、子类、抽象类或接口呢?

若新的类无法对其他类通过IS-A测试,就不设计继承。
只有在需要某类的特殊化版本时,以覆盖或增加新的方法来继承现有类。
当需要定义一群子类的模板,又初始化模板时,设计抽象类。
要定义类可以扮演的角色,使用接口。

构造器与垃圾收集器

堆(heap):所有的对象
栈(stack):方法调用和局部变量
实例变量:声明在类中,代表每个独立对象的“字段”。存在于所属的对象中。
局部变量:它和方法的参数被生命在方法中,是暂时的,生命周期只限于方法被放在站上的时期。
栈顶上的方法是目前正在执行的方法。
对象引用变量与原始数据类型变量都是放在栈上,对象本身都会在堆上。
对象的实例变量值攒在于对象中。如果实例变量是原始数据类型,java会依据原始数据类型为该实例变量留下空间。若实例变量是引用变量,Java只会留下饮用量的空间而不是对象本身的空间。

构造函数:是初始一个对象的时候执行的程序代码。
构造函数让你有机会可以介入new的过程。
构造函数不是方法,没有返回类型,不会被继承。
一定要有不需要参数的构造函数。
如果写了一个有参数的构造函数,则没有参数的构造函数必须手写,编译器只会在你没有构造函数的时候帮你写出无参数的构造函数。
重载构造函数:如果类有一个以上的构造函数,参数一定要不一样。(参数的类型和顺序不同而不是参数名)
实例变量有默认值:原始数据类型:0/0.0/false, 引用的默认值:null

构造函数链:在创建新对象时,所有继承下来的构造函数都会执行。
调用父类的构造函数:super()
如果我们没有调用super(),编译器会帮我们加上super()的调用。(编译器帮忙加的一定是没有参数的版本)
因为对suiper()的调用必须是构造函数的第一个语句,所以父类部分必须在子类创建完成之前完整的成型。
每个构造函数可以选择调用suiper()或this(),但不能同时调用。

对象的生命周期:
局部变量只会存活在声明该变量的方法中
实例变量的寿命与对象相同。
局部变量只有在声明它的方法在执行中(栈顶)才能被使用。
对于引用变量,最后一个引用消失时,对象会变成可回收的。
释放对象的引用方法:
1.引用永久的离开它的范围
2.引用被赋值到其他对象上
3.直接将引用设定为null

数字与静态

Marh的方法都是静态的,它的所有方法都不需要实例变量。
静态方法:static,不需要类实例,不能调用非静态变量和非静态方法,以类名称调用。
静态变量:它的值对于所有实例来说都相同。被所有同类实例共享。
静态变量:每个类一个。 实例变量:每个实例一个。
静态变量会在该类的任何对象创建之前就完成初始化。
静态变量会在该类的任何静态方法执行之前就初始化
静态的final变量是常数。(常数变量的名称应该要都是大写字母)
final:
final的变量代表你不能改变它的值,final的method代表你不能覆盖掉改method,final的类代表你不能继承该类。

autoboxing:
从5.0版本加入,可以自动将原始数据类型转换成包装过的对象
为什么不直接声明ArrayList<int>?generic类型的规则是你只能指定类或接口类型,但可以把包装对应的原始数据类型放进ArrayList。

数字的格式化:
java.util 的Formatter类提供
String.format("%,d",1000000000); →1,000,000,000
format(格式化串,要格式化的值)
%表示第二个参数的位置,",d"表示该参数要使用的格式。

要取得当前日期时间用Date,其余功能可以从Calendar上找。
Calendar cal = Canlendar.getInstrance();
你无法取得Canlendar的示例(不能用 new Calendar()),因为Calendar是抽象的,getInstance()返回的是具体子类的实例。
Canlendar:
字段会保存状态(如可以读取和设定year或month)
日期和时间可以运算。
日期和时间可以用millisecond 表示

静态的import
让你import静态的类、变量或enum时能少打几个字。(容易产生名称冲突)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: