【Java常见问题】(一)基础知识篇

122 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情 这也是第9篇文章。

Java初始化的顺序

有以下原则:(序号越小优先级越高)

  1. static>non-static
  2. 父类>子类
  3. 按成员变量定义的顺序
  4. 对于同一个成员,在域中初始化和块中初始化平级,即按照从上到下的顺序,以最后一次初始化为最终的值。
public class test{
    static {a=2;}
    static int a=1;
    static int b=3;
    static {b=4;}
    public static void main(String[] args) {
    System.out.print(a+" ");
    System.out.print(b);
}
}

以上输出的结果为:1 4

关于构造方法的一些注意事项

  • 构造方法必须与类名相同

Q:那类中的普通方法也能用这个名字吗?

A:可以的

  • 构造方法不能被继承,也不能被override,但是可以被overload(即使用不同参数个数或参数类型来定义多个构造方法)
  • 若没有定义构造方法,编译器会默认生成一个无参数的,且其修饰符与类的修饰符保持一致。

关于父类和子类的关系问题:

  • 子类可以通过super()来显式调用父类的构造方法。当父类没有提供无参数的构造方法时,子类的构造方法必须显式地调用父类的构造方法(反之,如果父类提供了,子类就不用显示说明)

Java中的对象与引用

Java没有指针的 概念 ,但并不代表指针就完全不存在了。比如new返回的都是一个指针的引用。

  • Java在处理基本数据类型时

回顾:基本数据类型有哪些?

byte short int long float double char boolean 采取的是按值传递(输入参数的拷贝),而对其他类型都是按引用传递

  • 对象函数调用和用**“=” 赋值时也是用的引用传递**

Java中的clone妙用

  • 目标:从对象A中创建一个具有相同状态的B,且后续对B的修改不再影响A
  • 方案:使用clone
  • 原理:返回一个Object对象的拷贝,函数返回的是一个新的对象而不是一个引用。
  • 使用步骤:
    • 继承Cloneable接口
    • 重写clone()方法,在其中调用super.clone()
    • 把浅拷贝的引用指向原型对象新的克隆体
  • 示例代码如下:
public class test{

    public static void main(String[] args) {
    Obj a=new Obj();
    Obj b=(Obj)a.clone();
    b.changeInt();
    System.out.println("a:"+a.getInt());
    System.out.println("b:"+b.getInt());
}
}

class Obj implements Cloneable{
    private int i=0;
    public int getInt(){
        return i;
    }

    public void setInt(int num){
        i=num;
    }

    public void changeInt(){
        this.i=1;
    }

    public Object clone(){
        Object o=null;
        try{
            o=(Obj)super.clone();
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
        return o;
    }
}

打印结果:

a:0

b:1