张孝祥Java学习笔记(一)

这是其中一部分
------------
 当设计一种计算机语言时,经常要从以下几方面进行权衡:

 易用性与功能
 安全性和效率性
 稳定性和可扩展性
---------
有时老是把等号==写成赋值号=为了减少这种错误,我们在写程序的时候,如果要用等号时那就把常量写在前面例如 if(3==a) 这样即使错把 == 写成 = 在编译时会报错.

--------
  “&”和“&&”的区别在于,如果使用前者连接.那么无论任何情况.  “&”两边的
  表达式都会参与运算-如果使用后者连接.当”&&”的左边为false,.将不会计算其右边的表达式.另外|与||的区别也是一样的.
------------
移位不合改变变量本身的值。如a>>1:在一行语句中单独存在,毫无意义,因为它没
有改变a的值,也没有把它赋值给别的变量.作者在深更半夜编程时,常犯这惜误,也帮不少人排除过类似的惜误;
----------
大括号对的作用就是将多条语句组合成一个复合语句,作为一个整体来处理。
----------
对于if语句,还有一种更简 洁的写法:
变量=布尔表达式?语句1:语句2;
----------
  在Java中,if()和else if() 括号中的表达式的结果必须是布尔型的(即ture或者
false)这一点和C.C++不一样:
但在java中的switch语句判断条件可以接受int,byte,char,short型,其它的类型就不行了。
--------
注意不要混淆case与else if。else if是一旦匹配就不再执行后面的else语句,而case语句只是相当于定义了一个标签位置,SWITCH一旦碰到第一次CASE匹配,程序就会跳转到这个标签位置,开始顺序执行以后所有的程序代码,而不管后面的case语句是否匹配,后面case条件下的所有代码,而不管后面的case条件是否匹配,后面CASE条件下的所有代码都将被执行,直到碰到 BREAK语句为止。
而且CASE后面可以跟多个不用括号括起来的语句,当然也可以括起来。想一下这是为什么?
---------
do while 语句和 WHILE 语句差不多,但前者至少被执行一次。而且DO WHILE语句结尾有个分号而后者结尾是没有的,两者形式为:do{}while();    /   while(){}
---------
注意:在java语言的声明数组时,无论用何种方式声明数组,都不能指定其长度,例如下面的定义将是非法的.int a[3];//编译时将会出错
多维数组也是一样的,不能指出长度 int xx[3][3]={{3,2,4},{2,3,7},{7,8,8}};//编译时错
-----------
1.数组copy方法:System.arraycopy(source,0,dest,0,x);
2.数组排序方法: Arrays.sort        从小到大的顺序逐个排列,
3.arrSort.java
--------------
关于内存使用的情况在p63,最好再深入理解一下;
 以上为第一章和第二章的记录内容           
==============================================================================================

第三章 面向对象 上

--------------
当一个对象变成垃圾是指:引用这个对象的句柄不存在了,或它已经指向了别的对象.没有对应的句柄是对象变成垃圾的本质原因
-------------
注意对象间的比较:

    有两种方法  一种是用赋值符号'==',再一种是用 equals()方法;(注意:此方法在有的类中是static的而有的则不是)
要清楚的是前者比较的是引用变量的值即所指对象的内存首地址;而后者比的是两个对象中的内容是否相等.仔细思考一下这其中的不同之处.
-------------
理解什么是匿名对象?
new Person().shout();//这就是个例子
使用匿名类有两种情况:
1.对一个对象只需一次方法调用,这种情况可以使用匿名类,这样比较简单.
2.将匿名对象作为一个实参传递给一个立法.比如:abc(new Person());
-----------------
一个对象的属性即变量不应该随便被外界改来改去,就像一个车的速度,一个人的身高.不应该被外界改来改去.最好把它设为私有再由其自身的方法来改变自身的属性.而外界可通过其pulic方法来访问对象的属性.这也是现实世界中实体对象的最好反应;
例如:
getx();
setx();

