Java基础知识学习3

1.由于类的构造器可以重载,所以可以采用多种形式设置类的实例域的初始状态。
a.在类的定义中直接将一个值赋给任何域。e.g:
public class Employee {
    private int id = assignId();

    public int getId() {
        return id;
    }
    private static int nextId = 1;
    static int assignId() {
        int r = nextId;
        nextId++;
        return r;
    }
}
b.在构造其中赋值。

c.初始化块。初始化块无论执行哪个构造器,都会先执行初始化块,然后运行构造器!

总结:系统执行构造器的步骤:
① 所有数据被出示华为默认值(0,false,null)
② 按照在类声明中的出现次序,依次执行所有域初始化的语句和初始化快
③ 如果构造器调用了其他构造器,则先执行其他构造器。
④ 执行构造器主体部分。

2.对类中方法参数的命名。要易懂!

3.可以调用另一个构造器。

4.finalize方法,析构,释放内存资源!可以为任何类添加finalize方法,但是很难知道这个方法何时调用!

5.类的设计技巧
① 一定要将数据设为私有
② 一定要对数据进行初始化,java不会初始化局部变量,但是会初始化对象的实例。最好不依赖java提供的默认值!
③ 不要在类中使用过多的基本数据类型。就是说用类代替多个相关基本类型数据的使用。
④ 不是所有的域都需要独立的访问器和域名更改器!
⑤ 使用标准格式进行类的定义。

6.用super条用父类的方法。或者使用父类的构造器。

7.如果一个数组试图存储一个其他类型的引用就会引发ArrayStoreException异常。

8.final类:不允许继承。final方法,不允许重载!

9.java中允许上转型。即子类的对象用父类来构造。但也失去了子类自己的方法。只能在继承层内进行类型转换。将超类转成子类前应进行instanceof检查。 (sub instanceof super)

10.父类顶一个抽象的方法,子类来实现。父类为抽象类,调用时,用子类的构造来实现父类的对象。调用子类自己的实现。

11. private :本类可见
    public :所有类可见
    protect :本包中和所有子类可见
    默认 :本包可见(即不加范围修饰符)
12.object类是所有java类的父类。

13.getClass()方法返回一个对象所属的类。

======================================================================================
Object 的相关方法改写等等。

14.java语言要求equals方法具有如下特性
a. 自反性. x.equals(x) == true
b. 对称性. x.equals(y) == true则 y.equals(x) ==true
c. 传递性. x.equals(y) == true, y.equals(z) == true 则 x.equals(z) == true;
d. 一致性. 如果x和y没有发生变化,则反复调用x.equals(y)的结果不应该发生变化
e. 对于任何非空对象 x.equals(null) == false
15. 完美equals方案:
①显式参数命名为otherObject,稍后需要将他转换成另一个叫做other的变量。
②检测this与otherObject是否引用同一个对象:if(this == otherObject) return true
③检测otherObject是否为null,如果是null返回true,这项检测很必要
④比较this和other是否属于同一个类。如果equals的语义在每个子类中有所改变,就使用getClass 检测。 if(getClass != otherObject.getclass()) return false;如果所有子类的语义都一样则使用instanceof 检测。if(!(otherObject instenceof ClassName)) return false;
⑤将otherObject转换为相应的类变量。ClassName other = (ClassName)otherObject;
⑥使用==进行基本比较,使用equals进行对象比较。如果所有的域都匹配则为true
eg. 
    @Override
    public boolean equals(Object other)
    {
        if (this == other)
            return true;
        if(other == null)
            return false;
        if(getClass() != other.getClass())
            return false;
        Employee e = (Employee) other;
        if(e.getName().equals(this.getName())
                && e.getSalary() == this.getSalary()
                && e.getHireDay().equals(this.getHireDay())
                && e.getDescription().equals(this.getDescription()))
        {
            return true;
        }
        else
            return false;
 
16.比较两个数equals的方法。 Array.equals(type[] a,type[] b)  

17.int hashcode() 返回对象的散列码,如果两个对象相等则必须返回相同的散列码。如果改写equals方法,则要改写hashcode方法。

18.static int hashCodee(type[] a).返回数组的散列码。

19. toString方法。一般书写规范。尽量所有类都加上toString方法,方便自己和所有使用该类的人。
eg. 
    @Override
    public String toString()
    {
        return getClass().getName()+"[name=" + super.getName() +", salary=" + salary + ", hireDay=" + hireDay +"]";
    }

数组继承了Object的toString方法,数组类型将按照旧的格式打印。
如:
       int[] wppp = {5, 2, 0};
       System.out.println(wppp.toString());
输出结果为:
[I@47b480  其中[I为int。
修正的方法是调用 Arrays.toString(wppp);

20. getClass() 返回对象信息的类对象!

21.clone()创建一个对象的副本。

=======================================================

22.java.lang.Class.getName():返回类的名字。 java.lang.class.getsuperclass():返回超类信息。

23.泛型数组列表。java允许在运行时确定数组的大小。但是一旦指定了大小,就不方便改动了。所以可以使用ArrayList 类。ArrayList是一个采用类型参数和泛型类。

24.数组的使用问题。int b = new int[3];
   int a = new int[5];
   意思b 是int[3]在内存中的一个引用,a是int[5]在内存的一个引用。
   b = a后 a 和 b指向同一块内存。b的改变也会影响a的改变。

25.ArrayList的常用方法。 ArrayList<T>(),声明 ArrayList<T>(int initialCapacity) 用制定的容量构造一个空数组列表。 boolean add(T obj) 在数组末尾添加一个元素。int size()返回当前大小。void
ensureCapacity(int capacity) 确定大小。void trimToSize(),削减到当前大小

26.可以调用forName方法获得类名对应的class对象!Class.forname("classname");

27.可以使用newInstance生成一个实例。

你可能感兴趣的:(java基础)