《Head First Java》(点击查看详情


1、写在前面的话

这本书的知识点说实话感觉有点散乱,但是贵在其将文字转换成了生动和更容易接受的图片,大量的比喻让人感受到了知识点的有趣之处,让学习不再那么枯燥无奈。

掌握了Java的一些基础之后,现在回过头来再看这本书,依然觉得收获颇丰,于是便把那些让人印象深刻的地方记录下来,总结、思考和分享,出于精力和效率,这里就不再细致地去罗列和整理每个知识点了(作为强迫症不得不说真的有过这样的想法,可是想着未来还有好多书要看,每本都流水一样地写,我得把自己弄疯掉)。

2、类与对象

类和对象到底有什么区别?类,其实就是用来创建对象的模型。女娲造人,只需要知道是有胳膊有腿的人类就好了(类),至于捏出来的是帅哥还是美女,高大还是矮小,那又是另一个概念了(对象)。

3、认识变量

Java中的变量有两种类型:primitive主数据类型(即我们常说的基本数据类型)和引用(引用数据类型)。不论是哪种数据类型,在Java面前都要求严格遵守它的管理规则,不允许类型之间的胡乱转换,比如是绝不会允许把长颈鹿类型变量放进兔子类型变量中去。接下来,我们就来分别认识这两种数据类型,和他们之间的一些变换规则。

3.1 主数据类型(基本数据类型)

变量就像杯子,不同的数据类型,往往代表了它们杯子不同的大小容量。这个大概是我目前认识到的最有意思又贴切的比喻了,因为这生动地让我明白了类型之间的转换意义。

我们都知道,基本数据类型之间的运算是存在类型转换的,特别是自动转换,其实在运算时有以下规则(由低到高转换):
  • 所有的byte、short、char型的值将被提升为int型;
  • 如果有一个操作数是long型,计算结果是long型;
  • 如果有一个操作数是float型,计算结果是float型;
  • 如果有一个操作数是double型,计算结果是double型。

顺便来看道题吧:
//下列代码片段中,存在编辑错误的语句是?
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*语句1*/
b6=b4+b5; /*语句2*/
b8=(b1+b4); /*语句3*/
b7=(b2+b5); /*语句4*/
System.out.println(b3+b6);
8
 
1
//下列代码片段中,存在编辑错误的语句是? 
2
byte b1=1,b2=2,b3,b6,b8;
3
final byte b4=4,b5=6,b7;
4
b3=(b1+b2);  /*语句1*/
5
b6=b4+b5;    /*语句2*/
6
b8=(b1+b4);  /*语句3*/
7
b7=(b2+b5);  /*语句4*/
8
System.out.println(b3+b6);
答案是语句1、3、4(更多请戳链接

就像书中所说的一样,编译器是为了确保变量能存下所保存的值就像你小杯的茶叶和大杯的茶叶倒进另外一个杯子里,那么为了避免溢出来,自然这另一个杯子要选择大的


3.2 对象引用(引用数据类型)

Dog dog = new Dog();
1
 
1
Dog dog = new Dog();
如上,我们都知道基本数据类型的变量,而实际上,是没有对象变量这种说法的,只有引用到对象的变量。也就是说,这里的dog,并不是对象的容器,而是类似指向对象的指针,或者说是地址(如果你还不明白,你可以想象真正的对象是一个宾馆房间,而这里的变量就是对应的房间号门卡)

之前我们比喻说,基本数据类型是大小不同的杯子,而这里,实际上是没有超巨大的被子来装载对象的,对象只会存在于可回收垃圾的堆上。

 
虽然没有杯子可以承载直接的对象,但是还是可以用来放“遥控器”的,你要记住的是,对象本身并没有放进变量中,而是放入了可以远程控制对象的遥控器


所以,当我们使用数组,它自身就是非基本数据类型,而当里面存入的是我们口中的其他“对象”时,它实际上是这样的:
引用指向了一个对象,这个对象中装满了引用们,这些引用们再最终会指向真正的对象。

好的,那么说到这里,既然我们只是存放了引用,那么那些真正的对象,假如没有对它的引用,会怎么样呢?
事实上,对于没有引用的对象,最终会被标记为垃圾,因为没有引用意味着我们不再会去使用它了,所以在一定时候它就会被Java虚拟机回收清理掉。

3.3 实例变量与局部变量

需要注意的是:
  • 实例变量有默认值(不论你赋值与否):e.g. booleans --> false; references --> null; integers --> 0
  • 局部变量没有默认值,如果在初始化之前就想使用,编译器就会报错

4、方法的使用

Java中的方法参数是通过值传递的,也就是说是通过拷贝传递
值得注意的是,我们之前提到的所谓”对象变量“实际是引用,是遥控器,所以如果传入参数是对象,实际上也就是拷贝了引用,所以对于对象引用作为参数来说,往往我们在方法中的操作会改变真正对象的值,而基础数据类型则不会。

看看下面这个题目,最终会输出什么?

public class Test {
//属性
int a = 11;
char[] ch = {'n', 'b'}; //方法
public void change(int a,char ch[]) {
a = 99;
ch[0] = 's';
} //测试
public static void main(String args[]) {
Test test = new Test();
test.change(test.a, test.ch);
System.out.println("test.a = " + test.a);
System.out.println("test.ch = " + test.ch[0] + test.ch[1]);
}
} 对于基本数据类型,拷贝过去对原来的属性没有影响,最终还是11;
对于引用数据类型,传递的是复制的遥控器,在方法中远程更改了真正的对象,所以输出不是nb,而是sb
x
 
1
public class Test {
2
    //属性
3
    int a = 11;
4
    char[] ch = {'n', 'b'};
5

6
    //方法
7
    public void change(int a,char ch[]) {
8
        a = 99;
9
        ch[0] = 's';
10
    }
11

12
    //测试
13
    public static void main(String args[]) {
14
        Test test = new Test();
15
        test.change(test.a, test.ch);
16
        System.out.println("test.a = " + test.a);
17
        System.out.println("test.ch = " + test.ch[0] + test.ch[1]);
18
    }
19
}
20

21
对于基本数据类型,拷贝过去对原来的属性没有影响,最终还是11;
22
对于引用数据类型,传递的是复制的遥控器,在方法中远程更改了真正的对象,所以输出不是nb,而是sb
 

5、数据封装

为了更好地隐藏我们的数据,我们往往要在实例变量的修饰符使用private,这意味着外界的其他类无法使用例如dog.size = 9;的方法进行控制和篡改。我们需要建立setter,强制要求所有方法通过setter来设定变量而不是直接存取,这样我们就可以进行一些条件限制,比如身高我们在setter中可以限制其不能为负数,但是如果是public int height,那就难以控制了。


但是众所周知,我们常见的private类型的变量,实际上在getter和setter中并没有设定什么特殊的动作,就是说,感觉像是多此一举,只是把变量传给了值而已。可是,它的真正的好处在于,万一某天你发现这个变量需要检查,你只需要更改一下getter或setter,并不影响其他的代码。想象一下你使用public的方式伺候了一大堆变量,突然因为需求变更要求该变量必须在一定的范围内,你岂不是要修改成吨的代码?可怕。 



《Head First Java》读书笔记(1) - Java语言基础的更多相关文章

  1. 【java读书笔记】——java开篇宏观把控 + HelloWorld

    学完java有一段时间了,一直没有做对应的总结,总认为有一种缺憾.从这篇博客開始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,基本的目的是扫盲.原来仅 ...

  2. [Java读书笔记] Effective Java(Third Edition) 第 7 章 Lambda和Stream

    在Java 8中,添加了函数式接口(functional interface),Lambda表达式和方法引用(method reference),使得创建函数对象(function object)变得 ...

  3. [Java读书笔记] Effective Java(Third Edition) 第 4 章 类和接口

    第 15 条: 使类和成员的可访问性最小化 软件设计基本原则:信息隐藏和封装. 信息隐藏可以有效解耦,使组件可以独立地开发.测试.优化.使用和修改.   经验法则:尽可能地使每个类或者成员不被外界访问 ...

  4. [Java读书笔记] Effective Java(Third Edition) 第2章 创建和销毁对象

      第 1 条:用静态工厂方法代替构造器 对于类而言,获取一个实例的方法,传统是提供一个共有的构造器. 类可以提供一个公有静态工厂方法(static factory method), 它只是一个返回类 ...

  5. 【记】《.net之美》之读书笔记(一) C#语言基础

    前言 工作之中,我们习惯了碰到任务就直接去实现其业务逻辑,但是C#真正的一些基础知识,在我们久而久之不去了解巩固的情况下,就会忽视掉.我深知自己正一步步走向只知用法却不知原理的深渊,所以工作之余,一直 ...

  6. 【java读书笔记】——java的异常处理

    程序在实际环境的执行过程中.安全成为须要首先考虑的重要因素之中的一个.这也是用户和程序猿最关心的问题.同一时候,Java语言健壮性也体如今了可以及时有效地处理程序中的错误.准确的说是Java的异常处理 ...

  7. [Java读书笔记] Effective Java(Third Edition) 第 6 章 枚举和注解

    Java支持两种引用类型的特殊用途的系列:一种称为枚举类型(enum type)的类和一种称为注解类型(annotation type)的接口. 第34条:用enum代替int常量 枚举是其合法值由一 ...

  8. [Java读书笔记] Effective Java(Third Edition) 第 5 章 泛型

    第 26 条:请不要使用原生态类型 声明中具有一个或多个类型参数的类或者接口,就是泛型(generic). 例如List接口只有单个类型参数E, 表示列表的元素类型.这个接口全称List<E&g ...

  9. [Java读书笔记] Effective Java(Third Edition) 第 3 章 对于所有对象都通用的方法

    第 10 条:覆盖equals时请遵守通用约定 在不覆盖equals方法下,类的每个实例都只与它自身相等. 类的每个实例本质上都是唯一的. 类不需要提供一个”逻辑相等(logical equality ...

  10. Java 读书笔记 (十七) Java 重写(Override)与重载(Overload)

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程重新编写,返回值和形参都不能改变,即外壳不变,核心重写. // 如果重写不是相当于重新定义了一个方法?那为什么不直接写,还要exte ...

随机推荐

  1. mysql日期函数 当前日期 curdate() , 当前年 year(curdate()), 取date的年份 year(date) ,取date的月份 month(date)

    获取系统当前日期时间: sysdate() 获取系统当前日期:curdate() 获取系统当前时间:curtime() 获取给定日期的年份: year(date) 获取给定日期的月份:month(da ...

  2. 卷积神经网络经验-CS231n笔记

    课程note中讲了一些工程经验,感觉很有用,记下来供自己以后查阅 相比于大的滤波器,小滤波器更受青睐.小滤波器参数更少.计算量更小.能够表达更多的特征,做反向传播时需要的内存更少. 通常不会考虑创建一 ...

  3. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(二)用户接口层之RtspClient类及其构造函数

    RtspClient类是myRTSPClient函数库所有特性集中实现的地方. 主要为用户提供: 1. RTSP协议通信接口函数,如DoOPTIONS(): 2. RTSP账号.密码设置函数,如Set ...

  4. 使用oschina的git服务器图文流程 (转)

    参考了豆沙包的教程我自己也做了一遍也来写写我的心得和体会 由于报名参加了游戏蛮牛<刀塔传奇>开源项目,服务器+客户端,所以觉着不管时间怎么着,还是或多或少做点贡献吧.毕竟这种体验应该还是第 ...

  5. "R6002 floating point support not loaded"问题分析

    今天为了追踪程序线程退出耗时时间,添加了耗时时间输出日志: TimerMeter tm; // do some threads exit logic float fSecs = tm.Elapsed( ...

  6. Linux+.NetCore+Nginx搭建集群

    本篇和大家分享的是Linux+NetCore+Nginx搭建负载集群,对于netcore2.0发布后,我一直在看官网的文档并学习,关注有哪些新增的东西,我,一个从1.0到2.0的跟随者这里只总结一句话 ...

  7. 永久关闭selinux | 防火墙

    关闭SELinux的两种方法 1 永久方法 – 需要重启服务器 修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器. 2 临时方法 – 设置系统参数 ...

  8. random模块函数分析(一)

    random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): 这是一个产生整数随机数的函数,参数start代 ...

  9. JS中的数据类型小结

    首先说说JS数据类型的分类.分为标准型和typeof类型(即控制台打印,浏览器区分) 标准型:基本类型中有:number.string.boolean.undefined.null  复合类型:obj ...

  10. 12块钱搭建一个ss(包括一个免费服务器)

    AWS搭建ss(shadow socks) 如果你符合以下条件,那么继续看还是有点帮助的: 想搞个服务器(包括windows Linux)(免费) 想科学上网(也免费) 之前也从网上搜过本文内容,但手 ...