[Java编程思想-学习笔记]第2章 一切都是对象
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[] args是main方法的参数,指的是接收String 数组,比如我输入命令"java HelloWorld hello world"让程序运行,那么String数组的第一个元素是hello,第二个元素是world。第三行打印结果,System是一个Java类库定义好的类,out是它的一个属性,或者说成员,是引用数据类型的。第三行所做的事是,类System的成员调用println方法打印了"Hello, world"。
[Java编程思想-学习笔记]第2章 一切都是对象的更多相关文章
- [Java编程思想-学习笔记]第3章 操作符
3.1 更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...
- [Java编程思想-学习笔记]第1章 对象导论
1.1 抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...
- [Java编程思想-学习笔记]第4章 控制执行流程
4.1 return 关键字return有两方面的用途:一方面指定一个方法结束时返回一个值:一方面强行在return位置结束整个方法,如下所示: char test(int score) { if ...
- 《java编程思想》P22-P37(第二章一切都是对象)
1.JAVA操纵的标识符实际上是对象的一个"引用";如String s;里的s是String类的引用并非对象. 2.程序运行时,有五个不同的地区可以存储数据. (1)寄存器:最快的 ...
- Java编程思想学习(五)----第5章:初始化与清理
随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...
- Java编程思想 学习笔记11
十一.持有对象 通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...
- Java编程思想 学习笔记7
七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...
- Java编程思想 学习笔记5
五.初始化与清理 1.用构造器确保初始化 在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造 ...
- Java编程思想 学习笔记2
二.一切都是对象 1.用引用操纵对象 在Java中,一切都被视为对象,但操纵的标识符实际上是对象的一个“引用”.可以将这想象成遥控器(引用)来操纵电视机(对象).另外,没有电视机,遥控器也可以单独存在 ...
随机推荐
- 在Linux中运行Nancy应用程序
最近在研究如何将.NET应用程序移植到非Windows操作系统中运行,逐渐会写一些文章出来.目前还没有太深的研究,所以这些文章大多主要是记录我的一些实验. 这篇文章记录了我如何利用NancyFx编写一 ...
- UCOSII内核代码分析
1 UCOSII定义的关键数据结构 OS_EXT INT8U OSIntNesting; OSIntNesting用于判断当前系统是否正处于中断处理例程中. OS_EXT ...
- matlab基础教程——根据Andrew Ng的machine learning整理
matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...
- hibernate笔记--继承映射关系的三种实现方式
单表继承映射(一张表): 假设我们现在有三个类,关系如下: Person类有两个子类Student和Teacher,并且子类都具有自己独有的属性.这种实体关系在hibernate中可以使用单表的继承映 ...
- 【JUC】JDK1.8源码分析之SynchronousQueue(九)
一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...
- Azure ARM (14) 设置ARM VM的Availability Set
<Windows Azure Platform 系列文章目录> 参考资料:https://gallery.technet.microsoft.com/Set-Azure-Resource- ...
- 浅析String不可变性
在所有编程语言领域,我想字符串应该是地球上最常用的表达手段了吧. 在java的世界里,String是作为类出现的,核心的一个域就是一个char数组,内部就是通过维护一个不可变的char数组,来向外部输 ...
- 增加删除字段修改字段名,修改表结构,非常用SQL语句技巧总结
1.为数据表添加一个新字段 Alter TABLE [dbo].[CustomerBackupConfig] Add [Stamp] [timestamp] NULL GO 2.为数据表添加两个新字段 ...
- jQuery对话框右上角带关闭×
jQuery弹出可关闭遮罩层:http://hovertree.com/texiao/layer/1/ 代码如下: <!DOCTYPE html> <html> <hea ...
- Java中, 函数的调用、随机数字
函数: 独立完成某个功能的代码模块.(方法) 作用是为了让代码结构更加良好.模块清晰,实现重用. 函数的四要素:名称,输入值,加工过程,返回值 Java中函数的语法 static 返回类型 函 ...