欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一切都是对象

程序员文章站 2024-03-17 18:32:28
...

一切都是对象

2.1用引用操作对象

在Java中一切都被视为对象。尽管一切都可以 看作 对象,但是操纵的标识符实际上是对象的一个 引用(reference)
此外引用可以单独存在。如:

String s; //单纯的一个引用。
String str="abc"; // 创建引用的同时进行初始化。

2.2必须有你创建所有对象

一旦创建了一个引用,就希望它能与一个新的对象相关联。通常用 new 操作符来实现。new 关键字的意思是 “给我一个新对象”。所以前面的例子可以写成

String s=new String("abc");

2.2.1存储到什么地方

  1. 寄存器 :这是最快的存储区,因为它存在于CPU的内部。但是其数量极其有限。你不能控制它的分配。
  2. 堆栈 :位于RAM(随机访问存储器,这里说一下 随机 的意思:随机是想读哪就读哪,而不是不受控制随便的读取数据),但通过 堆栈指针 可以从cpu那里获取支持,前面说到过,只需要移动栈顶指针就好。但是这约束了程序的灵活性。所以某些Java数据存储在堆栈中——特别是对象的引用,但是对象存储在堆中。
  3. :一种通用内存池(也位于RAM中),用于存放所有Java对象。堆不同于栈的是:编译器不需要知道对象要存活多长时间。因此具有灵活性。不过这是有代价的,这要花费更多时间。
  4. 常量存储 常量值通常存储于代码中。因为他们永远不会改变。
  5. 非RAM存储 :数据完全存活于数据之外。如 流对象持久化对象
    • 流对象:将对象转化为字节流,通常被发送给另一机器。
    • 持久化对象:对象被存放在磁盘上,即使程序终止它们依然可以存在。

2.2.2特例:基本类型

基本对象不使用 new 创建,而是创建一个并非是引用的 “自动” 变量。这个变量直接存储值,并置于堆栈中。
一切都是对象

  • 基本类型具有包装器类,使得可以在堆中创建一个非基本对象如
char c= 'x';
Character ch = new Character(c);
//或
Character ch = new Character('x');
//或
Character ch = 'x";
//并可以反向转换
char c = c ;
  • 高精度数字
    1. BigInteger (整数)
    2. BigDecimal(任意精度定点数)

2.2.3Java中的数组

  • Java的数组是安全的。其有边界检查
  • 当创建了一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会被自动化初始为某个值,该值有自己的关键字 null 。一旦Java看见 null ,说明这个引用还没有指向某个对象。使用这样的引用java将会在运行时报错。
  • 还可以创建存储基本数据类型的数组,并且自动置零。

2.3永远不要销毁对象

2.3.1作用域(scope)

作用域决定了在其内定义的变量名的可见性和生命周期。
c/c++中的 隐藏 特性在Java中不适用,如下面的代码在c/c++中是正确的,但是在Java中是错的

{
    int x=12
    {
        int x=65;
    }
}

2.3.2对象的作用域

new 一个对象时,它可以存活于作用域之外。但是其引用在作用域终点消失。
如果有用该对象就会一直存在,否则 垃圾回收器 就会清理这些对象。

2.4创建新的数据类型:类

class ATypeName //定义一个名为 ATypeName 的类
{
    //class body
}

ATpyeName a =new ATypeName();

2.4.1字段和方法

类中可以存在两种元素

  1. 字段 :有时被称为 数据成员。其可以是任何类型的对象。可以使用其引用与其进行通信。也可是基本类型。如果字段是某个对象的引用,那么必须初始化该引用。如果是基本类型,就会赋上默认值。
  2. 方法 :见2.5

2.5 方法,参数和返回值

ReturnType methodName ( /*argument list */){
    //methodBody
}
  • 方法名和参数列表合称为 方法签名 ,其能唯一的标识某一方法。
  • Java中的方法只能作为类的一部分来创建。
ReturnType a=methodName(arg1,arg2,...);
//或
className.methodName(...);
  • 这种调用方法通常被称为 发送消息给对象 ,消息是 methodName(),对象是 className

2.6构建第一个Java程序

2.6.1名字可见性

为了区分重名类,可以使用域名反转作为包名(如:com.baidu)

2.6.2使用其他构件

使用 import 关键字

import java.util.ArrayList; //单个导入
//或
import java.util.*;//批量导入

2.6.3static关键字

通常来说,只有 new 之后,才会为其分配内存。
但是有两种情形是上面所无法解决的:

  1. 只想单独分配一段空间,但是不考虑要创建对象(如声明一个变量作为对象计数器)
  2. 希望某个方法不与包含它的类的对象联系在一起。
    有些地方称上述为 类数据类方法
    其常常充当 牧羊人 的角色
class StaticTest{
    static int i=47;
    static increment(){ StaticTest.i++; }
}

StaticTest st1=new StaticTest();
StaticTest st2=new StaticTest();

StaticTest.i++; // st1 st2 中的i都会变为 48 (类数据)

StaticTest.increment(); // 变为 49 (类方法)

2.7略

注意几点

  • 类名要和包名相同
  • 入口函数
public static void main(String[] args){}

2.8注释和嵌入式文档

2.9编码风格

相关标签: java