-----------------
private是对类级别来说的,而在同一类级别中的不同对象里是不起作用的,所以同一类的不同对象之间是
可以调用对方的private成员.
----------
构造方法不同于一般方法的特征有3点:
1.它具有与类名一样的名称
2.它不含有返回值
3.它不能用return语句返回一个值
还有一点要注意的就是:它没有返回值但也没有void;如果有void那它就不再是构造方法了.
------------
--------------
构造方法就像是类这个皇帝派出的一个钦差大臣一样,它只是帮皇帝办事,但在外界看来他就代表了皇帝,所以构造方法也就和类一样的名子。皇帝只有一个但钦差可有几个。
---------------
    “构造方法”是非常有用的.它可以为类的成员变量进行初始化I作,当一个类的实例对象产生时,这个类的构
造方法就会被自动调用,我们可以在这个类中加入要完成它们初始化工作的代码.
-------------------------
重载构造方法能对 对象进行不同的初始化;
--------------------------
注意在书中的92页介绍了一个对象的产生过程.要好好的理解一下.看了一遍就感觉它很重要;
------------------------------

如果在一个类中定义了一个有参数的构造方法,最好再定义一个无参数的构造方法.因为我们常常习惯性地用无参数的构造方法来初始化一个对象.这样做可以有效地减少错误.给编程带来方便.也会减少很多错误
----------------------
3.4 好好地认识一下this这个关键字的作用.
在三种情况下我们不得不用this这个关键字.
1.我们想通过构造方法将外部传入的参数赋值给成员变量,而构造方法的形式参数与类成员的变量名相同,这时就需要this这个关键字来区别局部变量与类变量;
2.假设有一个容器类和一个部件类,在容器类的某个方法中要创建部件类的实例对象,而部件类的构造方法要接收一个代表其所在容器的参数,这时也要用到this
3.构造方法是在产生对象 时被自动调用的,我们不能在程序中像调用其他方法一样去调用构造方法但我们可以在一个构造方法里调用其他重载的构造方法,不是用构造方法名,而是用this(参数列表)的形式,根据其中的参数列表,选择相应的构造方法.
----------------------
3.5
finalize方法是Object类的一个方法,任何一个类都从Object那继承了这个方法。此方法只是在系统回收垃圾时才去调用的,
但不是所有的垃圾都被回收所以并不是每个对象的的finalize方法都被调用;
----------------------
构造方法是在对象产生之后才去调用它。(在C++中析构函数(在java没有析构方法但java中的finlize方法类似于C++中的析构函数)是在对象即将消亡之前去调用它;)
----------------------
java里有个System.gc()方法,我们可以调用这个方法来强制启动垃圾回收器来回收垃圾。例如下面的这个小程序:
public class PersonGc
{
 public void finalize()
 {
  System.out.println("the object is going!");
 }
 public static void main(String [] args)
 {
  new PersonGc();
  new PersonGc();
  new PersonGc();
  System.gc();//注意此方法调用与不调用会有什么不同;
  System.out.println("the program is ending!");
 }
}
------------------------
3.6
要注意:方法中的形式参数就相当于方法中定义的局部变量,方法结束它也就被释放了,不会影响别人;
-----------------
基本类型的变量作为参实传递,并不能改变这个变量的值;但引用类型却不是这个样子;;
------------------
关于类的静态方法的使用要注意三个问题:
1.不能访问非静态成员;
2.不能用this;super
3.main方法也有static方法的性质;
-------------------
也要注意一下静态代码块的作用。
它只在类被加载时执行一次;
常用来初始化类的属性
------------------
类被加载的时候也是它第一次被用到的时候。
所以一开始并不是所有的类都被加载
-------------------

3.8内部类p114
================
内部类可以直接访问嵌套它的类的成员,包括private成员,但是,内部类的成员却不能被嵌套它的类直接访问
和外部类不同的是内部类还可被声明为private和protected,public,default而外部类只能有public,default两种
------------------
在内部类中可以访问外部类的变量或方法,是因为在内部类中保存有对外部类的一个引用,当在内部类中访问一个变量或方法时而它又不能在它所在的内部类方法中和整个内部类中找到所要的变量和方法,那么它就会调用对外部类的引用来访问所要的变量和方法。

