Java基础(继承、super、方法重写、final)

继承

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。

继承格式
通过extends关键字可以实现类与类的继承

class 类名 extends 父类名{
类体;
}	

单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类

案例:
public class MyTest {
    public static void main(String[] args) {
        Student student = new Student();
        student.name = "刘德华";
        student.age = "50";
        //  System.out.println(student.num);
        System.out.println(student.name);
        System.out.println(student.age);
        student.eat();
        student.sleep();
        student.talkLove();
        //  student.test();

        System.out.println("-----------------------");

        Teacher teacher = new Teacher();
        teacher.name = "老师";
        teacher.age = "20";
        System.out.println(teacher.name);
        System.out.println(teacher.age);
        //System.out.println(teacher.num);
        teacher.sleep();
        teacher.eat();
        teacher.teach();
        // teacher.test();

        //继承的注意的注意事项
        //1.Java 中只支持单继承 支持多层继承
        //2.子类只能继承父类中非私有的成员
        //3.构造方法不参与继承
        //4.不要为了部分功能而去继承

    }


}

class Grandfather {

    private int num = 200;

    private void test() {
        System.out.println("test方法");
    }
}

class Person extends Grandfather {

    String name;
    String age;

    public void eat() {
        System.out.println("吃饭");
    }

    public void sleep() {
        System.out.println("睡觉");
    }
}

class Student extends Person {

    public void talkLove() {
        System.out.println("谈恋爱");
    }

}

class Teacher extends Person {

    //教书
    public void teach() {
        System.out.println("教书");
    }

}

当然继承既有好处又有缺点
好处有:

a:提高了代码的复用性
b:提高了代码的维护性
c:让类与类之间产生了关系,是多态的前提

缺点有:

类的耦合性增强了。

而我们开发的原则是高内聚,低耦合。

Java中类的继承特点

① B类继承 A类,则称 A类为超类(superclass)、父类、基类, B类则称为子类(subclass)、派生类、扩展类。
② java 中的继承只支持单继承,不支持多继承, C++中支持多继承,这也是 java 体现简单性的一点,换句话说, java 中不允许这样写代码: class B extends A,C{ }。
③ 虽然 java 中不支持多继承,但有的时候会产生间接继承的效果,例如: class Cextends B, class B extends A,也就是说, C 直接继承 B,其实 C 还间接继承 A。
④ java 中规定,子类继承父类,除构造方法和被 private 修饰的数据不能继承外,剩下都可以继承。
⑤ java 中的类没有显示的继承任何类,则默认继承 Object 类, Object 类是 java 语言提供的根类(老祖宗类),也就是说,一个对象与生俱来就有 Object 类型中所有的特征。
⑥ 继承也存在一些缺点,例如: CreditAccount 类继承 Account 类会导致它们之间的耦合度非常高, Account 类发生改变之后会马上影响到 CreditAccount 类。

什么时候使用继承

采用假设法。 如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,
即 A is a B 或B is a A
就可以考虑使用继承。

继承中成员变量的关系

A:子类中的成员变量和父类中的成员变量名称不一样
B:子类中的成员变量和父类中的成员变量名称一样
在子类中访问一个变量的查找顺序(“就近原则”)
a: 在子类的方法的局部范围找,有就使用
b: 在子类的成员范围找,有就使用
c: 在父类的成员范围找,有就使用
d:如果还找不到,就报错

super关键字

super 概述

super 和 this 对比
① this

  • this 是一个引用,保存内存地址指向自己。
  • this 出现在实例方法中,谁调用这个实例方法, this 就代表谁, this 代表当前正在执行这个动作的对象。
  • this 不能出现在静态方法中。
  • this 大部分情况下可以省略,在方法中区分实例变量和局部变量的时候不能省略。
  • “this(实际参数列表)”出现在构造方法第一行,通过当前的构造方法去调用本类当中其它的构造方法。

② super

  • 严格来说, super 其实并不是一个引用,它只是一个关键字, super 代表了当前对象中从父类继承过来的那部分特征。 this 指向一个独立的对象, super 并不是指向某个“独立”的对象,super 其实是 this 的一部分。
  • super 和 this 都可以使用在实例方法当中。
  • super 不能使用在静态方法当中,因为 super 代表了当前对象上的父类型特征,静态方法中没有 this,肯定也是不能使用 super 的。
  • super 也有这种用法:“super(实际参数列表);”,这种用法是通过当前的构造方法调用父类的构造方法。

继承中构造方法的关系

每一个构造方法的第一条语句默认都是:super()
在这里简单的提一句,Object类。否则有人就会针对父类的构造方法有疑问。Object没有父类。

继承中构造方法的注意事项

super(…)或者this(….)必须出现在第一条语句上

继承中成员方法关系

a:当子类的方法名和父类的方法名不一样的时候直接使用
b:当子类的方法名和父类的方法名一样的时候
	通过子类调用方法:
		a: 先查找子类中有没有该方法,如果有就使用
		b:在看父类中有没有该方法,有就使用
		c: 如果没有就报错

方法重写概述及其应用

A:什么是方法重写
	子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回
	值类型),也被称为方法覆盖,方法复写。
B: Override和Overload的区别?Overload能改变返回值类型吗?
在同一个类当中,方法名相同,参数列表不同(类型、个数、顺序),即
构成方法重载。
C:方法重写的应用:
	只有当从父类中继承过来的方法无法满足当前子类业务需求的时候,需要将父类中继承过来的方法进行覆盖。
	这样,即沿袭了父类的功能,又定义了子类特有的内容。

方法覆盖的条件及注意事项
那么,当程序具备哪些条件的时候,就能构成方法覆盖呢?
① 方法覆盖发生在具有继承关系的父子类之间,这是首要条件;
② 覆盖之后的方法与原方法具有相同的返回值类型、相同的方法名、相同的形式参
数列表;
另外,在使用方法覆盖的时候,需要有哪些注意事项呢?
① 由于覆盖之后的方法与原方法一模一样,建议在开发的时候采用复制粘贴的方式,不建议手写,因为手写的时候非常容易出错,比如在 Object 类当中有 toString()方法,该方法中的 S 是大写的,在手写的时候很容易写成小写 tostring(),这个时候你会认为 toString()方法已经被覆盖了,但由于方法名不一致,导致最终没有覆盖,这样就尴尬了;
② 私有的方法不能被继承,所以不能被覆盖;
③ 构造方法不能被继承,所以也不能被覆盖;
④ 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高(学习了访问控制
权限修饰符之后你就明白了);
⑤ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少(学习了异常之
后就明白了);
⑥ 方法覆盖只是和方法有关,和属性无关;
⑦ 静态方法不存在覆盖(不是静态方法不能覆盖,是静态方法覆盖意义不大,学习
了多态机制之后就明白了);

final关键字概述

A:为什么会有final
由于继承中有一个方法重写的现象,而有时候我们不想让子类去重写父类的方法.这对这种情况java就给我们提供了一个关键字: final
B:final概述
final关键字是最终的意思,可以修饰类,变量,成员方法。

final关键字修饰类,方法以及变量的特点

A:final修饰特点
修饰类: 被修饰类不能被继承
修饰方法: 被修饰的方法不能被重写
修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值