继承extends

继承extends

笔记

1、继承extends

1.1、测试:子类继承父类之后,能使用子类对象调用父类方法吗?
	可以,因为子类继承了父类之后,这个方法就属于子类了。
	当然可以使用子类对象来调用。

1.2、在实际开发中,满足什么条件的时候,我可以使用继承呢?
	凡是采用“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,是有违伦理的。

1.3、任何一个类,没有显示继承任何类,默认继承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类当中有很多方法,大部分看不懂,其中有一个叫做toString()
	的,我们进行了测试,发现:
		System.out.println(引用);
		当直接输出一个“引用”的时候,println()方法会先自动调用“引用.toString()”,然后
		输出toString()方法的执行结果。

Extends01


// 分析以下程序存在什么问题?代码臃肿。代码没有得到重复利用。
public class ExtendsTest01{
	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{
	// 属性
	private String actno;
	private double balance;
	private double credit;

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

	// 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;
	}

	public void setCredit(double credit){
		this.credit = credit;
	}
	public double getCredit(){
		return credit;
	}
	
}

ExtendsTest02

// 使用继承机制来解决代码复用问题。
// 继承也是存在缺点的:耦合度高,父类修改,子类受牵连。
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;
	}
	
}

ExtendsTest03

class A
{
}

class B
{
}

class C extends A
{
}

class D extends B
{
}

// 语法错误
// java只允许单继承。不允许多继承。java是简单的。C++支持多重继承。
// C++更接近现实一些。因为在现实世界中儿子同时继承父母两方特征。
/*
class E extends A, B
{
}
*/

class X
{
}

class Y extends X
{
}

class M extends X
{
}

// 其实这也说明了Z是继承X和Y的。
// 这样描述:Z直接继承了Y,Z间接继承了X
class Z extends Y
{
}

/*

	Z继承了Y
	Y继承了X
	X继承了Object

	Z对象具有Object对象的特征(基因)。

	Object是所有类的超类。老祖宗。类体系结构中的根。
	java这么庞大的一个继承结构,最顶点是:Object
*/

ExtendsTest04

/*
测试:子类继承父类之后,能使用子类对象调用父类方法吗
	实际上以上的这个问题问的有点蹊跷!!!!!
	哪里蹊跷?“能使用子类对象调用父类方法”
	本质上,子类继承父类之后,是将父类继承过来的方法归为自己所有。
	实际上调用的也不是父类的方法,是他子类自己的方法(因为已经继承过来了
	就属于自己的。)。
		
*/
public class ExtendsTest04{
	public static void main(String[] args){
		// 创建子类对象
		Cat c = new Cat();
		// 调用方法
		c.move();
		// 通过子类对象访问name可以吗?
		System.out.println(c.name);
	}
}

// 父类
//class Animal extends Object {
class Animal{
	// 名字(先不封装)
	String name = "XiaoHua"; //默认值不是null,给一个XiaoHua

	// 提供一个动物移动的方法
	public void move(){
		System.out.println(name + "正在移动!");
	}
}

// Cat子类
// Cat继承Animal,会将Animal中所有的全部继承过来。
class Cat extends Animal{
}

ExtendsTest05

//默认继承Object,Object类中有哪些方法呢?
/*
public class Object {
	 
	 // 注意:当源码当中一个方法以“;”结尾,并且修饰符列表中有“native”关键字
	 // 表示底层调用C++写的dll程序(dll动态链接库文件)
    private static native void registerNatives();

	 // 静态代码块
    static {
		  // 调用registerNatives()方法。
        registerNatives();
    }

	 // 无参数构造方法
    @HotSpotIntrinsicCandidate
    public Object() {}

	 // 底层也是调用C++
    @HotSpotIntrinsicCandidate
    public final native Class<?> getClass();

	 // 底层也是调用C++
    @HotSpotIntrinsicCandidate
    public native int hashCode();

	 // equals方法你应该能看懂。
	 // public是公开的
	 // boolean 是方法的返回值类型
	 // equals 是一个方法名:相等
	 // (Object obj) 形参
	 // 只不过目前还不知道这个方法存在的意义。
    public boolean equals(Object obj) {
		 //方法体
       return (this == obj);
    }
    
	 // 已有对象a,想创建一个和a一模一样的对象,你可以调用这个克隆方法。
	 // 底层也是调用C++
    @HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;

	 // 一会我们可以测试一下toString()方法。
	 // public表示公共的
	 // String 是返回值类型,toString()方法执行结束之后返回一个字符串。
	 // toString 这是方法名。
	 // () 表示形参个数为0
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    @HotSpotIntrinsicCandidate
    public final native void notify();

    @HotSpotIntrinsicCandidate
    public final native void notifyAll();

    public final void wait() throws InterruptedException {
        wait(0L);
    }

    public final native void wait(long timeoutMillis) throws InterruptedException;

    public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {
            timeoutMillis++;
        }

        wait(timeoutMillis);
    }
    @Deprecated(since="9")
    protected void finalize() throws Throwable { }
}
*/
public class ExtendsTest05 {

	// ExtendsTest05默认继承Object
	// ExtendsTest05类当中是有toString()方法
	// 不过toString()方法是一个实例方法,需要创建对象才能调用。
	/*
	public String toString() {
		return getClass().getName() + "@" + Integer.toHexString(hashCode());
	}
	*/
	
	public static void main(String[] args){

		// 分析这个代码可以执行吗?
		//ExtendsTest05.toString();

		// 先new对象
		ExtendsTest05 et = new ExtendsTest05();
		String retValue = et.toString();

		// 2f92e0f4 可以“等同”看做对象在堆内存当中的内存地址。
		// 实际上是内存地址经过“哈希算法”得出的十六进制结果。
		System.out.println(retValue); // ExtendsTest05@2f92e0f4

		// 创建对象
		Product pro = new Product();

		String retValue2 = pro.toString();
		System.out.println(retValue2); // Product@5305068a

		// 以上两行代码能否合并为一行!!!可以
		System.out.println(pro.toString()); //Product@5305068a

		// 如果直接输出“引用”呢???????
		System.out.println(pro); //Product@5305068a

		System.out.println(100);
		System.out.println(true);
		// Product@5305068a
		System.out.println(pro); // println方法会自动调用pro的toString()方法。
	}
}

class Product{
	/*
	public String toString() {
		return getClass().getName() + "@" + Integer.toHexString(hashCode());
	}
	*/
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值