Java回顾1【笔记】

1. 引用数据类型传递地址/基本数据类型传递值

   Java就是值传递,只不过值可能是值或是地址罢了。
   基本数据类型例如 int a = 1;
   是栈中存储了1
   引用数据类型例如 String b = new String("2");
   是栈中存储了一个地址,地址指向了堆中的2,堆中也是指向常量池

2. 方法的重载与重写

	3. this()或this(形参)

	4. 继承的特点,子类构造器中必须要调用父类构造器,默认会自动调用无参

	5. super()或super(形参)。和this一样若写在构造器中必须写在首行

6. 多态 向上转型Father f = new Son(); 和父类没差,差别就是若某个方法被子类重写了,会用子类的
	向下转型(Son)f; 实则就是一个子类,子类本就可以调用父类的方法。

	7. final 太监类;方法无法被重写;变常量

	8. native方法,无方法体,实则是调用了C/C++编译为dll让Java执行,可以被重写

9. static 中不允许出现this,super。顿悟!this和super其实就代表着对象名。而static不能用非静态的属性与方法。

   为什么不能使用非静态的呢?粗糙理解:静态的先被加载,此时对象还没被加载,所以你在静态方法
   中调用未被加载的东西就会报错。或者你在静态方法中创建对象才能使用。

   静态变量(类变量) 被所有对象共享,存储在!!!方法区!!!





10. 实例初始化过程,创建对象时触发:成员变量显式赋值;执行非静态代码块(前者按顺序执行);构造器最后执行
    实则构造方法就是实例初始化方法,调用实例初始化方法时就会执行实例初始化过程,几个构造方法就有几个实例初始化方法

11. 类初始化过程,第一次使用这个类前执行:静态变量的显示赋值;执行静态代码块(顺序执行)
    执行顺序:父类 类初始化--子类 类初始化--父类 实例初始化--子类 实例初始化

运行时数据区:
方法区			虚拟机栈		本地方法栈
(静态变量)		(局部变量)    (native方法)

堆			程序计数器
(成员变量)


	12. 抽象类,其目的就是为了不能被创建对象。可以有抽象方法和非抽象方法。若有子类,子类必须重写所有抽象方法
	    除非子类也为抽象类

13. 接口 public static final xxx 变量/public abstract xxx 方法名,前面的修饰都可以省略
         必须重写所有抽象方法,类可以实现多个接口,接口可以继承多个接口,先继承后实现
	 后新增:public static 方法名/public default 方法名

14. java.lang.Object 所有类默认import java.lang,几个方法:toString()/getClass()/finalize()/hashcode()/equals
    java.lang.Comparable:自然顺序 int compareTo(Object o)
    java.util.Comparator:定制顺序 int compare(Object o1, Object o2)

15. 数组API...

16. 浅克隆/深克隆 明白了明白了,so Easy

如何实现克隆?
	对象的类实现Cloneable接口
	重写Object类的clone()方法
	在clone()方法中调用super.clone();
	
	浅克隆在clone方法中写一句即可:return super.clone();
	深克隆,例子,Teacher中有Student属性,切,这不是很明显了么
	Teacher teacher = (Teacher)super.clone();
        teacher.setStudent((Student)teacher.getStudent().clone());
        return teacher;

两个克隆都会克隆基本数据类型,区别就在于引用数据类型
所以从上面的深克隆例子可以看出,深克隆的Student会再创建一个新的对象,而浅克隆是共用一个对象

为什么要用克隆呢?我自己再写一个类不行吗?
克隆是native()方法,更底层!更快!

数据类型传递题目:

(1)形参是基本数据类型时,实参给形参传递数据值,是将值传递给了形参,也就是对形参赋值
(2)形参是引用数据类型时,实参给形参传递地址值,是将地址的值传递给了形参,此时的形参也就指向了那个地址
(3)String呢?String传递的也是地址值,当形参被其他String赋值后,里面的这个地址变换了,但是并不影响外面的!

我一直卡在为什么不会影响外面的实参呢?其实实参传递给形参的那一刻,他们俩之间就是没关系的!他们只是做了一次传递而已。
但是为什么传递对象就可以呢?因为他们是指着同一个对象!String的话地址被更改了!

示例代码:

class Test{
    public static void swap(int a, int b){
        int temp = a;
        a = b;
        b = temp;
	}

	public static void main(String[] args){
        int x = 1;
        int y = 2;
        swap(x,y);//调用完之后,x与y的值不变
    }
}

示例代码:

class Test{
    public static void change(MyData my){
        my.num *= 2;
    }
    
    public static void main(String[] args){
        MyData m = new MyData();
        m.num = 1;
        
        change(m);//调用完之后,m对象的num属性值就变为2
    }
}

class MyData{
    int num;
}

陷阱1:

/*
陷阱1:在方法中,形参 = 新new对象,那么就和实参无关了
*/
class Test{
    public static void change(MyData my){
        my = new MyData();//形参指向了新对象
        my.num *= 2;
    }
    
    public static void main(String[] args){
        MyData m = new MyData();
        m.num = 1;
        
        change(m);//调用完之后,m对象的num属性值仍然为1
    }
}

class MyData{
    int num;
}

陷阱2:见字符串和包装类部分
posted @ 2021-04-13 09:23  lwxx  阅读(53)  评论(0)    收藏  举报