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. ASP.NET:注销功能实现

    原理:清空Session 1.Web窗体:index.aspx <a href="logoutHandler.ashx">注销</a> 2.一般处理程序:L ...

  2. geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探

    在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...

  3. android UI 仿 win 8 模块化 标题,并实现 可长按拖动交换图片位置、可点击,且伴随动画特效

    转载请声明出处,谢谢!http://www.cnblogs.com/linguanh/ 先上效果图,给大家个直观效果,后上实现代码:  ->  ->->  ok,现在简单说下我上面的 ...

  4. 辗转相除法求最大公约数,非goto

    #include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...

  5. hibernate笔记--使用注解(annotation)方式配置单(双)向多对一的映射关系

    前面几篇都是介绍的用配置文件来实现实体类到数据库表的映射,这种方式是比较麻烦的,每一个pojo类都需要写一个相应的*.hbm.xml,无疑增加了很多代码量,不过也有优点就是利于维护,为了方便开发,Hi ...

  6. 【JUC】JDK1.8源码分析之ConcurrentLinkedQueue(五)

    一.前言 接着前面的分析,接下来分析ConcurrentLinkedQueue,ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素 ...

  7. PHP获取网站图标(favicon.ico)文件

    有的网站源码中加入了这几行代码: <link rel="shortcut icon" href="/favicon.ico" type="ima ...

  8. [译] MongoDB Java异步驱动快速指南

    导读 mongodb-java-driver是mongodb的Java驱动项目. 本文是对MongoDB-java-driver官方文档 MongoDB Async Driver Quick Tour ...

  9. 分离与继承的思想实现图片上传后的预览功能:ImageUploadView

    本文要介绍的是网页中常见的图片上传后直接在页面生成小图预览的实现思路,考虑到该功能有一定的适用性,于是把相关的逻辑封装成了一个ImageUploadView组件,实际使用效果可查看下一段的git效果图 ...

  10. 纯C#实现屏幕指定区域截屏

    以前在别的地方见过一个通过调用系统API实现屏幕截图的例子,从内心来说我不太喜欢在C#代码中出现这种情况,现在什么都讲“和谐”,我觉得这种做法就是破坏了我们的“和谐”代码,呵呵,开玩笑,有的时候,不通 ...