Head First Java(1)1-9章

2 类与对象

main()的两种用途:

(1)测试真正的类

(2)启动你的JAVA应用程序

真正的Java程序只会让对象与对象交互。此处所说的交互是指相互调用方法。

question 1:若需要全局变量或方法时该如何?

answer 在Java的面向对象概念中并没有全局变量这回事。然而实际上会有需要方法或常量可被任何程序存取。在任何类中的任何程序都可以存取public static的方法。任何变量只要加上public、static和final,基本上都会变成全局变量取用的常数。

question 2:如果能做出全局的函数和数据,那又怎么算得上是面向对象呢?

answer Java中的事物都必须待在类中。pi常数或random()方法也必须定义在Math这个类中。这类似全局的事物在Java中算是例外。它们是非常特殊的情况,不会有多个实例或对象。

3 primitive主数据类型和引用

局部变量:声明在方法中的变量。

变量有两种口味:清凉的primitive主数据类型(保存基本类型的值)与香辣的对象引用(保存对象的引用)。

类、方法、变量命名规则:

(1)名称必须以字母、下划线(_)或$符号开头,不能用数字开头。

(2)除了第一个字符以外,后面就可以用数字。反正不要用在第一个字符就行。


每一个包装对象都是不可变的(就是说它的状态绝不能改变),它存储一种当该对象被构建时设置的原值,并提供一种方法以重新得到该值。

4 方法操作实例变量

形参与实参:

方法会运用形参。调用的一方会传入实参。

实参是传递给方法的值。当它传入方法后就成了形参。参数跟局部变量是一样的。它有类型与名称,可以在方法内运用。

重点是:如果某个方法需要参数,你就一定得传东西给它。那个东西得是适当类型的值。

java是通过值传递,也就是通过拷贝传递的。


question: 如果想要传入的参数是对象而不是primitive主数据类型会怎样?

answer 在Java中所传递的所有东西都是值,但此值是变量所携带的值。引用对象的变量所携带的是远程控制而不是对象本身。若对方法传入参数,实际上传入的是远程控制的拷贝。

question: 可不可以忽略返回值?

answer 可以调用返回非void类型的方法而不必理会返回值,这代表你要的是方法的行为而不是返回值。

Getter 与Setter 执行get与set。Getter 返回实例变量的值。Setter 取用一个参数来设定实例变量的值。

数据隐藏(封装)

使用共有和私有两个存取修饰符。

封装的基本原则:将你的实例变量标记为私有,并提供共有的getter 与 setter 来控制存取动作。

(将实例变量标记为private,将getters 与setters标记为public)

实例变量与局部变量之间的差别:

  • 实例变量是声明在类内而不是方法中。
  • 局部变量是声明在方法中的。
  • 局部变量在使用前必须初始化。
  • 实例变量有默认值,局部变量木有。
变量的比较

使用==来比较两个primitive主数据类型,或者判断两个引用是否引用同一个对象。

使用equals()来判断两个对象是否在意义上相等。

==只用来比对两个变量的字节组合,实质所表示的意义则不重要。字节组合要么就是相等,要么就是不相等。

5 编写程序

  • 伪码
  • 测试码
极限编程(XP):是一种新型的软件开发方法论。它的构想结合了许多种“程序员真想这么做”的方法而成的。XP的推进力来自于客户会得到他想要的、想要的时候就能够取得甚至在开发过程后期变更规格时也是如此。

XP规则:

(1)多次经常性的小规模发布。

(2)避免加入规格没有的功能。

(3)先写测试用的程序。

(4)经常工作上下班。。。

(5)随时随地重构(refactor),也就是改善程序代码。

(6)保持简单。

(7)双双结伴进行工作,并经常交换伴侣以便让大家都清楚全局。

  • 真实码

7 继承与多态



有三种方法可以防止某个类被做出子类:

(1)存取控制。就算类不能标记为私有,但它还是可以不标记共有。(即protected类)非公有的类只能被同一个包的类作出子类。

(2)使用final修饰符。这表示它是继承树的末端,不能被继承。

(3)让类只拥有private的构造程序。

8 接口和抽象类

接口:100%纯抽象的类。
抽象类:无法初始化的类。
抽象的类代表此类必须要被extend过(非最底层),抽象的方法代表此方法一定要被覆盖过。
抽象的最大悲哀就是没有实体。抽象类不能产生对象,抽象的方法没有实体。
如果你声明出一个抽象方法,就必须将此类也标记为抽象的。不能再非抽象类中拥有抽象方法。
问 :Object这个类是抽象的嚒?
答:不是,至少不是正式的Java抽象类。因为它可以被所有类继承下来的方法都实现程序代码,所以没有必须被覆盖过的方法。
问:Object类是具体的。怎么会允许有人去创建Object对象呢?
答:因为有时候会需要一个通用的对象,一个轻量化的对象。它最常见的用途是用在线程的同步化上面。
Object类有两个主要的目的:作为多态让方法可以应付多种类型的机制,以及提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有的类都会继承到)。
当某个对象是以Object类型来引用时,Java会把它当做Object类型的实例。这代表只能调用由Object类中所声明的方法。若:
Object o = new Ferrai();
o.goFast();//非法
任何从ArrayList<Object>取出的东西都会被当做Object类型的引用而不管它原来是什么。
编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确实的类型。编译器只管引用的类型,而不是对象的类型。


(正是因为多重继承才出现的interface)

(切记:分号结束)

9 构造器与垃圾收集器

实例变量存在于对象所属的堆空间上。对象的实例变量的值是存放在该对象中。

当一个新建对象带有对象引用的变量时,是否需要保留对象带有的所有的对象空间?不是。Java会留下空间给实例变量的值。但是引用变量的值并不是对象本身,所以若CellPhone带有Antenna,Java只会留下Antenna引用量而不是对象本身所用到的空间。

问:如何分辨构造函数和方法?
答:Java可以有与类同名的方法。其中的差别在于是否有返回类型。构造函数不会有返回类型。

一定要有不需参数的构造函数。
编译器一定会帮你写出没有参数的构造函数嚒?NO 。。。编译器只会在你完全没有设定构造函数时才会调用。如果你已经写了一个有参数的构造函数,并且你需要一个没有参数的构造函数,则你必须自己动手写。

在Java API中有些类没有无参数的构造函数。
问:构造函数应该是公有的吗?
答:构造函数可以是公有、私有或不指定的。

父类构造函数被调用的过程:(先执行最老的)


调用父类构造函数的唯一方法是调用super()
(先调用,堆栈的过程,再一路执行、弹出回到原来的构造函数)

a:如果你没有编写构造函数
public ClassName(){
super();
}
b:如果你有构造函数但没有调用super
编译器会帮你对每个重载版本的构造函数加上下面这种调用
super();

对super()的调用必须是构造函数的第一个语句。


从某个构造函数调用重载版的另一个构造函数
this就是个对对象本身的引用。this()只能用在构造函数中,且它必须是第一行语句。每个构造函数可以选择调用super()或this(),但不能同时调用~!!!
(二王争霸,都要占据第一行,只存其一)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值