0%

java编程思想

一、用句柄操作对象

句柄(handle):或者指针或者引用,句柄可以理解为遥控器、电视机是对象,用遥控器控制对象

A handle is a small round object or a lever that is attached to a door and is used for opening and closing it. 门把手
A handle is the part of an object such as a tool, bag, or cup that you hold in order to be able to pick up and use the object. 柄; 把

句柄和对象(遥控器和电视机)是可以独立存在的。也就是说,只是拥有句柄,而不一定就必须有对象与它连接。String s;
只是创建句柄,没有指向对象的话,不能对其操作。
更安全的做法是:创建句柄时,要初始化。

二、对象作用域

{
String s=new String(“abc”);
}
句柄会在作用域的终点处消失,而对象并不会,但是因为唯一句柄结束,也无法访问到对象,此时需要垃圾处理机制(GC)来处理这些对象
具体处理方法:https://blog.csdn.net/jiangshangchunjiezi/article/details/88688749

三、新建数据类型:类

数据成员(字段):包含静态、非静态

  • 基本数据类型
    各种类型有自带的默认值
    与局部变量不同,局部变量只定义,并不会有默认值(是随机值)。为了提高安全性,会有编译错误
  • 句柄:默认值是null(什么也没有)
    若不对其初始化,则直接使用,则会有空指针异常(即没有对象)java.lang.NullPointerException
    静态句柄必须定义时候初始化

数据成员没有要求定义就初始化的原因?
数据成员可以在运行时(构造器、调用方法)初始化,更加灵活。
方法

  • 格式:返回类型 方法名(/自变量列表/) {/方法主体/}
  • 自变量列表:可以是基本数据类型(传递的是值)和句柄

static

创建的句柄放入栈中;创建的对象、基本数据类型放入堆中;

static适用场景:

  • 数据成员:只用一个存储空间保存一个特定数据。无论创建多少对象或者不创建对象

  • 特殊的方法:它与这个类的任何对象没有关联。也就是说即使没有创建对象,也需要一个能调用的方法。比如java程序的入口方法 main

从static适用场景来看,static定义的成员变量或方法与对象(实例)无关。而非静态的成员和方法必须创建一个对象,因为必须知道操作的具体对象。

由于static不需要创建任何对象,所以不可直接简单的调用其他成员,也不可引用一个已命名的对象,从而直接访问非static成员或方法。
1582702733(1)

四、构造器

初始化顺序:定义时初始化早于构造器初始化
1582714412
在这个例子中,句柄t3初始化了2次:一次是定义时;一次是构造器,此时第一次的对象会被清理掉。似乎降低了效率,但能保证正确的初始化。若两处都没初始化,则使用会出现空指针异常。

静态数据的初始化
1582726369(1)
上图中若不创建Table对象或者Table.b1(2),则Table中静态数据t1、t2永远不会创建。若创建,则只创建1次。

总结一个类中初始化的创建顺序,假设为Dog
①对象首次创建或者static字段/方法首次访问时,java解释器必须找到Dog.class(编译会生成此文件)
②找到Dog.class后(它会创建一个Class对象),它的所有static初始化模块运行。因此,static初始化仅发生一次,即在Class对象首次载入的时候。
③创建new Dog()时,Dog对象的构建进程首先会在内存堆里为Dog对象分配空间
④这种空间会清为0,将Dog中的所有基本数据类型(这里已经是非静态了)设为他们的默认值(0用于数字,boolean和char等价设定)
⑤进行字段定义时发生的所有初始化都会执行
⑥执行构造器。实际要有相当多的操作,特别涉及到构造器时候

静态代码块
在对静态数据初始化时,①可以在定义时初始化②可以用静态代码块初始化static {/静态变量初始化/}

数组初始化
数组代表一系列相同的对象或者基本数据类型

  • 基本数据类型 int[] a={1,2,3}、int[] a=new int[]{1,2,3}
    int [] a=new int[3],这种情况初始值为基本数据类型默认值
  • 引用类型(对象) Integer[] a1={new Integer(1)}; Integer[] a1=new Integer[]{new Integer(1)};
    Integer[] a=new Integer[1]; 初始化为null
  • 有时只是创建句柄,因为可以引用赋值,从而指向同一个对象。a2=a1
    有时数组的长度是不确定的(即运行时确定数组长度),则可以只创建句柄:
    1582732336(1)
  • 对相同类型的理解(所有类型的父类均是Object,父类可以指向子类对象,子类只是细分)
    Object[] o={new Integer(1),new classA()};

默认构造器
若不显式写,会有默认的构造器;若显式写(即使没有自变量列表),则不会生成默认构造器。
构造器是自动调用的,不能像普通方法调用。
new classA(); 作用:创建一个对象,并自动调用构造器初始化对象。
classA a=new classA();作用:创建一个对象,并自动调用构造器初始化对象。将句柄指向该对象

五、方法重载

根据自定义变量列表区分方法,而不是用返回值类型。
因为带返回值类型的方法,可以直接function()调用,这让编译器难区分、程序员也难理解。
常见应用:构造器

六、this关键字(当前对象):this只能在方法内使用

方法执行是如何确定哪个对象的?
编译器的操作pick(a) 会将对象传入方法中,从而知道是对哪个对象的操作
1582711645(1)

类中一个方法(不是构造器)内部调用另一个方法,this可以不加
1582709732(1)

在构造器里调用其他构造器
若一个类写了多个构造器,那么经常需要在构造器里调用其他构造器,避免重复代码 (必须写在第一行)
形参与成员数据同名,区分
1582709854(1)

通过this返回当前对象的句柄
1582710580(1)

  • 进一步理解static中“一个static方法内部不可对非static方法调用”
    意思:
    Class A{
      static function(ClassName cn)
        {
        //可调用静态方法 A.fun2()
        //不可调用非静态方法 因为fun1()=this.fun1()
        }
       }
    非static方法调用需要对象