1.对象存储位置

  1. 对象的引用存在栈中,对象存在堆中。new 出来的对象都在堆中存储。栈的存取速度较快。
  2. 所有局部变量都放在栈内存里,不管是基本类型变量还是引用类型变量,都存储在各自的方法栈中;
  3. 但是引用类型变量所引用的对象(包括数组,普通Java对象)则总是存储在堆内存中。
  4. 基本类型的包装器类 如 Integer 可以在堆中创建一个非基本对象,用来表示基本类型。
  5. 也可以使用 Integer i = 1, Java SE5的自动包装功能将自动的将基本类型转换为包装器类型

2.创建新的数据类型:类

  1. Java中所做的全部工作就是 定义类,生产类的对象,以及发送消息给对象,对象只能由类产生。
  2. 类中有字段和方法。字段可以是基本类型也可以是某类的对象,通过引用和对象通信,如果是引用则一定要初始化该引用,使其于一个实际对象关联。
  3. 对于类内的字段叫类的成员变量,方法内的字段叫局部变量,局部变量的作用域是这个方法。
  4. 一切对变量的修改表达式都在方法中进行,而不能出现在类中,类中只能定义字段和方法。而对变量的定义在类中方法中都可以。
     class A {
    int i = 1; //定义类的字段为基本类型,并初始化为1
    // i = 2; //错误,不能在类中出现表达式 B b; //字段为对象的引用,未初始化,运行时自动初始化为null
    B c = null;// 字段为对象的引用,初始化为null,即该引用c未指向任何对象
    B d = new B();//字段为对象的引用,初始化并指向B类的一个实例
    //初始化的地方,方法不仅仅是上面的2种
    } class B { }
  5. 变量作为类的成员时(变量作为类的字段,不在方法中)即使不初始化,编译器也会给定一个默认值,确保得到初始化。
    基本类型及其对应数组类型 默认值
    boolean false
    char  null
    byte (byte)0
    short (short)0
    int 0
    long 0L
    float 0.0f
    double 0.0d
  6. 在C语言中,char类型占一个字节,在Java中char类型占2个字节。 所以Java中char可以存汉字,而C语言中Char不能存汉字。
  7. 唯一标识(区别)一个方法的就是方法签名,即 方法名和参数列表。不依据方法返回类型区分。方法中定义一个局部变量 如 int x 必须要初始化,编译器不会默认初始化为0,运行时会报错
  8. 创建一个类只是描述了这个类的外观和行为,并没有为其分配存储空间,只有当new之后才会在堆中分配内存空间来存放数据。

3. 局部变量与成员变量

public class NO1 {
public static int a = 2;//类成员变量作用域整个类
public static int b = 3;//类成员变量作用域整个类
public int c = 30;//成员变量作用域整个类 public static void main(String[] args) {
NO1 no1 = new NO1();//局部变量作用域是整个main方法
no1.f(a, b);//把ab的值传入方法。
System.out.println(a);
System.out.println(b);
no1.g(no1);// 复制一份执行no1引用传递给方法
} /*方法接收的参数其实也是方法的局部变量如 a b */
void f(int a, int b) {
//int a = a;
//int b = b;
int c = 0;//局部变量
a = a + b;//这里的a没有this它就是方法的参数,而不是成员变量
b = a + b + 1; // 成员变量a b 只是和成员变量重名而已,并不会改变成员方法的值
c = a + b;
System.out.println(c);
}
void g(NO1 no){ //no也是局部变量
//NO1 no = no;
System.out.println(no.c);//此时no指向传递进来的对象。
no = new NO1();// 局部变量no被指向其他对象
}
}

4.  static关键字

  • 只有new之后会为数据分配存储空间,如果只想为某一个特定域分配空间,或者某个方法分配空间,而不通过new,那就使用static关键字,static域或者方法可以不用通过对象去调用,尽管它一定定义在类中。
public class MyDemo {

    public static void main(String[] args) {
A.i++; //通过类名直接引用变量i
A.staticMethod();//通过类名不创建对象直接调用静态方法
//A.method();//非静态成员不能直接引用
A st1 = new A();
A st2 = new A();
System.out.println(st1.i == st2.i);//true } } class A {
static int i = 1; //static 字段
static{
//static 方法块
} static void staticMethod(){
//static 方法
} void method(){
//非 static 方法
}
}

通过

System.out.println(st1.i == st2.i);//true

看出 static字段对于每个类来说都共享一份存储空间,而非静态字段则是每个对象都有各自的存储空间

5. 注释

6.编码风格

