Thinking in Java第七章复用类查漏

(组合:就是我们最常用的方式,在别的类中实例化就是组合。。。)

1.继承

  1. 子类我们称为导出类,父类我们一般称为基类
  2. 基类也是需要初始化的哟~当我们此时有一个导出类和他的基类,而他的基类再往上又有他自己的基类。。等等。。此时编译器会从导出类向外散发,直到他的祖先,,,=_=,从他的祖先开始调用构造器为基类开始初始化,直到导出类调用自己的构造器完毕。(构造器是必须要调用的,初始化嘛)
  3. ②中讲的是基类中含有的是默认构造器,也就是无参构造器,此时编译器可以自行调用,,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关键字

  1. final可以修饰数据,方法,类
  • 数据
    • 当用static修饰则强调只有一份,随着类的加载而产生,每个对象共享这么一份。。(之前的知识,不再提。)
    • 当用final修饰非基本类型时,也就是一个对象的引用,此时的 “不变” 是指该引用只能指向该对象,但是该对象本身是可以改变的。其实数组也是另一种类型的引用。像下面这样:
    • final也可以用来修饰方法的参数。当参数是一个对象引用时,根据我们之前所说的,该引用不可变,只能指向一个对象。当参数是一个基本类型时,只能读取该参数,例如 return i+1;等等,但是不能对其进行任何值方面的改变,例return i++;
  • 方法
    • 将方法用final修饰代表该方法不能被继承。。。。(讲道理,,就看懂了这一句话。。em。。)
    • 覆盖只有当某个方法是基类当中的接口的一部分时才会起作用。解释一下这句话:当基类中的某个方法用private 修饰时,当然这个方法就不会被导出类所继承了,(private 隐式包含final,所以没有必要两个都写。)因此该方法就不是基类接口当中的一部分,他完美的隐藏在了基类当中。此时我们如果在导出类中创建了一个public,protected或者包访问权限的一个方法时,并没有覆盖基类中的方法,此时导出类只是创建了一个具有相同方法名的新方法而已。

  • 。。。Over
  1. 关于final的忠告:原谅我一个字也没看懂

6.初始化与类的加载

  • 每个类的编译代码( 具体是啥俺也不知道。。 )存在于他自己独立的文件(class文件)中。这个文件只有在需要使用程序代码时才会被加载,通常指加载发生在创建类的第一个对象时,但是当我们访问static方法时,也会发生加载。加载过程中static代码块都会进行初始化。。

7.继承与初始化

过程:

  • 首先是程序先进行加载,加载器(这是啥 )找到程序的编译代码。在加载的过程中发现该类还继承了XX类,于是又开始加载XX类。(不管你是否想要生成该对象,这都要发生
  • 若该基类还有基类XXX,那么第二个基类就会被加载,以此类推。参考6,当加载过程中就会进行static的初始化,仍然是根基类先被初始化,依次到最终的导出类。
  • 此时我们就可以创建导出类的对象了。创建后,(复习)先执行根基类的构造器,最后到导出类的构造器。然后才是实例变量的初始化(按照在类中的定义顺序)。
    Over在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值