2.1  创建新的数据类型:类

通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示:

class Circle {
    // 属性
    // 方法
}

如上所示,使用关键字class定义了类Circle,用花括号{ }将整个类包括起来。当然,这个类还不能做任何事,它还需要定义一些属性和方法。

2.2  属性和方法

面向对象的一个特性就是将数据和方法结合起来。比如对一个圆抽象,可见圆有它的属性半径,它还有方法,如告诉我们它的周长和面积。不光是圆,其他任何对象都有它的属性和方法,针对这样的特点,面向对象就把属性和方法结合起来。如下程序所示:

class Circle {
    double radius;// 半径
    Circle() {}// 构造器
    double getArea() { return 3.14 * radius * radius; }// 获取面积
    double getPerimeter() { 2 * 3.14 * radius; }// 获取周长
}

其中 Circle() {}是类Circle的构造器,它虽未做任何事,但它是用来在创建对象时初始化对象的,构造器的名字必须和类名相同。

值得一提的,类的属性都有默认值,这里的radius的默认值是 0.0。此外,属性以及方法的参数和返回值不仅可以是基本数据类型,还可以是引用数据类型,也就是对象和数组,如下所示

class MyClass {
    boolean bo;
    char c;
    byte b;
    short s;
    int i;
    long lo;
    float f;
    double d;

    String str;

    void getDefaultFieldValue() {
        print(bo);// false
        print(c);// '\0'
        print(b);
        print(s);
        print(i);
        print(lo);
        print(f);// 0.0
        print(d);// 0.0

        print(str);// null
    }

    String fun(String[] s) {// 返回值和参数可以是引用数据类型
        return s[1];
    }
}

2.3  创建对象

有了类以后,就要创建对象了。创建对象很简单,直接使用new创建即可,比如我们要创建一个Circle对象

new Circle();

这里使用了括号,很容易使我们想到方法,因此创建对象的同时必定调用了一个方法,即构造器。我们也可以向构造器传入参数,但前提是类必须要定义带有参数的构造器。

2.4  用引用操纵对象

创建对象后就该拿来使用,那如何操纵对象呢?用引用操纵对象,打个比方,我们创建了电视机这样的对象,它是放在堆里的,但平时我们总是使用遥控器控制它,遥控器就相当于引用变量,它是放在堆栈里的,这个引用变量不光可以控制一个电视机,当我们再创建一个相同的电视机时,这个引用变量也可以控制它。如下图解

上图说明了遥控器A(电视机的引用变量)能控制电视机 A(一个电视机对象)。遥控器A还可以改变它所控制的对象,转而控制电视机 B 或 C,如下所示

如上所示,遥控器 A既可以控制电视机 A,也可以改变控制方向,控制电视机 B。用Java程序来说明,如下

Television tv = new Television();// 电视机A
tv.on();// 打开电视机A
tv.off();// 关闭
tv = new Television();// 引用变量tv转而控制电视机B
tv.on();
tv.off();

可见,一个电视机引用变量就可以控制电视机 A 或 B。

除了用遥控器间接操纵对象,也可以直接按电视机的按钮,那就是直接操纵匿名对象,如下所示

new Television().on();// 打开电视机A
new Television().on();// 打开电视机B

然而,因为对象是匿名的,所以用过一次后就找不到它了,因此上述程序的两台电视机再也无法关闭了。

2.5  永远不需要销毁对象

使用完对象后,就得把对象销毁掉,在Java中都是通过垃圾回收器自动销毁对象的。那么当对象超出其作用域时会不会马上被销毁呢?不会,即使整个程序退出了,对象还不会马上被销毁,垃圾回收器总会在适当的时间销毁对象。

关于对象的创建和销毁涉及了JVM的内存分配和回收的机制,若要详细阐述,定会超出本文篇幅,且不再本文讨论范围,故此一笔略过。

2.6  第一个Java程序

