(组合:就是我们最常用的方式,在别的类中实例化就是组合。。。)
1.继承
- 子类我们称为导出类,父类我们一般称为基类。
- 基类也是需要初始化的哟~当我们此时有一个导出类和他的基类,而他的基类再往上又有他自己的基类。。等等。。此时编译器会从导出类向外散发,直到他的祖先,,,=_=,从他的祖先开始调用构造器为基类开始初始化,直到导出类调用自己的构造器完毕。(构造器是必须要调用的,初始化嘛)
- ②中讲的是基类中含有的是默认构造器,也就是无参构造器,此时编译器可以自行调用,,But,当基类中的构造器是有参数的话,此时我们就需要为基类传参了。。当然是在子类的构造方法中用super传了。。之前有讲的。。
public class Flower{
Flower(String flowername){
System.out.println(flowername+"闻起来真香");
}
}
public class plant extends Flower{
plant(){
super("太阳花");
/*
必须是第一句!但是如果我们想调用其他的构造方法,需要用this,也必须放在第一句。。
虽然会冲突,,但不必担心,,,这种情况是不可能出现的哈哈。。。苏星河nb
*/
}
}
2.代理
em。总感觉没啥用,,无非就是将别人的方法封装到自己的类的方法中,用的时候直接用自己的就行。。
3.名称屏蔽
一句话:重载基类中的方法,并不会影响到基类的方法。。。基类的任何重载方法都是可用的。。。有点绕。。。
public class Homer{
void doh(){
System.out.println(",,,");
}
void doh(char c){
...
}
}
public class Milhouse{
void doh(String name){
...
}
//这个时候的基类的重载方法是可以正常工作的。
}
4.向上转型
概括成一句话就是:新类是现有类的一种类型。
举个栗子:
public class Instrument{
public static void play(Instrument i){
/*
这里也很有趣,我自己调用自己可还行
*/
...
}
}
public class Wind extends Instrument{
public static void main(String[] args){
Wind wind = new Wind();
Instrument.play(wind);
//可以观察到--在Instrument类中,play方法接受的参数是一个Instrument类型的引用,
//但是我们却可以传入一个他的导出类的引入,我们将这种引用转换称为向上转型。
//同时也印证了上边那句话。
}
}
5.final关键字
- final可以修饰数据,方法,类
- 数据
- 当用static修饰则强调只有一份,随着类的加载而产生,每个对象共享这么一份。。(之前的知识,不再提。)
- 当用final修饰非基本类型时,也就是一个对象的引用,此时的 “不变” 是指该引用只能指向该对象,但是该对象本身是可以改变的。其实数组也是另一种类型的引用。像下面这样:
- final也可以用来修饰方法的参数。当参数是一个对象引用时,根据我们之前所说的,该引用不可变,只能指向一个对象。当参数是一个基本类型时,只能读取该参数,例如
return i+1;
等等,但是不能对其进行任何值方面的改变,例return i++;
- 方法
- 将方法用final修饰代表该方法不能被继承。。。。(讲道理,,就看懂了这一句话。。em。。)
- 覆盖只有当某个方法是基类当中的接口的一部分时才会起作用。解释一下这句话:当基类中的某个方法用private 修饰时,当然这个方法就不会被导出类所继承了,(private 隐式包含final,所以没有必要两个都写。)因此该方法就不是基类接口当中的一部分,他完美的隐藏在了基类当中。此时我们如果在导出类中创建了一个public,protected或者包访问权限的一个方法时,并没有覆盖基类中的方法,此时导出类只是创建了一个具有相同方法名的新方法而已。
- 类
。。。Over
- 关于final的忠告:原谅我一个字也没看懂
6.初始化与类的加载
- 每个类的编译代码( 具体是啥俺也不知道。。 )存在于他自己独立的文件(class文件)中。这个文件只有在需要使用程序代码时才会被加载,通常指加载发生在创建类的第一个对象时,但是当我们访问static方法时,也会发生加载。加载过程中static代码块都会进行初始化。。
7.继承与初始化
过程:
- 首先是程序先进行加载,加载器(这是啥 )找到程序的编译代码。在加载的过程中发现该类还继承了XX类,于是又开始加载XX类。(不管你是否想要生成该对象,这都要发生)
- 若该基类还有基类XXX,那么第二个基类就会被加载,以此类推。参考6,当加载过程中就会进行static的初始化,仍然是根基类先被初始化,依次到最终的导出类。
- 此时我们就可以创建导出类的对象了。创建后,(复习)先执行根基类的构造器,最后到导出类的构造器。然后才是实例变量的初始化(按照在类中的定义顺序)。
Over