前言
《Java编程思想》中提到,
Java是基于C++的,但相比之下,Java是一种"纯粹"的面向对象的程序设计语言。
Java中不再使用指针来操作内存中的元素,而是采用对象的 “引用”【这个引用是作者提出的一种为了简化概念上的理解和C++语言的引用有着一些重大差异,望读者不必过于深究。】
对象的理解
使用引用来操作对象。
Java中对一切对象的操作,都是通过对【对象的引用】的操作来实现的,而不是操作对象本身。因此有时候你就可以知道为什么声明了一个变量但是没有初始化也是可以的。【因为该S就是一个引用。并不一定需要对象需要与之关联。example: String S】;
注意: 使用引用来操作对象时候,一般来说,都是需要给引用关联一个对象。或者是说初始化。JAVA中当一个类的成员变量是基本类型【boolean char byte short int long float double 】,在没有进行初始化赋值时,系统提供一个默认值。但是局部变量未初始化时候,使用该对象时候,编译会报错。
对象的产生与存储位置
文中提到所有的对象都是由开发人员创建出来。example: String e=new String(“object”);
就通过new关键字来创建了一个对象,e是该对象的一个引用。随后我们就可以使用e来操作这个对象了。
于是我们会好奇,这个对象到底存储到计算机哪个位置了?
书中讲述了存储对象的五个位置:
1)寄存器。最快的存储区。在cpu内部你不能直接控制,而且数量机器有限。
2)堆栈。存储于RAM,速度仅次于寄存器,内部通过指针上下移动来进行内存的分配和释放。缺点:不灵活,必须直到所有项数据的确切的生命周期。以便指针上下移动。
3)堆。通用内存池位于RAM中。用于存放所有的java对象。优点:灵活,无需知道对象生命周期 缺点:对象的分配和清理时间会比较长。
4)常量存储:嵌入式系统中一般会将选择将常量 存储于ROM。
5)非RAM存储:像I/O操作的流对象、持久化对象【数据库数据】可以存放与其他媒介上。比如磁盘。
既然有这5个位置可以存放数据。但是我们的java对象具体存放至哪里呢?
程序设计人员考虑到一些经常用到的一系列类型,选择将其进行了特殊对待。这些类型也被成为基本类型。
并且这些类型的存储空间的大小是固定的。因此这也是java语言编写的程序更具有可移植性的原因之一。
基本类型 字节 包装器类型
0.boolean - Boolean
- char 2 Character
- byte 1 Byte
- short 2 Short
- int 4 Integer
- long 8 Long
- float 4 Float
- double 8 Double
- void - Void
boolean 类型所占的存储空间的大小没有定义。仅仅定义为能狗取字面值true或false;
基本类型不用new来创建变量,存储位置在堆栈中。[为了速度]
如果使用new 来创建对象,存储位置就是在堆中。
Java中提供了两个非常有用的计算的类; BigInteger 、 BigDecimal。但两者没有基本类型。
BigDecimal 可以用于精确的货币计算。【以后千万在面试计算银行货币的类型别说是double】
BigInteger 可以用于计算任意精度的整数。
对象的作用域和生命周期
和C/C++语言一样,同样是使用{ }来位置来决定对象的作用域和生命周期。
同一个域中这里不可以多次使用一样的变量名称来定义对象。
example:
{ int x=1;
{
int x=100; //报错。因为x在之前定义过。
}
}
对象和基本类型的生命周期是不一样的。
对象生命周期时间会比作用域中要长。
example:
{
String str=new String(“Hello World!”);
}
当这个作用域结束后,str 就没有了。但是 Hello World 的存储并没有释放。这里面是java中有一个垃圾回收器来进行管理。它会监听new创建的对象。并辨别那些不会再被引用的对象,随后释放这些对象的内存空间。
类概念
既然这里一切都是对象。那么决定了某一类的对象的外观和行为是什么呢?采用什么来区别对象呢?
于是就有了类型的概念。java中使用关键字class 来声明一种类型。
居然是一种类型,那么这个类应该具有哪些东西呢?我们都知道类中可以有存储数据的成员变量、可以完成特定操作或者功能的方法。所有的类无外乎就是这两个东西。我们所有的工作都是围绕类来书写。
example:
package com.chapter_02;
public class DemoClass{
String name; //存放数据变量
//定义静态方法
public static void LocalVariable() {
System.out.println("功能实现!");
}
public static void main(String[] args) {
// 调用方法
LocalVariable();
}
}
方法: 类中的方法是类的功能实现体,是一个类最为核心的部分。类对象的强大之处就是在类的方法之中。
关于类中方法基本使用:
方法的基本组成部分包括:名称、参数、返回值、方法体。
example:
public int MAX(int a,int b){
return a>b?a:b;
}
// 输入值是a ,b 两个形参。 输出是一个int 类型的值,也就是返回值。 方法名称是MAX. 方法体就是{ return a>b?a:b;}
如果没有返回值。则使用void。return 表示的就是返回。无返回值的情况下return可以省略。
example:
public void MAX(int a,int b){
int max= a>b?a:b;
}
引入static关键字。
static 就是静态的意思。 以上的方法是普通的方法。普通的方法的调用必须通过对象.方法名 来调用。
static 既可以加在 成员变量中也可以加在 方法中,还可以加在 类中[这里不做概述]。
static加在 成员变量名称中,该变量单独占用一份独立的空间。不会随着对象的增加存储的空间上升。
static 加在方法面前,一只想为某特定的域分配单一存储空间,无需考虑对象的多少。二希望这个方法不予和它的类的任何对象相关联。即使在没有对象的情况下,也可以使用这个方法。
example:
package com.chapter_02;
public class DataOnly {
static int x;
String name;
public static void LocalVariable() {
System.out.println("功能实现!");
}
public static void main(String[] args) {
LocalVariable();
DataOnly dataOnly = new DataOnly();
dataOnly.x=1111;
DataOnly dataOnll = new DataOnly();
dataOnll.x=2222;
System.out.println(dataOnly.x+" "+dataOnll.x);
}
}
结果如下:
功能实现!
2222 2222
分析: 两个对象操作的是同一份x ,所以对象dataOnly和dataOnll的x值是一样的。
关于编码风格和注释/嵌入式文档
编码风格
1.驼峰规范。java中类名称单词首字母都要大写,类成员变量和方法名称采用驼峰书写风格。
example:
class AllTestColor{
int testColorFirst;
void changeColor();
}
注释/嵌入式文档
注释
1.使用传统的C语言风格的注释。“ /* ” 开始 “ */ ” 结束 用于多行注释。
example:
/*
*
* this a demo !
*
*/
2.单行注释。 使用 “// ”. 注释后,该行就不会参与编译和运行了。
example:
// String name;
嵌入式文档
常用的一些标签。
1.@see: 引用其他类。
@see 标签允许用户引用其他类的文档。Javadoc会在其生成的HTML文件中,通过@see 链接到其他文档中去。但是不会检查该链接是否有效。
example:
@see classname
@see fully-qualified-classname
@see fully-qualified-classname#method-name
2.{@link package.class#member label}
和@see 及其类似,只是它用于行内,并且使用"label"作为超链接文本。
3.{@docRoot}
该标签产生到文档根目录的相对路径,用于文档树页面的显示超链接。
4.@version
@version version-information
书写版本信息
5@author
@author author-information
书写作者信息。
6@since
允许你指定程序最早使用的版本
7.@param
用于方法文档的参数的描述信息
@param parameter-name description
8.@return
用于方法文档中,来描述返回值的信息
@return description
9.@throws
@throws fully-qualified-class-name description
表述 在某个方法调用出错的时候将会抛出异常
10@Deprecated
编译器发布警告,指明一些旧特性已由新特性所取代。建议用户不要在使用这些特性。因为在不就得将来将会它们很可能会被删除。
就写这么多了,有点累了。
参考:《Java编程思想》