  • 参考《阿里巴巴Java开发手册》

《Java编程思想》笔记 第二章 一切都是对象的更多相关文章

  1. Java编程思想笔记(第二章)

    第二章  一切都是对象 尽管Java是基于C++的,但相比之下,Java是一种更纯粹的面向对象程序设计语言. c++和Java都是杂合型语言(hybird language) 用引用(referenc ...

  2. java编程思想(2)--一切都是对象

    1创建对象 String s ;创建引用,并未初始化,即引用未关联任何东西 String s2="asda"; 初始化 System.out.println(s2); System ...

  3. Java编程思想(二)一切都是对象

    2.1用句柄操纵对象 尽管一切都看作是对象,但是操纵的标识符实际上是指向一个对象的“句柄”(handdle): 拥有一个句柄并不表示必须有一个对象同他连接: String  s:   这里创建的只是句 ...

  4. java编程思想笔记(第一章)

    Alan Kay 第一个定义了面向对象的语言 1.万物皆对象 2.程序是对象的集合,他们彼此通过发送消息来调用对方. 3.每个对象都拥有由其他对象所构成的存储 4.每个对象都拥有其类型(TYpe) 5 ...

  5. java编程思想笔记(1)

    java编程思想笔记(1) 一,对象的创建和生命周期 对象的数据位于何处?怎样控制对象的生命周期? 在堆(heap)的内存池中动态地创建对象. java完全采用了动态内存分配方式. 二,垃圾回收器 自 ...

  6. [Java编程思想] 第二章 一切都是对象

    第二章 一切都是对象 2.1 用引用操纵对象   创建一个String引用: String s;   这里所创建的只是引用,并不是对象.   创建一个引用的同时便初始化: String s = &qu ...

  7. Java编程思想——第17章 容器深入研究 读书笔记(三)

    七.队列 排队,先进先出. 除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: ad ...

  8. Java编程思想 第21章 并发

    这是在2013年的笔记整理.现在重新拿出来,放在网上,重新总结下. 两种基本的线程实现方式 以及中断 package thread; /** * * @author zjf * @create_tim ...

  9. Java编程思想——第17章 容器深入研究(two)

    六.队列 排队,先进先出.除并发应用外Queue只有两个实现:LinkedList,PriorityQueue.他们的差异在于排序而非性能. 一些常用方法: 继承自Collection的方法: add ...

随机推荐

  1. Java项目启动时候报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 解决办法

    今天在发布Java项目的时候又遇到    Neither the JAVA_HOME nor the JRE_HOME environment variable is defined  At leas ...

  2. NO5——素数筛选

    #include <stdio.h> int main() { ]={}; ;i<=;i++) a[i]=; ;i<=;i++) if(a[i]) ;j+=i) a[j]=; ...

  3. android桌面悬浮窗仿QQ手机管家加速效果

    主要还是用到了WindowManager对桌面悬浮进行管理. 需要一个火箭的悬浮窗 一个发射台悬浮窗  ,判断火箭是否放到了发射台,如果放上了,则使用AsyTask 慢慢将火箭的图片往上移.结束后., ...

  4. Map.Entry遍历Map

    Map.entry是Java中的一个接口.每一个Map.entry代表一个map对象. 可以通过 Map是java中的接口,Map.Entry是Map的一个内部接口,它表示map中的一个实体(及一个k ...

  5. [剑指Offer] 41.和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  6. [C/C++] 深拷贝和浅拷贝

    ·默认拷贝构造函数可以完成对象的数据成员值简单地复制-----浅拷贝 ·对象的数据资源是由指针指示的堆时,默认拷贝构造函数仅作指针值的复制,需要显式定义拷贝构造函数-----深拷贝 首先定义几个点: ...

  7. web颜色转换为delphi

    今天在写写一个日志浏览和报警功能时,要求用多种颜色去显示不同的信息,客户给出的颜色是web的 rgb颜色,就是用6位16进制数去表示的颜色,直接把他赋值给Delphi的TColor变量,发现显示的颜色 ...

  8. 简单配置 Tomcat 的 Server.xml(war包发布)

    <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" ...

  9. BZOJ 3876:支线剧情(有下界最小费用最大流)

    3876: [Ahoi2014]支线剧情 Description [故事背景]宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧 ...

  10. 用Web Service实现客户端图片上传到网站

    由于项目需要,通过本地客户端,把图片上传到网站.通过webservice. 这是客户端代码: private void btnimg_Click(object sender, EventArgs e) ...