这一篇是JAVA编程思想的第二章主要内容的重点。
尽管Java是基于c++的,但是相比之下,Java是一种更纯粹的面向对象程序设计语言。
首先要对Java有一个正确的认知,我们尽量用一种思想去看待Java语言——一切都是对象。
要用引用去操纵对象,就像遥控器去操控电视机一样,即使没有电视机,遥控器也可以存在,也就是说,当我们拥有一个引用,不一定要有一个对象和他相关联。比如:
String s;
这里创建的只是引用,并不是对象,如果使用s会报错,所以一般在创建引用的同时便进行初始化。如
String s = "asdf";
一旦创建了一个引用,我们便希望能够和一个新的对象相关联,通常使用new来进行,new关键词表示给我一个新的对象。
存储方式有很多,比如:
寄存器:最快的存储区域,在处理器内部,寄存器数量极其有限,所以按需分配,不能直接控制
堆栈:位于RAM中,堆栈指针可以从处理器那里获得直接支持。堆栈指针向下移动则分配新的内存,若向上则释放内存。这是一种有效的分配存储方法,仅次于寄存器。但是在创建程序是,Java系统必须知道存储在堆栈内的所有项目的确切生命,以便上下移动指针,这一约束限制了程序的灵活性,虽然某些java数据存储在堆栈中——特别是对象引用,但是Java对象并不存储在其中。
堆:一种通用的内存池,用于存放所有的Java对象,不同于堆栈,编译器不需要知道存储的数据在堆里面存活多久。
常量存储:常量值一般直接存放在程序代码的内部,这样做是安全的,因为永远不会有改变,有时在嵌入式系统中,常量本身会和其他部分部分隔离开,所以在这种情况下,可以选择将其存放在ROM中。
非RAM存储:流对象和持久化对象。
特例:基本对象。
因为new将对象存储在堆里,所以用new创建一个对象,特别是小的、简单的变量往往不是很有效。对于这种类型,可以不用new来创建,二十创建一个并非是引用的自动变量。这个变量直接存储值并置于堆栈中,因此更加高效。
几乎所有的程序设计语言都支持数组,java确保数组会被初始化并且不能在它的范围之外被访问。
当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键词null。如果试图使用一个还是null的引用,在运行是将会报错。
永远不需要销毁对象
作用域
{
int x = 12;
}
作用域由花括号的位置决定。
{
int x = 12;
{
int x = 96;
}
}
这种写法在c和c++中允许,但是在Java中是不被允许的。但是当用new创建一个Java对象时,它可以存活在作用域之外,也就是说,由new创建的对象,只要你需要,就会一直保留下去。
那么内存就会变成一个几首的问题,怎样防止对象填满内存呢,Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不会再被引用的对象。随后,释放这些对象的内存空间,以便供其他新的对象使用。
创建新的数据类型:类
大多数的面向对象的程序设计语言习惯用class关键字来表示类
class ATTypeName {...}
ATypeName a = new ATypename();
上面用来定义类,下面则是new创造一个这种类型的对象。但是在定义它的所有方法之前,还没有办法能让它去做更多的事情。
类中的两种元素:字段(数据成员)和方法(成员函数)
而当类的某个成员是基本数据类型,即使没有进行初始化,Java也会确保它获得一个默认值,如右表所示:
当变量作为类的成员使用时,Java才确保给其默认值。然而上述确保初始化的方法并不适用于“局部”变量,即并非某个类的字段时。
方法、参数和返回值
方法,也就是其他语言中的函数。方法名和参数列表(它们合起来被称为“方法签名”)唯一的标识出某个方法。
java中的方法只能作为类的一部分来创建。方法只有通过对象才能够被调用,且这个对象必须能执行这个方法调用。
objectName.methodName(arg1, arg2, arg3);
int x = a.f();
返回值的类型必须要和x的类型兼容
若返回类型时void,return关键字的作用只是用来退出方法。因此,没有必要到方法结束时才离开,可在任何地方返回。但如果返回类型不是void,那么无论在何时返回,编译器都会强制返回一个正确类型的返回值。
创建一个Java程序
通常来说,当创建类时,就是在描述那个类的对象的外观和行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外界调用。但是有两种情形时上述方法无法解决的,一个是只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本不创建任何对象。另一种时希望某种方法不与包含它的类的任何对象关联在一起,也就是说,即使没有创建对象,也能够使用这个类。
通过static可以满足这种要求。当生命一个事物是static的时候,就意味着这个域或者这个方法不会与包含它的那个类的任何对象实例关联在一起。所以即使从未创建某个类的任何对象,也可以调用其static方法或访问其static域。
有些面向对象语言采用类数据和类方法两个术语,代表那些数据和方法只是作为整个类,而不是类的某个特定对象而存在的。
看下面的代码:
Class StaticTest{
static int i = 47;
}
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
现在即使创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共同享用一个i,也就是st1.i和st2.i指向同一存储空间,因此它们具有相同的值47。
引用static变量有两种方式,一种是通过一个对象去定位它,另外一种可以通过其类名直接引用,但是这对于非静态成员来讲是不可以的
StaticTest i++;
这是st1和st2中的i都为相同的值48
方法也是同样如此
class Incrementable{
static void increment(){ StaticTest.i++}
}
//第一种
Incrementable sf = new Incrementabel();
sf.increment();
//第二种,因为incrementable是一个静态方法,所以可以直接通过类调用
Incrementable.increment();
尽管当static作用域某个字段时,肯定会改变数据创建的方式(因为一个static字段堆每个类来说都只有一份存储空间,而非static字段则是对每个对象都有一个存储空间)
和其他任何方法一样,static方法可以创建或使用与其类型相同的被命名对象,因此,static方法常常拿来做“牧羊人”的角色,负责看护与其隶属于同一类型的实例群。
第一个Java程序
import java.util.*;
public class HelloData{
System.out.println("Hello");
}
system类中有很多属性,若选择out,就会发现他是一个静态PrintStream对象,因为是静态的,所以不需要创建任何东西,out对象便已经存在了,只需直接使用即可。
类的名字必须和文件名相同,如果像现在这样创建一个独立运行的程序,那么文件中必须存在某个类与该文件同名(否则,编译器会报错),且那个类必须包含一个名为main()的方法,如
public static void main(String[] args){}
这个程序中并未用到args,但是Java编译器要求必须这么做,因为args要用来存储命令行参数。
本文介绍了Java作为一种面向对象的编程语言,强调一切都是对象的思想。文章讨论了对象的存储方式,包括寄存器、堆栈、堆、常量存储和非RAM存储。还提到了基本对象的特例,以及如何通过new关键字创建和管理对象。Java的垃圾回收器自动处理不再使用的对象,避免内存泄漏。此外,文章涵盖了类、方法、参数和返回值的概念,以及如何创建Java程序的基本步骤。
1075

被折叠的 条评论
为什么被折叠?



