Java编程思想(Chapter2、4、6)

一切皆对象

用引用操纵对象

Java中操纵的标识符实际上是对象的“引用”。例如想要操纵一个字符串,则可以创建一个String引用。

String s;

此处s只是一个引用。

存储位置

基本类型/对象的引用:堆栈

对象: 堆

作用域

作用域由{}确定,决定了在其中定义的变量名的可见性以及生命周期。

1 {
2     int x =12;
3     {
4         int x = 96; //illegal
5     }
6 }

非法,不能隐藏。

{
    String s = new String("str");
}

引用s在作用域终点消失,而s指向的String对象仍然占据着内存空间,直到gc销毁。

关于值传递还是引用传递的问题

Java中只存在值传递

1.基本类型的传递

  没有任何疑问,传值

2.对象的传递

  参数传递时,只存在传递基本类型和对象引用的问题,并不会直接传对象本身

一个方法不能修改一个基本数据类型的参数

一个方法可以改变一个对象参数的状态

一个方法不能让对象参数引用一个新的对象

参考知乎话题:java到底是值传递还是引用传递?传送门

对于参数是String类型,不修改原的原因在于 String 对象是final类型。

初始化与清理

初始化顺序

以一实例说明

public class Tag {
    public Tag(int marker) {
        System.out.println("tag"+marker);
    }
}
public class Card {
    Tag tag = new Tag(1);
    public Card() {
        System.out.println("card()");
        tag3 = new Tag(33);
    }
    Tag tag2 = new Tag(2);
    void f(){
        System.out.println("f()");
    }
    Tag tag3 = new Tag(3);
}
public class Init01 {
    public static void main(String[] args) {
        Card card = new Card();
        card.f();
    }
}

Result

tag1
tag2
tag3
card()
tag33
f()

可以看出先进行变量的初始化,再进行构造器调用。

在此基础上,如果还有静态数据时,顺序如何?

public class Bowl {
    public Bowl(int marker) {
        System.out.println("bowl "+marker);
    }
    protected void f(int marker){
        System.out.println("f "+marker);
    }
}
public class Table {
    static Bowl b1 = new Bowl(1);
    public Table(){
        System.out.println("table()");
        b2.f(1);
    }
    void f2(int marker){
        System.out.println("f2 "+marker);
    }
    static Bowl b2 =new Bowl(2);
}
public class Cupboard {
    Bowl b3 =new Bowl(3);
    static Bowl b4 = new Bowl(4);
    Cupboard(){
        System.out.println("cup()");
        b4.f(2);
    }
    void f3(int marker){
        System.out.println("f3 "+marker);
    }
    static Bowl b5 = new Bowl(5);
}
public class Test {
    public static void main(String[] args) {
        System.out.println("create cup in main");
        new Cupboard();
        System.out.println("create cup in main");
        new Cupboard();
        t2.f2(1);
        t3.f3(1);
    }
    static Table t2 = new Table();
    static Cupboard t3 = new Cupboard();
}

Result

bowl 1
bowl 2
table()
f 1
bowl 4
bowl 5
bowl 3
cup()
f 2
create cup in main
bowl 3
cup()
f 2
create cup in main
bowl 3
cup()
f 2
f2 1
f3 1

可以看出,先进行static静态数据的初始化(只执行一次),再普通变量的初始化,最后再调用构造器。

数组的初始化

每次访问数组时,都将进行数组的边界检测。

复用类

带参数的构造器

如果类没有缺省的参数,或者想调用一个带参数的基类构造器,则必须用super显示地编写调用基类构造器的语句。

public class C3 extends C2{
    public C3(int i) {
        super(i);//
        System.out.println("c3");
    }
    public static void main(String[] args) {
        new C3(1);
    }
}
class C1{
    public C1(int i) {
        System.out.println("c1");
    }
}
class C2 extends C1{
    public C2(int i) {
        super(i);//
        System.out.println("c2");
    }
}

此处,两个super(i)都是必须,不然会报错。

初始化及类的加载

