Java 读书笔记7 复用类

## # 1.关于super的怨念

1. 其实之前一直觉得super很神奇,不会用,今天终于明白了,其实他就是回去调用父类的相关函数了,
2. super 和this 都是用来对构造函数而言,因为构造函数在构造函数无法直接调用;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Drawing (int i )
{
super(i);
}
Drawing()
{
//super(5); //调用父类
//this(1); //调用子类其他
Drawing(5); //这样写是不对的,不能这么调用
}
//对于普通重载函数
void test(String a)
{
}
void test(int a)
{
test("aaa"); //可以直接调用
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Animal {
protected void test(String a)
{
System.out.println(a);
}
}
public class Mouse extends Animal {
@Override
protected void test(String a) {
super.test(a); //只要符合规范,其实是随便调用的;
super.test("a");
super.test("b");
}
}

## # 2.老生常谈的继承构造方法顺序;

1. 首先是雷打不动的父类先构造,其实相当于父类可以先给一遍值,子类再自己改;
2. 然后,比较新鲜的是,对象先创建,然后才是赋值;
3. 突然发现了父类如果是带参数的构造函数,那么子类必须存在带参构造函数,并且要有super,这也是我一直无法理解的地方了; 

//this也可以,不过只能用一个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Art {
Art (int i)
{
System.out.println("Art Constructior");
}
}
public class Drawing extends Art {
Drawing (int i) //如果没有这个构造函数,就会报错
{
super(i); //这里的super是必须的
System.out.println("Drawing Constructor");
}
}
public class Cartoon extends Drawing {
Main main = new Main();
Cartoon(int i) {
super(i);
}
public static void main(String arg[])
{
Cartoon x = new Cartoon(1);
}
}

## # 3.关于代理

1. 这似乎是个新概念,也可能java课上略过了,我忽然发现这就是委托而已。。。;

简书上关于代理的内容

## # 4.关于重载和重写

1. 重载呢,简单地说,就是子类啊,父类啊,有一群类似的方法,子类可以调用父类的,反过来不行,但是重写就不一样了,因为他们名字完全相同,子类只能使用自己的,父类也只能使用自己的;
2. 相对的,我们大概也可以稍微把构造函数当成重写,不过只要父类构造函数带有参数,下面的构造函数不论带不带有参数,必须有super()方法;这样强制super可能是为了一定要调用父类方法;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Art {
Art (int i)
{
System.out.println("Art Constructior");
}
}
public class Drawing extends Art {
Drawing (String i)
{
super(5); //必须有super()
// super(i);
System.out.println("Drawing Constructor");
}
Drawing (int i )
{
super(i);
}
Drawing()
{
super(5); //不写就报错
}
}

## # 5关于final

1. 对于对象来说,final只是表示引用恒定不变(数组属于对象);然而对象本身可以变化;
2. static +final 相当于最一般的C常量 通常大写 比如 VALUE_TEST = 1;
3. 作用嘛,大概就是防止改变之类的
4. final参数,这类参数,在函数中无法修改
5. final方法,防止修改;
6. final类,无法继承;

## # 初始化与类加载

1. .class文件在程序调用时才会加载,一般而言,就是构造函数,构造函数前面可以看成带有static关键字;
2. 程序运行时,首先是main方法所在的类,如果存在继承,就向上加载,一直加载到最顶层的积累,接着创建对象,然后从父类到子类,依次初始化对象