终于可以编写第一个Java程序了,这里就展示经典的 Hello, world 程序

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world");
    }
}

逐行解释一下,public 指的是访问控制符,这里的意思是HelloWorld是公共类,它可以在包外被访问,此外一个Java文件只能有一个public 类,可以包含任意多个非public 类,文件名必须和public 类的名字相同。第二行指的是main方法,它必须要用public static 修饰,如果把public改为其它修饰符,或者去掉static,结果是虽然通过了编译,但是运行时报错。String[] argsmain方法的参数,指的是接收String 数组,比如我输入命令"java HelloWorld hello world"让程序运行,那么String数组的第一个元素是hello,第二个元素是world。第三行打印结果,System是一个Java类库定义好的类,out是它的一个属性,或者说成员,是引用数据类型的。第三行所做的事是,类System的成员调用println方法打印了"Hello, world"。

[Java编程思想-学习笔记]第2章 一切都是对象的更多相关文章

  1. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  2. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  3. [Java编程思想-学习笔记]第4章 控制执行流程

    4.1  return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...

  4. 《java编程思想》P22-P37(第二章一切都是对象)

    1.JAVA操纵的标识符实际上是对象的一个"引用";如String s;里的s是String类的引用并非对象. 2.程序运行时,有五个不同的地区可以存储数据. (1)寄存器:最快的 ...

  5. Java编程思想学习(五)----第5章:初始化与清理

    随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...

  6. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...

  7. Java编程思想 学习笔记7

    七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...

  8. Java编程思想 学习笔记5

    五.初始化与清理 1.用构造器确保初始化  在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...

  9. Java编程思想 学习笔记2

    二.一切都是对象 1.用引用操纵对象 在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”.可以将这想象成遥控器(引用)来操纵电视机(对象).另外,没有电视机,遥控器也可以单独存在 ...

随机推荐

  1. Android随笔之——Android广播机制Broadcast详解

    在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...

  2. 【记录】JS 生成 URL 二维码

    示例代码: <html> <head> <title>example</title> </head> <body> <sc ...

  3. [c++] Callable Objects

    Five kinds of callable objects: Functions Pointers to functions Objects of a class that overloads () ...

  4. MySQL学习(一)MySQLWorkbench(MySQL可视化工具)下载,安装,测试连接,以及注意事项

    PS:MySQLWorkbench是MYSQL自带的可视化工具,无论使用哪个可视化工具,其实大同小异,如果想以后走的更远的话,可以考虑使用命令行操作数据库MYSQL.可视化工具让我们初学者更能理解数据 ...

  5. DotNet指定文件显示的尺寸

    在项目中开发中,有时候需要将文件的尺寸进行控制,例如需要将文件的尺寸指定为字节,TB等.现在提供一个方法,实现将指定文件的尺寸, 提供:"字节", "KB", ...

  6. JConsole远程连接配置

    JConsole远程连接还是有一点坑的.这里记录一下配置过程,好记性不如烂笔头. 1.在远程机的tomcat的catalina.sh中加入配置: JAVA_OPTS="$JAVA_OPTS ...

  7. Struts2 源码分析——Action代理类的工作

    章节简言 上一章笔者讲到关于如何加载配置文件里面的package元素节点信息.相信读者到这里心里面对struts2在启动的时候加载相关的信息有了一定的了解和认识.而本章将讲到关于struts2启动成功 ...

  8. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)

    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...

  9. MyEclipse 2014 GA 和 MyEclipse 2015 CI 和 Eclipse Luna 最新最全下载地址

    官方下载地址: Eclipse 标准版 x86 http://mirror.hust.edu.cn/eclipse//technology/epp/downloads/release/luna/R/e ...

  10. jQuery post数据至ashx

    今天给大家分享一个小功能,在jQuery环境中,Post data to ashx进行数据交互. 参考下面代码示例: $.ajax({ url: '<%= ResolveUrl("~/ ...