JavaSE 基础 - 第12章 继承

1、什么是继承,有什么用?

   继承:在现实世界当中也是存在的,例如:父亲很有钱,儿子不用努力也很有钱。
   继承的作用
      基本作用:子类继承父类,代码可以得到复用。(这个不是重要的作用,是基本作用。)
      主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制

2、继承的相关特性(背)

1、B类继承A类,则称A类为超类(superclass)、父类、基类,
   B类则称为子类(subclass)、派生类、扩展类。
	class A{}
	class B extends A{}
	我们平时聊天说的比较多的是:父类和子类。
	superclass 父类
	subclass 子类

2、java 中的继承只支持单继承,不支持多继承,C++中支持多继承,
   这也是 java 体现简单性的一点,换句话说,java 中不允许这样写代码:
	class B extends A,C{ } 这是错误的。

3、虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,
   例如:class C extends B,class B extends A,也就是说,C 直接继承 B,
   其实 C 还间接继承 A。

4、java 中规定,子类继承父类,除 构造方法 不能继承之外,剩下都可以继承。
   但是私有的属性无法在子类中直接访问。(父类中private修饰的不能在子类中直接访问。
   可以通过间接的手段来访问。)

5、java 中的类没有显示的继承任何类,则默认继承 Object类,
   Object类是java 语言提供的根类(老祖宗类),
   也就是说,一个对象与生俱来就有 Object类型中所有的特征。

6、继承也存在一些缺点,例如:CreditAccount 类继承 Account 类会导致它们之间
   的耦合度非常高,Account 类发生改变之后会马上影响到 CreditAccount 类

【实例:】

// 使用继承机制来解决代码复用问题。
// 继承也是存在缺点的:耦合度高,父类修改,子类受牵连。
public class ExtendsTest02{
	public static void main(String[] args){
		// 创建普通账户
		Account act = new Account();
		act.setActno("1111111");
		act.setBalance(10000);
		System.out.println(act.getActno() + ",余额" + act.getBalance());

		// 创建信用账户
		CreditAccount ca = new CreditAccount();
		ca.setActno("2222222");
		ca.setBalance(-10000);
		ca.setCredit(0.99);
		System.out.println(ca.getActno() + ",余额" + ca.getBalance() + ",信誉度" + ca.getCredit());
	}
}

// 银行账户类
// 账户的属性:账号、余额
class Account{ // 父类
	// 属性
	private String actno;
	private double balance;

	// 构造方法
	public Account(){
	
	}
	public Account(String actno, double balance){
		this.actno = actno;
		this.balance = balance;
	}

	// setter and getter
	public void setActno(String actno){
		this.actno = actno;
	}
	public String getActno(){
		return actno;
	}
	public void setBalance(double balance){
		this.balance = balance;
	}
	public double getBalance(){
		return balance;
	}
}

// 其它类型的账户:信用卡账户
// 账号、余额、信誉度
class CreditAccount extends Account{ //子类

	// 属性
	private double credit;

	// 构造方法
	public CreditAccount(){
	
	}

	public void doSome(){
		//错误: actno 在 Account 中是 private 访问控制
		//System.out.println(actno);
		// 间接访问
		//System.out.println(this.getActno());
		System.out.println(getActno());
	}

	// setter and getter方法
	public void setCredit(double credit){
		this.credit = credit;
	}
	public double getCredit(){
		return credit;
	}
	
}

3、测试:子类继承父类之后,能使用子类对象调用父类方法吗?

   可以,因为子类继承了父类之后,这个方法就属于子类本身了。
   当然可以使用子类对象来调用。

4、在实际开发中,满足什么条件的时候,我可以使用继承呢?

   凡是采用“is a”能描述的,都可以继承。
   例如:
      Cat is a Animal:猫是一个动物
      Dog is a Animal:狗是一个动物
      CreditAccount is a Account:信用卡账户是一个银行账户
         …

假设以后的开发中有一个A类,有一个B类,A类和B类确实也有重复的代码,那么他们两个之间就可以继承吗?
   不一定,还是要看一看它们之间是否能够使用is a来描述。

	class Customer{
		String name; // 名字
		// setter and getter
	}

	class Product{
		String name; // 名字
		// setter and getter
	}

	class Product extends Customer{
	
	}

	以上的继承就属于很失败的。因为:Product is a Customer,是有违伦理的。

5、Object类当中有哪些方法呢?

   任何一个类,没有显示继承任何类,默认继承Object,那么Object类当中有哪些方法呢?老祖宗为我们提供了哪些方法?

以后慢慢的大家一定要适应看JDK的源代码(多看看牛人写的程序自己才会变成牛人。)
先模仿后超越。
java为什么比较好学呢?
	是因为Java内置了一套庞大的类库,程序员不需要从0开始写代码,程序员可以
	基于这套庞大的类库进行“二次”开发。
	(开发速度较快,因为JDK内置的这套库实现了很多基础的功能。)

	例如:String是SUN编写的字符串类、System是SUN编写的系统类。
	这些类都可以拿来直接使用。

JDK源代码在什么位置?
	C:\Program Files\Java\jdk-13.0.2\lib\src.zip
	(可以解压到当前文件夹便于查找观看)

你现在能看懂以下代码了吗?
	System.out.println("Hello World!");
	System.out 中,out后面没有小括号,说明out是变量名。
	另外System是一个类名,直接使用类名System.out,说明out是一个静态变量。
	System.out 返回一个对象,然后采用“对象.”的方式访问println()方法。


我们研究了一下Object类(C:\Program Files\Java\jdk-13.0.2\lib\src\java.base\java\lang\Object.java)
当中有很多方法,大部分看不懂,其中有一个叫做toString()的,
	     
	     //没有static,实例方法,要先new对象,再使用“引用.”方式调用
	    public String toString() {   
		return getClass().getName() + "@" + Integer.toHexString(hashCode());
	    }

我们进行了测试,发现:
	System.out.println(引用);
	当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后
	输出toString()方法的执行结果。

	【例1】
	// 先new对象
	ExtendsTest05 et = new ExtendsTest05();
	String retValue = et.toString();

	// 2f92e0f4 可以“等同”看做对象在堆内存当中的内存地址。
	// 实际上是内存地址经过“哈希算法”得出的十六进制结果。
	System.out.println(retValue); // ExtendsTest05@2f92e0f4
	
	【例2】
	// 创建对象
	Product pro = new Product();
	// 如果直接输出“引用”呢???????
	System.out.println(pro); //Product@5305068a   ,println方法会自动调用pro的toString()方法。

传送门

上一章:JavaSE 基础 - 第十一章 this和static
下一章:JavaSE 基础 - 第十三章 方法覆盖和多态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值