Java编程思想笔记-五

1.在 Java 中,由于提供了“构建器”,所以类的设计者可担保每个对象都会得到正确的初始化。
不接受任何参数的构造器叫做默认构造器

2.方法重载:方法有同样的名字,并且每个重载的方法都采取独一无二的参数类型列表。

  • 涉及基本类型的方法重载:
    若我们传入的数据类型“小于”方法中声明的形式参数类型,实际数据类型就会被提升。
    char 获得的效果稍有些不同,这是由于它没有发现一个准确的 char匹配,就会转型为 int

    以下代码,byte的稍大类型为short,f(b)匹配到f(short i),而char只能直接提升到int,f(c)无法匹配到f(short i),只能匹配到f(int i)

    static void f(int i){
        System.out.println("f(int)");
    }
    static void f(short i){
        System.out.println("f(short)");
    }
    public static void main(String[] args) {
        char c = 2;
        byte b = 1;
        f(c);
        f(b);
    }
    /* 输出
    f(int)
    f(short)
    */
  • 如果传入的参数类型较大,就必须手动窄化转换,否则编译器报错

3.不能根据返回值类型来区分过载的方法。

4.如果已经定义了一个构造器(无论是否有自变量),编译程序都不会帮我们再定义默认构造器。
所以一般建议在自定义构造方法时自己重载一个无参数构造器。

5.this关键字:表示当前对象的引用

  • 在构造其中,如果为this添加参数列表,则表示调用构造器,构造器为符合参数列表的那一个构造方法。构造器中不能通过this调用两次构造器
  • 除构造器外,编译器禁止在其他任何方法中调用构造器

    6.不可从一个static方法内部发出对非 static
    方法的调用,是因为这样调用无法确定调用的对象,但是可以给static方法传入一个对象,通过对象调用非静态方法。

    7.垃圾回收

  • Java 通过垃圾收集器回收由不再使用的对象占据的内存。但是如果对象占用的内存有一块特殊区域,无法被垃圾回收释放,可自己定义finalize()方法对那部分内存进行释放,垃圾回收器准备释放对象占用的空间时,首先会调用对象的finalize()方法,然后才是真正释放对象占用的内存。

  • 对象可能不被回收:储存空间只要不到濒临用完的时候,对象占用的空间可能总得不到释放。因为垃圾回收本身也有开销,不到必要时不需要调用。
  • 垃圾回收不等于“析构”
  • 垃圾收集只跟内存有关。垃圾收集器存在的唯一原因是为了回收程序不再使用的内存,finalize的真正用途或需求,是释放通过某种创建对象方式以外的方式分配给对象的存储空间(有点绕。。我认为是为了释放不能通过垃圾回收器自动释放的内存)
  • 垃圾回收技术
    (1)引用计数。当有引用连接至对象时,计数加1,引用离开作用域或者被置为null,计数减1,垃圾回收器遍历所有对象,当发现对象计数为0时,释放空间。
    缺点:无法释放循环应用的对象。
    (2)停止-复制。暂停程序,将所有“活”对象复制到另一个堆,没复制的就是垃圾对象。
    缺点:第一占用比实际多一倍的空间,第二程序稳定后产生垃圾较少,再进行这种操作开销大。
    (3)标记-清扫:遍历所有引用,找出活对象并标记,标记完成后清理未标记对象。

    java虚拟机会根据情况在“标记-清扫”与“停止-复制”中切换

6.成员初始化

  • 方法的局部变量不会有默认值,使用前必须初始化
void f() {
    int i;
    i++;//编译报错
}

7.构造器初始化

  • 成员的自动初始化先于构造器调用,即使成员散布于方法定义之间
  • 静态成员先于非静态成员,并且静态初始化只在Class对象首次加载时进行一次
  • 静态代码块,形式如下
class Spoon {
static int i;
static {
i = 47;
}
// . . .
与其他静态初始化动作一样
  • 非静态实例初始化
    与静态实力初始化比只少了个static关键字,代码块初始化优先级与非静态成员一样,代码块中可进行除了初始化以外的操作。

    初始化顺序:静态成员-静态代码块-非静态成员/非静态代码块-构造方法-局部变量

8.数组初始化

  • Java 中,可将一个数组分配给另一个,我们真正准备做的是复制一个引用
 int[] a1 = { 1, 2, 3, 4, 5 };
 int[] a2;
 a2 = a1;
这种操作后,对a2的修改会影响到a1
  • 数组的值会自动初始化,基本类型为默认值,引用类型为null
  • 可变参数列表
void f(Object... obj){
...
}
可变参数列表使得重载过程变得复杂:编译器会自动使用自动包装机制来匹配重载的方法,然后调用最明确的方法,但是使用无参数调用时,编译器就无法知道应该用哪一个方法了

9.枚举类型

  • 枚举类型的实例是常量,建议命名使用大写
  • 枚举的ordinal(),表示每个特定enum常量的声明顺序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值