类的关系----继承+重写和重载的区别+Object类中的方法+this和super的使用

设计类关系需要遵循:高内聚低耦合
耦合度:紧密 继承(实现)>包含>依赖

类与类之间有三种关系

  1. A is-a B 泛化(继承 实现)
  2. A has-a B 包含(组合 聚合 关联)
  3. A use-a B 依赖 (依赖)need-a

is-a 继承

在这里插入图片描述

1、子类继承父类,用关键字extends,可以调用父类中的(public protected)属性和方法当做自己的来使用

eg:

Animal .java

public class Animal {
    public String name;
    public void eat(){
        System.out.println("动物的吃饭方法");
    }

    public void sleep( ) {
        System.out.println("动物的睡觉方法");
    }
}

Person .java

public class Person extends Animal{}

Test.java

public class Test {
    public static void main(String[] args){
        //调用Person方法
        Person p = new Person();
        //通过p调用Person中的属性、方法
        p.name = "优秀";
        p.eat();//动物的吃饭方法
        p.sleep();//动物的睡觉方法
    }
}

2、子类可以添加自己独有的属性或方法

eg:

Animal .java

public class Animal {
    public String name;
    public void eat(){
        System.out.println("动物的吃饭方法");
    }

    public void sleep( ) {
        System.out.println("动物的睡觉方法");
    }
}

Person .java

public class Person extends Animal{
	//添加一些独有的属性或者方法
	public void study(){
		System.out.println("人类的学习方法");
	}
}

Test.java

public class Test {
    public static void main(String[] args){
        //调用Person方法
        Person p = new Person();
        //通过p调用Person中的属性、方法
        p.name = "优秀";
        p.eat();//动物的吃饭方法
        p.sleep();//动物的睡觉方法
        p.study();//人类的学习方法
    }
}
3、父类继承过来的方法不能满足子类要求,可以在子类重写override(覆盖)父类方法

eg:

Animal .java

public class Animal {
    public String name;
    public void eat(){
        System.out.println("动物的吃饭方法");
    }

    public void sleep( ) {
        System.out.println("动物的睡觉方法");
    }
}

Person .java

public class Person extends Animal{
	//添加一些独有的属性或者方法
	public void study(){
		System.out.println("人类的学习方法");
	}
	//重写(override)Animal中eat()方法
	public void eat(){
        System.out.println("人类的吃饭方法");
    }
}

Test.java

public class Test {
    public static void main(String[] args){
        //调用Person方法
        Person p = new Person();
        //通过p调用Person中的属性、方法
        p.name = "优秀";
        p.eat();//人类的吃饭方法
        p.sleep();//动物的睡觉方法
        p.study();//人类的学习方法
    }
}
4、如果不使用extends,每一个类都默认继承Object类(可以理解为Object是任何一个引用类型的父类);如果使用extends继承后面的父类
5、继承是单个存在的(单继承),每一个类只能有一个继承类,目的是让类变得更安全;可以通过传递的方式实现多继承的效果

重写和重载的区别

方法重写override方法重载overload
产生两个继承关系的类,子类重写父类方法一个类中的一组方法
权限修饰符(public>protected>默认不写>private)子类可以大于等于父类没有要求
特征修饰符父类是final(子类不能重写)、static(不存在重写)、abstract(必须重写,否则子类是抽象类)没有要求
返回值类型子类可以小于等于父类没有要求
方法名字子类名字与父类一致每一个方法名一致
参数列表子类必须与父类一致每一个方法参数必须不一致(类型、个数、顺序)
抛出异常父类抛出编译时异常,子类抛出异常个数少于等于父类,子类抛出异常类型小于等于父类没有要求
方法体子类方法内容与父类不一致每一个重载方法执行过程不一致

Object类中的方法

hashCode()

把对象内存中的地址经过计算得到一个int整数
源码:public native int hashCode();

equals()

用来比较两个对象的内容,Object默认效果是==
"=="可以比较基本数据类型(值),也可以比较引用数据类型(地址)
equals()方法默认比较地址,如果想要改变规则,需要进行重写
源码:public boolean equals(Object obj){return (this == obj) }

toString()

打印输出时将对象变成String字符串
源码:public String toString(){ return getClass().getName()+"@"+Integer.toHexString(hashCode());}

getClass()

获取对象对应类的类映射(反射机制):加载到方法区中的类模板

wait()

线程进入等待状态,存在重载

notify()

线程唤醒

notifyAll()

全部唤醒

finalize()

权限修饰符是protected,对象被GC回收时,默认执行
源码:protected void finalize(){}

clone()

权限修饰符是protected,克隆对象

this和super的使用

在这里插入图片描述
都指代对象

  1. this指代当前执行方法时的对象,不一定是当前类的对象,有可能是当前类父类的对象
  2. super指代执行当前方法时对象的父类对象

都能调用一般属性、方法

  1. 可以放在类成员的任意位置
  2. 调用一般方法时可以来回互相调用(写法 编译好用) 执行时可能产生问题(StackOverflowError)

可以调用构造方法(放在第一行)

  1. 构造方法之间不能来回调用(编译不好用)
  2. this和super在构造方法中调用另一个类的构造方法不能同时出现在第一行,如果不写,默认第一行是super
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值