think in java-1:一切都是对象

1.引用操纵对象

    对象与引用的关系可理解方电视与遥控关系 

     ·遥控板------操作电视机:通过遥控板操作电视机,电视机与遥控板可以独立存在,但要操作电视机只能通过遥控板(物理按键除外),理论上一台电视机只能由一个遥控板操作,关系为一一对应。

     ·引用--------对象:通过引用操作电视机,引用与对象也可以独立存在。创建一个引用而不与对象相关联,使用该引用,则会报运行时错误。这是因为引用未与对象关联,给引用发信息无对象接收。因此,安全做法为创建引用时对其进行初始化。String str = "abc";

     *java中通过引用操纵对象

2.java中存储位置

    · 寄存器------最快的存储区,位于处理器内部,数据有限,按需分配,不能直接控制,所以在程序中无法感受到其存在。

    · 堆栈区------位于通用RAM中,通过堆栈指针来释放或分配空间。指针向上移动则释放空间,指针向下移动则分配新的内存。因此java系统必须知道存放于堆栈中的生命周期,以便指针的移动。(java中的引用、基本数据类型区存在于此内存空间,且有明确的生命周期,在程序中以花括号为标识,在此花括号中的变量作用域即为该花括号范围)

    · 堆区---------存放所有java对象的地方,与堆栈区的区别是在此区域,编译器不需要知道其生命周期。需要创建对象,new一个对象,其即存储在此区域。

    · 常量存储----常量通常存放在程序代码内部。

    · 非RAM存储----主要指通过流的形式存放在电脑磁盘上,即使程序终止,保存的数据依然存在。

    * 堆区与栈区的区别及联系:

    1.存储数据类型:堆中存储的对象实例而栈中存放的是局部变量(对象及引用)

    2.执行速度:堆中创建对象会分配空间,对象类型、大小均不确定,而栈中要求存入的数据类型、大小均要确定,则运行效率高、执行速度快。

    3.灵活性:由于栈中数据类型及大小均需确定,而堆中比较自由,故堆中灵活性高于栈中。

    4.生命周期:栈中局部变量在其属性使用完毕后,自动释放。而堆中对象创建后,如果无对象引用所指向,则需一段时间后被垃圾回收器回收。

    5.数据共享:在栈中数据可共享,而在堆中只要new一个新对象,则会分配空间创建新对象。

    例:

      int a = 10;

     int b = 10

    创建两个变量a,b.此两对象存储于栈中.

    第一次执行int a = 10时,会检查栈中是否存在10的字面量,如果不存在,则创建该字面量

    第二次执行int b =10时,会检查栈中有否该字面量,如果存在,则直接将10字面量的引用传递给b,从而数据共享.

   * String类型存储比较特殊:

      String s1 = "abc";

       String s2 = "abc";

       System.out.println(s1==s2);

 执行结果为true,也行会有人s1==s2是引用比较,s1与s2是不同的引用,故结果为false,但实际上为true,要搞清楚此现象需理解String str = "abc" 与String str = new String("abc");

   string str = "abc",由于String类型是final类的,存储于常量池中。如果使用new String(),在运行时创建,存放在内存中。

  所以如果在编译时创建的字符串,存放在常量池中,而在运行时创建的字符串,则存放在堆内存中。

 如果通过Sring str = "abc"创建,则经历以下步骤,先检查常量池中是否存在字符串对象"abc",如果不存在,常量池中创建一份,然后将str引用指向"abc".

 如果通过String str = new String("abc")创建,则经历以下步骤,先检查常量池中是否存在字符串对象"abc",如果不存在则在常量池创建一分,然后在堆内存中存储一份。而str引用则指向堆内存中那一份对象。

3.基本数据类型

 由于数据创建对象时,需要通过new关键字创建对象,存放于堆内存中。而在程序中需要一些小的简单的变量,故引入了基本数据类型。boolean、char、byte、short、int、long、float、double、void

 高精度数据类型:

 BigInteger:表示任意精度的整数类型。

 BigDecimal:表示任意精度的浮点型类型。

 高精度数据类型与基本数据类型用法相差无几,只不过必须以方法调用的形式执行其运算符方式。

4.java中的数组

    java数组在创建时都需要初始化,对象数组,如果未人为初始化,则默认值为null

    java基本数据类型数组默认值为0;

5.java作用域

    java中作用域以大括号为标记,在花括号范围内的则为有效区域.

6.创建类

    java中以"class"作为类的关键词,类中成员包括"字段","方法".如果字段为基本数据类型,无初始值时编译器会填加黙认值,如果字段为对象的引用,则必须对其进行初始化.(注意:在方法中局部变量必须进行初始化,编译器不会对其初始化为黙认值,需定义时就进行初始化,否则会出现编译异常)

    6.1 类中字段

public class NewClass {
    private int i;
    private String string;
    private boolean b;
    private double d;
    private long l;
    private Person p;
    public static void main(String[] args) {
        NewClass nc = new NewClass();
        System.out.println(nc.i);
        System.out.println(nc.string);
        System.out.println(nc.b);
        System.out.println(nc.d);
        System.out.println(nc.l);
        nc.p.f();
    }

}
输出:
0
null
false
0.0
0
Exception in thread "main" java.lang.NullPointerException
    at allObject.NewClass.main(NewClass.java:17)

上例中由于对象Person未被初始化,则调用其下方法会报空指针异常,故类中对象需行进行初始化,保存程序运行正常.

    6.2 类中方法

    方法组成:方法名+参数列表(合起来称为方法签名),方法签名唯一的标识了某个方法.

    参数形式:   

public int methodName(String arg1,int arg2){

     return int;

 }

其中:methodName表示方法名,arg为参数,参数必须确定其类型且参数传递的为对象的引用.returrn 表示返回,如果要求该方法需要有返回值,则return后跟的必须是要求的返回值类型的值.

   6.3 java中基本知识

    类名:首字母大写,方法名:首字母小写,包名:公司域名反写,驼峰命名.

7.static关键字

    如果希望字段或方法与包含它的类无关联关系,则只需在字段与方法前加static关键字即可,表示整个程序独一份的存在,且整个程序中均可使用它,其存储在JVM的方法区中,先于对象而创建,要调用该字段或方法,可以通过类名+字段\方法名即可调用或设值.

package allObject;

public class StaticTest {
	static int i = 10;
	static String string = "Helloworld";
	public static void main(String[] args) {
		System.out.println(i);
		System.out.println(string);
	}

}

    *在同一个类中,static修饰的字段,方法可以直接使用.

public class Person {
	public static void main(String[] args) {
		System.out.println(StaticTest.i);
		System.out.println(StaticTest.string);
	}
}

    *在其它类中要调用静态方法或字段,则需加类名+方法名\字段名

    下例说明static修饰的字段为共有字段

public static void main(String[] args) {
        StaticTest st1 = new StaticTest();
        // i的初始值为10
        System.out.println(st1.i);
        // 执行i++两次,则值变为12,我们此时必变的为st1对象下的i
        st1.i++;
        st1.i++;
        // 创建对象st2
        StaticTest st2 = new StaticTest();
        // 输出st2下的i
        System.out.println(st2.i);
        // 执行结果为12,说明i是被两个对象所共用        
    }	

猜你喜欢

转载自blog.csdn.net/qq_37317845/article/details/79775672