一、用引用操纵对象
每种编程语言都有自己操纵内存中元素的方式,在Java中一切都是对象,通过引用来向对象发送消息从而操纵对象,就像是遥控器操控电视机一样。
没有电视机,遥控器可单独存在,也就是说你可以拥有一个引用,但并不一定需要一个对象与之关联,如下创建一个String的引用:
String s;
但这时你只是创建了一个引用,并没有创建对象,如果此时向s发送一个消息,就会返回一个运行时异常,因此安全的做法是在创建一个引用的时候就进行初始化,如下:
String s="abcd";
这是Java语言的一个特性:字符串可以用带引号的文本初始化。
二、必须由你创建所有对象
一旦创建了一个引用,通常用new操作符创建一个新的对象与之关联,如下:
String s1=new String("abcd");
1、对象存储到什么地方?
计算机中有五个不同的地方可以存储数据,如下:
① 寄存器
这是最快的存储区,它位于处理内部,但寄存器数据有限,需要根据需求进行分配,你不能直接控制。
② 堆栈
它位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器那里获得直接支持,堆栈指针若向下移动,则分配新的内存,若向上移动则释放那些内存。创建程序时,Java系统必须知道存储在堆栈中所有项的确切生命周期,以便上下移动堆栈指针。变量就是直接存储堆栈中的。
③ 堆
一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆相对于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间,用堆进行存储分配和清理比用堆栈进行存储分配需要更多的时间。
④ 常量存储
常量值通常直接存储在程序代码内部。
⑤ 非RAM存储
流对象和持久化对象。
在流对象中,对象转化为字节流。
在持久化对象中,对象被存放于磁盘上。
2、特例:基本数据类型
基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示对应的基本数据类型,如下:
char c = 'a';
Character ch = new Character(c);
Character cc = new Character('a');
System.out.println(ch == cc);//false
Java SE5的自动包装功能可以自动地将基本数据类型转换为包装器类型。
Character ch = 'b';
char c = ch;
Java提供了两个用于高精度计算的类:BigInteger、BigDecimal
BigInteger支持任意精度的整数,可以表示任何大小的整数值,而不会丢失任何信息。
BigDeciaml支持任意精度的定点数,可以用它进行精确的货币计算。
3、Java中的数组
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,访值拥有自己的关键字null,Java一旦看到null,就知道这个引用还没有指向某个对象。在使用任何引用之前,必须为其指定一个对象,否则运行将会报错。
三、永远不需要销毁对象
1、作用域
作用域决定了其内定义的变量名的可见性和生命周期,作用域由花括号的位置来决定。
{
int x = 10;
//x可用
{
int y = 12;
//x与y都可用
}
//x可用
}
2、对象的作用域
Java对象不具备和基本类型一样的生命周期,当用new创建一个Java对象时,它可以存活于作用域之外。
{
String s = new String("abcd");
}
//引用s在作用域终点就消失了,但s指向的对象仍然继续占用内存空间
如果让Java对象继续存在,如何防止填满内存空间而造成程序阻塞呢?
Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象,随后释放这些对象的内存空间,以便供其他新的对象使用。
四、创建新的数据类型:类
1、字段和方法
一旦定义了一个类,就可以在类中设置两种类型的元素:字段(属性、数据成员)、方法(行为、成员函数)。
public class SimpleExample1 {
int i;
double d;
@Test
public void example4() {
SimpleExample1 example = new SimpleExample1();
example.i = 10;//引用一个对象的成员
System.out.println(example.i + "==" + d);//10==0.0
}
}
2、基本成员的默认值
当变量作为类的成员使用时,即使没有进行初始化,Java也会确保它获得一个默认值,防止产生错误。但这种初始化的方法并不适用于“局部”变量。
基本类型 | 默认值 |
boolean | false |
char | null |
byte | (byte)0 |
short | (short)0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0 |
五、方法、参数和返回值
Java 的方法决定了一个对象能够接收什么样子的消息,方法的基本组成部分包括:名称、参数、返回值和方法体。
public int example1(String s) {
return s.length() * 2;
}
返回类型描述的是在调用方法之后从方法返回的值,参数列表给出了要传递给方法信息的类型和名称,方法名和参数列表唯一标识出某个方法。
Java的方法只能作为类的一部分来创建,方法只有通过对象才能被调用,通过对象调用方法时,需要先列出对象名,紧接是句点,然后是方法名和参数列表。
1、参数列表
方法的参数列表指定要传递给方法的什么样子的消息,这里的传递实际上也就是引用。
public class SimpleExample3 {
public int example1(String s) {
return s.length() * 2;
}
@Test
public void test() {
SimpleExample3 example3 = new SimpleExample3();
int i = example3.example1("张三");//字符串中的每个字符占16位,大小为两个字节
System.out.println(i);
}
}
2、return关键字的用法
① 它代表已经做完,离开此方法;
② 如果方法产生了一个值,这个值要放在return 的后面。
如果不想返回任何值,可以指示方法返回void,如下:
public void example2() {
System.out.println("李四");
}
若返回类型是void,则return的作用只是用来退出方法,如果返回类型不是void,那么无论在何处返回,编译器都会强制返回一个正确类型的返回值。
六、构建一个Java程序
1、import关键字
import指示编译器导入一个包,也就是一个类库,如下:
import java.util.ArrayList;
如果你需要使用util包中的很多类,那么使用通配符*即可
import java.util.*;
2、static关键字
当声明一个事物是static时,就意味着这个域或方法不会跟类的任何实例对象关联在一起,它们代表类数据或类方法,这时可以直接通过类来访问,当然也可以通过对象来访问(不推荐),如下:
public class Example1 {
public static int i = 10;
public static void main(String[] args) {
System.out.println(Example1.i++);//10,先输出才自增
Example1 example1 = new Example1();
System.out.println(example1.i++);//11,已经自增一次,先输出再自增第二次
}
}
static字段对每个类来说都只有一份存储空间,而非static字段则对每一个对象都有一个存储空间,如下:
public class Example1 {
public static int i = 10;
public int j = 20;
@Test
public void test1() {
Example1 example1 = new Example1();
Example1 example2 = new Example1();
example1.i++;
System.out.println(example1.i + "==" + example2.i);//都是11
example1.j++;
System.out.println(example1.j + "==" + example2.j);//第一个21,第二个20,每个对象有一个存储空间来存储非静态变量的值
}
}
七、你的第一个Java程序
public class Example2 {
public static void main(String[] args) {//args用来接收命令行参数
System.out.println("Hello World");//out是System中的一个静态的PrintStream对象
System.out.println(new Date());//Date对象被自动转换成String发送给println()
System.getProperties().list(System.out);//运行程序的系统中获取的所有“属性”
System.out.println(System.getProperty("user.name"));//查询用户名
System.out.println(System.getProperty("user.dir"));//查询项目的根目录
}
}
八、常用的文档注释示例
/**
* @author alex
* @version 1.0
* @since 2018-4-2
*/
public class Example3 {
/**
* @param s
* @return
* @throws Exception
*/
public int example(String s) throws Exception {
return 0;
}
}
九、驼峰命名法
首字线小写,其他字母首字母大定,不要加下划线,如下:
int definitionNewVariable = 10;