Java_一些小知识点

来源:互联网 发布:淘宝女装装修模板 编辑:程序博客网 时间:2024/05/22 06:06

变量什么情况下会自动被赋一个初始值

基本类型(不包括基本类型数组)的成员变量在定义的时候如果没有初始化,那么编译器会自动初始化给他赋一个初始值。局部变量则不会。

(int[] i = new int[5];   这样的式子不管是成员变量还是局部变量,都会有默认的值。其实它和上面说的不一样,它已经初始化了,所以会有默认值,上面说的是没有初始化的情况下。)

(另外,final类型的成员变量必须初始化,不然编译器会报错)

缺省的构造方法

如果一个类中没有构造方法,编译器会自动给这个类添加一个无参的缺省构造方法。

如果一个类中已经有了构造方法,不管是无参的还是有参的,编译器都不会再创建缺省构造方法了。

看下面的例子:

class Dog {
    private String name;
    Dog(String name) {}
}

如果这样写new Dog();那么编译器会报错。

值传递和引用传递

当一个变量作为一个参数传入方法内部的时候,会有两种不同的传递方式:值传递和引用传递。

值传递的特点:不管方法内部对传进去的参数作任何改变,也不会影响方法外部的变量的值。

引用传递的特点:方法内部对传进去的参数作的改变也会影响方法外部的变量的值。

那么哪些是值传递,哪些是引用传递呢?

  1. 基本类型(8种)的传递都是值传递。
  2. 引用类型(除String外)都是引用传递。
  3. Strng比较特殊,它虽然是引用类型,但是却是值传递。

基本类型的取值范围

在讲解基本类型的取值范围之前,先讲讲二进制怎么转换为十进制(算取值范围的时候会用到)。

首先二进制有带符号的二进制和不带符号的二进制。

比如:1111

如果它是不带符号的二进制,那么它的十进制值 = 2^3 + 2^2 + 2^1 + 2^0 = 2^4 - 1 = 15

如果它是带符号的二进制,那么最高位(千位)就是符号位,1代表负数,0代表正数。那么负的二进制怎么换算为十进制呢?首先要把除符号位的所有位按位取反再加1(算出来是1001),然后在算它的十进制值 = -2^0 = -1

Java中基本类型的取值范围

基本类型字节数位数最大值最小值byte1byte8bit2^7 - 1-2^7short2byte16bit2^15 - 1-2^15int4byte32bit2^31 - 1-2^31long8byte64bit2^63 - 1-2^63float4byte32bit3.4028235E381.4E - 45double8byte64bit1.7976931348623157E3084.9E - 324char2byte16bit2^16 - 10

其实,这些取值范围不需要死记,可以通过位数计算出来,下面举两个例子(byte和char)说明一下

byte的情况:

byte占8位,而且有正有负。最大值当然就是01111111 = 2^7 - 1。因为负的二进制有个按位取反再加1的操作,所以最小值是10000000,按位取反后为11111111,再加1后为110000000 = -2^7

char的情况:

char占16位,而且没有负值。所以最小值是0。最大值是1111111111111111 = 2^16 - 1

Java中的权限访问修饰符

Java中有四种权限访问修饰符:private、(default)、protected、public,它们的访问权限如下:

 包外子类包内本类publicYESYESYESYESprotectedNOYESYESYES(default)NONOYESYESprivateNONONOYES继承时需要复写父类的方法的时候,权限反问修饰符可以往范围大的变,不可以往范围小的变。

接口和抽象类的比较

 接口抽象类功能实现多继承作为直接父类被继承成员变量必须是public static final的常量
(如果不加修饰符,默认是public static final的)没有要求,和普通类一样方法所有方法都必须是public abstract的
(如果不加修饰符,默认是public abstract)抽象方法和非抽象方法都可以有
一个抽象类并不一定必须存在非抽象方法
抽象方法的访问权限没有要求,和普通类一样
(但是abstract关键字和接口不同必须要加)抽象方法的实现如果是接口继承接口,或者是抽象类实现接口,都不需要实现抽象方法和接口一样能不能实例化不能不能