Java基础总复习笔记【二】:Java继承、多态、重写(Override)与重载(Overload)、抽象类、接口、封装

一、Java继承

详细总结见以下链接:
https://blog.csdn.net/qq_45605223/article/details/103089527
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

1.继承类型

在这里插入图片描述

2.继承的特性

(1)子类拥有父类非 private 的属性、方法。
(2)子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
(3)子类可以用自己的方式实现父类的方法。
(4)Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
(5)提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

3.继承关键字

(1)extends关键字

一个子类只能拥有一个父类,所以 extends 只能继承一个类

(2)super

super 表示使用它的类的父类。
super 可用于:
①super();调用父类的构造方法。(必须放在第一行)
②super.func(); 调用父类的方法。
③super.data; 调用父类的数据成员。
注意:
(1)super 语句必须是子类构造方法的第一条语句。
(2)不能在子类中使用父类构造方法名来调用父类构造方法。
(3)父类的构造方法不被子类继承。
(4)调用父类的构造方法的唯一途径是使用 super 关键字,如果子类中没显式调用,则编译器自动将 super(); 作为子类构造方法的第一条语句。这会形成一个构造方法链。
(5)静态方法中不能使用 super 关键字。
(6)如果是继承的方法,是没有必要使用 super 来调用,直接即可调用。但如果子类覆盖或重写了父类的方法,则只有使用 super 才能在子类中调用父类中的被重写的方法。

(3)this

this 关键字表示当前对象。
可用于:
①this(); 调用默认构造方法。
②this(参数); 调用带参构造方法。
③this.data;调用变量。
调用当前类的构造方法,并且必须是方法的第一条语句。

(4)final关键字

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。
实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final。

4.super和this的区别

thissuper
访问本类中的属性和方法由子类访问父类中的属性和方法
先查找本类,如果本类没有就调用父类不查找本类,直接调用父类
表示当前对象的引用子类帮助父类进行构造

二、Java 多态

详细总结见以下链接:
https://blog.csdn.net/qq_45605223/article/details/103100203

多态是同一个行为具有多个不同表现形式或形态的能力。

1.多态的优点

(1)消除类型之间的耦合关系
(2)可替换性
(3)可扩充性
(4)接口性
(5)灵活性
(6)简化性

2.多态存在的三个必要条件

(1)继承
(2)重写
(3)父类引用指向子类对象

3.向上转型

子类的值赋值给父类,父类引用子类对象。
父类只能调用父类自己的方法或者成员属性。
向上转型发生的三种时机:
(1)直接赋值
(2)方法传参
(3)方法返回

4.向下转型

向下转型时必须先进行向上转型。

Animal animal=new Cat();
animal.eat();
Cat cat=(Cat) animal;//此处进行强转。
cat.run();

三、Java 重写(Override)与重载(Overload)

1.重写(Override)

重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不能改变。即外壳不变,核心重写
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。


方法的重写规则:
(1)参数列表被重写方法的参数列表必须完全相同
(2)返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
(3)访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
(4)父类的成员方法只能被它的子类重写
(5)声明为 final 的方法不能被重写。
(6)声明为 static 的方法不能被重写,但是能够被再次声明。
(7)子类和父类在同一个包中,那么子类可以重写父类所有方法除了声明为 private 和 final 的方法。
(8)子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法
(9)重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
(10)构造方法不能被重写加粗样式
(11)如果不能继承一个方法,则不能重写这个方法

2.重载(Overload)

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
(1)被重载的方法必须改变参数列表(参数个数或类型不一样);
(2)被重载的方法可以改变返回类型
(3)被重载的方法可以改变访问修饰符
(4)被重载的方法可以声明新的或更广的检查异常
(5)方法能够在同一个类中或者在一个子类中被重载
(6)无法以返回值类型作为重载函数的区分标准。

3.重载和重写的区别

重载重写
方法名相同,参数列表不同,返回值不做要求方法名相同,参数列表相同,返回值相同
一个类继承关系
没有权限要求被覆写的方法不能拥有比父类更严格的访问控制权限
可以声明新的或更广的检查异常不可以声明新的或更广的检查异常

图片来自菜鸟教程

四、Java 抽象类

详细总结见以下链接:
https://blog.csdn.net/qq_45605223/article/details/103101101

包含抽象方法的类叫做抽象类。

abstract class Shape { 
 abstract public void draw(); //抽象方法
}

注意:
(1)抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
(2)抽象方法不能是 private 的。
(3)抽象类中可以有抽象方法,也可以有非抽象方法和成员变量。
(4)抽象类就是为了继承。
(5)抽象类被继承之后,一定要重写抽象方法。
(6)抽象类A如果继承了抽象类B,那么抽象类A可以选择重写或者不重写抽象类B中的方法。
(7)如果抽象类重写了,那么继承之后就不需要重写了。

五、Java 接口

详细总结见以下链接:
https://blog.csdn.net/qq_45605223/article/details/103101101

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

注意:
(1)接口的关键字interface。
(2)接口当中的方法都是抽象方法(默认的public abstract),全部不能具体实现。
(3)接口当中的方法尽量简洁。
(4)接口当中的成员变量默认为public static final (必须要初始化)。
(5)接口是不可以被实例化的。
(6)Implements A,B,C,D(可以实现多接口)。
(7)接口和接口之间不能实现(implements),但是可以继承(extends)也可以多继承。例如:interface B extends A,T 此时B包含了A和T中的功能,同时要重写A和T中的抽象方法。

六、Java 封装

参考于Java教程|菜鸟教程:
https://www.runoob.com/java/java-encapsulation.html

在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
要访问该类的代码和数据,必须通过严格的接口控制。
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。
适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。

1.封装的优点

(1) 良好的封装能够减少耦合。
(2)类内部的结构可以自由修改。
(3)可以对成员变量进行更精确的控制。
(4)隐藏信息,实现细节。

2.实现Java封装的步骤

(1)修改属性的可见性来限制对属性的访问(一般限制为private)

public class Person {
    private String name;
    private int age;
}
//将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏

(2)对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。

public class Person{
    private String name;
    private int age;public int getAge(){
      return age;
    }public String getName(){
      return name;
    }public void setAge(int age){
      this.age = age;
    }public void setName(String name){
      this.name = name;
    }
}
//采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值