《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. canvas探照灯效果

    canvas中的clip()方法用于从原始画布中剪切任意形状和尺寸.一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域) 也可以在使用clip()方法前通过使用s ...

  2. Maven详解(三)------ Maven工程目录介绍

    上一章我们配置并安装好了 Maven,那么这一章我们介绍如何用eclipse创建一个 Maven 工程,然后介绍 Maven 工程的目录结构. 1.eclipse 创建 Maven 工程 第一步:Fi ...

  3. 关于Java String 类型转换时null的问题(转)

    关于Java String 类型转换时null的问题 开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPoi ...

  4. /etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc ~/.bash_logout 说明及区别

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一 ...

  5. 50行Python代码构建小型区块链

    本文介绍了如何使用python构建一个小型的区块链技术,使用Python2实现,代码不到50行. Although some think blockchain is a solution waitin ...

  6. 不安装vc2015 Redistributable解决api-ms-win-crt-runtime-l1-1-0.dll丢失错误

    一.背景 最近用到python下的cx_Oracle模块,开发环境中测试正常,用cx_freeze打包后,到用户机器上一部署,各种奇奇怪怪的问题频出,运行环境如下: a.开发环境:64位win10操作 ...

  7. SpringMVC表单中post请求转换为put或delete请求

    1.在web.xml文件中配置  <!-- HiddenHttpMethodFilter过滤器可以将POST请求转化为put请求和delete请求! -->    <filter&g ...

  8. Python | 多种编码文件(中文)乱码问题解决

    问题线索   1 可以知道的是,文本文件的默认编码并不是utf8. 我们打开一个文本文件,并点击另存为 2 我们在新窗口的编码一栏看到默认编码是ANSI.先不管这个编码是什么编码,但是通过下拉列表我们 ...

  9. 新手之VM下安装centos版本Linux系统完整版!

    一.安装必备软件 1:下载好VM workstations虚拟机 2:下载好你要安装的centos版本. 如果没有,请自己先百度下载好~或者找我要. 二.开始安装 VM workstation部分 1 ...

  10. 海外 App 的推送服务,试试 FCM 吧!!!

    > **版权声明:** > > **本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有.** > > **每周会统一更新到这里,如果喜欢,可关注公 ...