---------------
? 什么时候用内部类呢?
当一个类中的程序代码要用到另外一个类的实例对象,而另外一个类中的程序代码又要访问第一个类中的成员,将另外一个类做成第一个类的内部类,程序代码就要容易编写得多!这样的情况在实际应用中非常之多!
----------------
要注意:
1.非static的内部类中是不能声明static的成员的,例如:非static的类中是不能有static方法的。
2.static的内部类是不能访问外部类中的非static的成员变量的,基于此原因static的内部类很少使用;
3.还有一点就是static内部类在实例化对象时不用在new前别外加父类的对象引用了。
----------------------
public void doStuff(int size){

 size++;//引用的是本方法的形参
 this.size++;//引用的是内部类的成员变量
   Outer.this.size++;//引用的是外部类中的成员变量
}
-----------------------------

   内部类可以通过创建对象从外部类之外被调用.只要将内部类声明为public即可.
但是此时创建内部类的对象时,必须要外部类的对象参与。例如B是A的内部类
A a = new A();
A.B b=a.new B();//注意是a.new而不是单个的new
----------------------
注意:
final变量在方法运行结束后仍然存在。方法中的内部类可以访问这种局部变量。
//但是内部类能不能访问它所在方法中的其它局部变量呢?张孝祥说不可以,但我的课本上说可以但有限制,即必须在该方法运行还没有结束时可以,我认为这样也对//
---------------------
注意:javadoc.exe的用法。
---------------------
第四章 面向对象(下)p126


如果子类的构造方法中没有显式地调用父类构造方法,也没有用this关键字调
用重载的具他构造方法,则在产生子类的实例对象时,系统默认调用父类无参数的构造方
法.也就是说,在下面的类B中定义的构造方法中,写不写super()语句效果是一样的。
注意:
   由此可知当我们在给一个类定义带参数的构造方法的同时也要定义一个不带有参数的构造方法。这样可以免去它的子类在默认调用父类无参数的构造方法时出错。也就是说父类的无参数的构造方法参与了子类的构造方法的构成。
----------------------
注意:
子类不能继承父类的private属性和它的构造方法.
----------------------
final关键字的使用;
1.谁会用到final,类,属性和方法都可以 ;
2.被final标记的类是不能被继承的;
3.final标记的方法也不能被子重写;
4.被final标记的变量即成为常量,它是不能被改变的。
5.在方法中定义的内部类只能访问该方法内的final类型的局部变量,因为它的生命周期超出方法运行的生命周期。

------------------
在java中定义常量总是用Public static final的组合方式进行标记。这给编程带来了方便
-----------------------
注意:
在类中声明的final变量是无法在构造方法中赋值的。这一点一定要记住。下面这个例子可证明:
===============================================================================
//输出的结果是两个0 可见即使在类中的构造方法中再重定义a也是没用的,外界是看不到它的
class A{
 public static final int a=0;
 
 void A(){
  final int a=3;
 }
}
class FinalTestA{
 public static void main(String [] args){
  A obj=new A();
  System.out.println(A.a+" "+obj.a);
 }
}
=================================================================================
----------------------------
final和static小结:这两个关键字在java中的地位有些类似,仔细想一下
static:可用于:变量,方法,内部类。。。。。。。。。。。
final:可用于:变量,方法,类。。。。。。。。。。。。
还有一点要注意:这两个关键字在构造方法中是用不着的
----------------------------
4.2  P134
=========

---------------------------
什么是抽象方法?
没有方法体的方法
抽象方法的声明,要有abstract
==========================
注意:
抽象方法的定义形式;
abstract 返回值类型 方法名(参数列表)
要知道:static和final是不能用的;
==========================
-----------
抽象类?
含有抽象方法的类是抽象类。
抽象类的声明也要有abstract
这种类也用不着new
---------------------
抽象类的子类如果不能实现它的所有抽象方法,那这个子类也是抽象类
---------------------------
 接口:
