Java(二)一切都是对象

用引用操纵对象

在Java中,尽管将一切都看作对象,但操纵的标识符实际上是对象的一个“引用”。可以将这一情形想象成用遥控器(引用)操纵电视机(对象),只要握住这个遥控器,就能保持与电视机的连接,当想改变频道或者减小音量时,实际操控的是遥控器(引用),再由遥控器来调控电视机(对象)。如果想在房间里四处走走,同时仍能调控电视机,那么只需携带遥控器(引用)就好了,而不是电视机(对象)。
此外,即使没有电视机,遥控器亦可独立存在。也就是说,你拥有一个引用,并不一定需要有一个对象与它关联:

String s;   //这里所创建的只是引用,并不是对象

如果此时向s发送一个消息,就会返回一个运行时错误,这是因为此时s实际上并没有与任何事物相关联;因此,一种安全的做法是:创建一个引用的同时便进行初始化;

String s = "asdf";

必须由你创建所以对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用new操作符来实现这一目的。new关键字的意思就是“给我一个新对象”:

String s = new String("asdf");

存储到什么地方?

  • 寄存器:这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部;
  • 堆栈:位于通用RAM(随机访问存储器),但通过堆栈指针可以从处理器那里获得直接支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅此于寄存器。创建程序时,Java系统必须知道存储在堆栈内的所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些Java数据存储于堆栈中——特别是对象引用,但是Java对象并不存储于其中;
  • 堆:一种通用的内存池(也位于RAM区),用于存放所有的Java对象。堆不同于堆栈的好处是:编译器不需要知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当然,这种灵活性必须要付出相应的代价:用堆进行存储分配和清理可能比用堆栈进行存储分配需要更多的时间;
  • 常量存储:常量值通常直接存放在程序代码内部;
  • 非RAM存储:两个基本的例子是流对象和持久化对象。在流对象中,对象转化为字节流,通常被发送给另一台机器。在持久化对象中,对象被存储在磁盘上。因此,即使程序终止,它们仍可以保持自己的状态;

特例:基本类型
对于基本类型,Java不用new来创建变量,而是创建一个并非是引用的“自动”变量。这个变量直接存储”值”,并置于堆栈中,因此更加高效。
这里写图片描述
高精度数字
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal。虽然它们大体上属于“封装器类”的范畴,但二者都没有对应的基本类型。
不过,这两个类包含的方法,提供的操作与对基本类型所能执行的操作相似。也就是说,能作用于int或float的操作,也同样能作用于BigInteger或BigDecimal。只不过必须以方法调用的方式取代运算符方式来实现。由于这么做复杂了许多,所以运算速度会比较慢。在这里,以速度换取了精度;

  • BigInteger:支持任意精度的整数;
  • BigDecimal:支持任意精度的定点数;

Java中的数组
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用前,必须为其指定一个对象;如果试图使用一个还是null的引用,运行时将会报错。

作用域

作用域

{
int x =12;  
  {
     int y = 96;   //x、y都有效
  }
  //x有效,y无效
}

在作用域里定义的变量只可用于作用域结束之前;
对象的作用域
Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外:

{
  String s = new String("asdf");
}

引用s在作用域终点就消失了,然而,s指向的String对象仍继续占据内存空间;
事实证明,由new创建的对象,只要你需要,就会一直保留下去。这样便带来一个有趣的问题,如果让Java对象继续存在,那么靠什么才能防止这些对象填满内存空间,进而阻塞你的程序呢?

Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。也就是说,你根本不必担心内存回收的问题。你只需创建对象,一旦不再需要,它们就会自行消失。

创建:类

字段和方法
一旦定义了一个类,就可以在类中设置两种类型的元素:

  • 字段:可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种;
  • 方法

基本成员默认值
若类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值:
然而上述确保初始化的方法并不适用于“局部”变量。因此,如果在某个方法定义中有:

int x;

那么变量x得到的可能是任意值,而不会被初始化为零。所以在使用x前,应先对其赋一个适当的值。如果忘了这么做,Java会在编译时返回一个错误,告诉你此变量没有初始化;

方法、参数和返回值

Java中的方法只能作为类的一部分来创建。方法只有通过对象才能调用,且这个对象必须能执行这个方法调用。
参数列表
在参数列表中必须指定每个所传递对象的类型及名字。像Java中任何传递对象的场合一样,这里传递的实际上也是引用,并且引用的类型必须正确。
return关键字
它包括两方面:首先,它代表“已经做完,离开此方法”。其次,如果方法产生了一个值,这个值要放在return语句后面。若返回类型为void,return关键字的作用只是用来退出方法,因此,没有必要到方法结束时才离开,可在任何地方返回,但如果返回类型不是void,那么无论在何处返回,编译器都会强制返回一个正确类型的返回值;

构建一个Java程序

static关键字
当声明一个事物是static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例关联在一起。所以,即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。

public class StaticTest{
static int i =47;
}
    StaticTest st1 = new StaticTest();
    StaticTest st2 = new StaticTest();
    //现在,即使你创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享同一个i;
    //在这里,st1.i和st2.i指向同一存储空间,因此它们具有相同的值47;

引用static变量
引用static变量有两种方法:

  • 可以通过一个对象去定位它,如st1.i;
  • 可以通过类名直接引用,如StaticTest.i,而这对于非静态成员则不行;(使用类名是引用static变量的首先方式,这不仅是因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了更好的机会)

类似逻辑也应用于静态方法。既可以像其他方法一样,通过一个对象来引用某个静态方法,也可以通过特殊的语法形式ClassName.method()加以引用。定义静态方法的方式也与定义静态变量的方式相似:

Class StaticMethod{
static void increment(){StaticTest.i++}
}

尽管当static作用于某个字段时,肯定会改变数据创建的方式(因为一个static字段对每个类来说都只有一份存储空间,而非static字段则是对每个对象有一个存储空间),但是如果static作用于某个方法,差别却没那么大。static方法的一个重要用法就是在不创建任何对象的前提下就可以调用它;
java.lang包
有一个特定类会自动被导入到每一个Java文件中:java.lang。由于java.lang是默认导入到每个Java文件中的,所以它的所有类都可以被直接使用。
main方法
如果你创建一个能独立运行的类,那么该类必须包含一个名为main()的方法,形式如下:

public static void main(String[] args) {}
//public关键字意指这是一个可由外部调用的方法。main()方法的参数是一个String对象的数组,args用来存储命令行参数

编译和运行
安装好JDK后,还需设定好路径信息,以确保计算机能找到javac和java这两个文件;

注释和嵌入文档

注释
Java里有两种注释风格:

   第一种,以"/*"开始,以"*/"结束。可跨越多行
   /* System.out.println(st1.i);
    System.out.println(st2.i);
    System.out.println(StaticTest.i);*/
第二种,单行注释,以"//"起头,直到句末
//this is a comment that

注释文档
javadoc是用于提取注释的工具,它输出的是一个HTML文件,可以用Web浏览器查看;
语法

所有javadoc命令都只能在"/**"注释中出现,注释结束于"*/"
/**
 * 
 */

共有三种类型的注释文档,分别对应于注释位置后面的三种元素:类、域和方法;
注意:javadoc只能为public和protecten成员进行文档注释。private和包内可访问成员的注释会被忽略掉,所有输出结果看不到它们(不过可以用-private进行标记,以便把private成员的注释也包括在内)

参考书籍:Java编程思想
以上只是学习所做的笔记,以供日后参考!!!

猜你喜欢

转载自blog.csdn.net/z1790424577/article/details/81320513
今日推荐