public class Insect {
    protected int i = 9;
    protected int j;
    protected int x3 = print("static Insect.x3 init");
    public Insect() {
        System.out.println("i="+i+" ,j="+j);
        j =39;
    }
    private static int x1 = print("static Insect.x1 init");
    static int print(String s){
        System.out.println(s);
        return 47;
    }
}
public class Beetle extends Insect{
    private int k = print("Beetle.k init");
    public Beetle() {
        System.out.println("k="+k);
        System.out.println("j="+j);
    }
    private static int x2 = print("static Beetle.x2 init");
    public static void main(String[] args) {
        System.out.println("Beetle construct");
        Beetle beetle = new Beetle();
    }
}

Result

static Insect.x1 init
static Beetle.x2 init
Beetle construct
static Insect.x3 init
i=9 ,j=0
Beetle.k init
k=47
j=39

可以看出,先进行类的加载,先基类再子类。static变量/块执行于类的初始化时期。new之后按照 先初始化再构造器的顺序执行。

时间: 2024-12-17 10:51:33

Java编程思想(Chapter2、4、6)的相关文章

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

Java编程思想 4th 第2章 一切都是对象

Java是基于C++的,但Java是一种更纯粹的面向对象程序设计语言,和C++不同的是,Java只支持面向对象编程,因此Java的编程风格也是纯OOP风格的,即一切都是类,所有事情在类对象中完成. 在Java中,使用引用来操纵对象,在Java编程思想的第四版中,使用的术语是"引用(reference)",之前有读过Java编程思想第三版,在第三版中,使用的术语是"句柄(handle)",事实上,我觉得第三版的术语"句柄"更加形象传神,就像你用一个

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概

Java编程思想总结笔记Chapter 2

本章介绍Java程序的基本组成部分,体会到Java中几乎一切都是对象. 第二章   一切都是对象 目录: 2.1 用引用操纵对象 2.2 必须由你创建所有对象 2.3 永远不需要销毁对象 2.4 创建新的数据类型:类 2.5 方法.参数和返回值 2.6 构建一个Java程序 2.7 你的第一个Java程序 2.8 注释和嵌入式文档 2.9 编码风格 2.1 用引用操纵对象 一切都看作对象,操纵的标识符实际上是对象的一个"引用",遥控器(引用)操纵电视机(对象),想调控电视,只需通过遥控

《java编程思想》有必要买吗

<java编程思想>有必要买吗 1.看到过好多个这样的提问,其实我一般真的不那么容易分享自己的这点心得的,这是第一次回答这样的"推荐书籍"方面的问题. 我买编程方面的书籍,有一个非常清晰.坚决的原则--电子工业出版社的! 对于JAVA,建议你看如下的书: 首先,<21天学通JAVA>: 然后,<30天学通JAVA项目案例开发>(这本书的内容都是实例的,非常棒的实例!适合初学者的同时,又有实际应用性!) 以上的书籍,是基于你只想学J2SE的. 我还建议

JAVA编程思想(第四版)学习笔记----4.8 switch(知识点已更新)

switch语句和if-else语句不同,switch语句可以有多个可能的执行路径.在第四版java编程思想介绍switch语句的语法格式时写到: switch (integral-selector) { case integral-value1: statement; break; case integral-value12: statement; break; default: statement; } 其中integral-selector(整数选择因子)是一个能产生整数值的表达式.并且说

《Java编程思想》第一二章

前段时间一直通过网络教程学习Java基础,把面向对象部分学完之后本来打算继续深入学习,但是感觉自己操之过急了,基础根本不够扎实,所以入手了一本<Java编程思想>,希望先把基础打好,再深入学习. 不得不说这本书真的不是浪得虚名,对于我这样的新手看完一二章之后也觉得这本书值得买了.跟网上教程不同,这本书一开始便直接全面深入论述Java面向对象编程中对对象的理解,值得注意的是如果之前没有Java编程的基础,第一章看起来会比较吃力,而且效果也不太好,因为都是理论没有使用代码进行演示说明,所以作者也支

java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载,并按照所在页面的操作进行操作.当然也可以直接我下载下面的链接,下载的直接是JAR包,可以直接导入并使用: net.mindview.util包:百度网盘:点击下载  密码: ggpi java编程思想第四版源码:百度网盘:点击下载  密码: ur3e 下面我简单的介绍一下源码在Eclipse中的导