声明形式
[public] interface interfaceNAME [extends listofInterface]{}
可见接口的访问控制只有public和默认两种
在接口中定义的变量默认有public 、final、 static的属性。而方法默认有public和abstract的属性
所以接口体中也只有final变量和抽象方法,也可以说只有常量和抽象方法。
另外接口中的变量和方法也可以被子接口隐藏和重写。
---------------------
要注意接口中的成员不能使用某些修饰符,transient、volatile synchronized、private、protect。

------------------
还有一点:
当类实现了一个接口中的方法是一定要在前面加public因为在接口中的方法是默认有public的要是不加会出现编译时错误;
---------------------
接口的作用:
接口是用来实现多重继承的。
------------------------
类要实现接口中的全部方法而抽象类就不一样了,可以只实现部分方法。
----------------------
C++中的多重继承的危险性在于一个类有可能从多个类中继承了一个方法的多重实现,而接口就不存在了,因为它没有实现方法体。

-----------------
4.3 P137
对象的多态
==============
这里有对象类型转换的精辟描述;
用男人是人,而人不一定是男人来说明类与其子类 的关系。
----------------------
父类转换成子类,不是将父类对象转换成子类对象,而是还子类对象以本来面目。
------------------------
这一点一定要注意:
强制类型转换的目的是让编译器放松警惕,开下后门放其过关,并不是要对内存大动手术,而是还子类对象以本来面目。
-----------------------
有时候我们不知道一个对象的确切类型,这时可用instance操作符来作个判断。是这样用的:
对象 instance 类(或接口)
返回值是布尔型的。
---------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书主要是冲着实际应用而来的,共分11章。在刚开始的第一章就详细地讲解了Java开发环境的搭建、反编译工具的使用、JDK文档资料的查阅,Java程序的编译、运行过程。在第二章中,全面地讲解Java的基本语法知识,对基本语法的讲解也不是泛泛而谈,而是在其中贯穿各种实际应用中的巧妙用法和注意事项。在第三章和第四章中,透彻系统地讲解了面向对象的思想和应用。在以后的章节中,用通俗易懂的手法,紧密联系实际应用的方式,深入浅出地讲解了多线程,常用Java类,Java中的I/O(输入输出)编程,GUI与Applet,网络编程等方面的知识。 本书许多内容都来源于程序员圈子里的非正式交流,或源于某些成功的案例与作者的经验、心得,但这些东西对新手来说,是很难自学到的。作者从事了多年的软件开发和培训教学,非常清楚那些容易使新手困惑的问题,在学习过程中会碰到的拦路虎,作者结合了多年实际开发与教学经验,收集了众多学员在学习中常提到的问题,对平时讲课的内容进行了精心整理。读者从本书中不仅可以学习Java本身方面的知识,还能学到了许多编程思想和实际操作手法,仿佛老手就在你面前进行现场演示一样。本书不仅全面的介绍了Java语言本身,最重要还交会读者去掌握编程思想,找到编程感觉,而不是死记硬背语言本身,书中涉及到的应用问题分析,远远超了一个Java程序员在学习和应用Java过程中所有可能碰到的问题。 本书不仅讲概念,讲怎么做,还告诉读者为什么;不仅讲操作技能,还贯穿一些系统的理论,这样读者才不至于不明不白,或是似乎明白,但不知道具体该怎么干。本书一步步引导读者深入,使读者轻松愉快、兴趣盎然、水到渠成、潜移默化地掌握Java编程及许多其他的软件开发思想。 本书语言流畅,内容翔实,分析透彻,是一本适合广大计算机编程爱好者的优秀读物。本书结构合理,图文并茂,实用性强,适合于广大有经验的开发人员来迅速转换到Java语言,对广大初学计算机编程语言的爱好者来说,这本书就是非常好的切入点。本书基本理论知识完备,又紧密联系实际开发,也非常适合作为大专院校师生的教学与学习用书,将给广大师生带来一种革命性的教学方式与学习思路,令人耳目一新。 这不是一本参考资料和Java百科全书,不是什么"宝典"和"大全",但却可以让新手变为老手,相信学完此书,再看任何以前看不懂的Java书都会显得非常轻松。即使是很有经验的老手,也能从本书中有巨大收益。如果你想非常轻松就精通Java编程,并期望学完便能参加实际的开发工作,本书就是你非常好的一个选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值