杨校老师课堂之Java面向对象知识点整理集锦1:https://developer.aliyun.com/article/1543045
12. 继承中的构造方法
当类之间产生了关系,其中各类中的构造方法,又产生了哪些影响呢?
首先我们要回忆两个事情,构造方法的定义格式和作用。
1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。
子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
代码如下
class Aminal { private int age; Aminal() { System.out.println(age); } } class Dog extends Aminal { // 不写 super(); Jvm 也会调用执行super(); Dog() { System.out.println("wangcai"); } } public class TestExtendsDemo { public static void main(String[] args) { Dog dog = new Dog(); } } // 打印出结果是:0 wangcai
super和this的含义
super :代表父类的存储空间标识(可以理解为父亲的引用)。
this : 代表当前对象的引用(谁调用就代表谁)。
- 子类的每个构造方法中均有默认的super(),调用父类的空参构造。
- 手动调用父类构造会覆盖默认的super()。
- super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现
13. InstanceOf关键字
instanceof关键字
1:用于判断某个对象是否是某种类型。
2:格式
对象名 instanceof 子类(实现)名
14.动态Bingding
动态绑定(后期绑定)是指:在程序运行过程中,根据具体的实例对象才能具体确定是哪个方法。
15.方法重写
16.Object类API
java.lang.Object
类是Java语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。
如果一个类没有特别指定父类, 那么默认则继承自Object类
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。今天我们主要学习其中的2个:
public String toString():返回该对象的字符串表示。
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
toString方法
public String toString():返回该对象的字符串表示。
toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
equals方法
public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。
这里的“相同”有默认和自定义两种方式。
17. 访问控制(包、访问权限)
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,
- public:公共的。
- protected:受保护的
- default:默认的
- private:私有的
不同权限的访问范畴:
public |
protected | default | private | |
同一类中 | √ | √ | √ | √ |
同一包中(子类与无关类) | √ | √ | √ | |
不同包的子类 | √ | √ | ||
不同包中的无关类 | √ |
根据上表可知,public具有最大权限。private则是最小权限。
编写代码时,如果没有特殊的考虑,建议这样使用权限:
- 成员变量使用 private ,隐藏细节。
- 构造方法使用 public ,方便创建对象。
- 成员方法使用 public ,方便调用方法。
- 不加权限修饰符,其访问能力与default修饰符相同。
18. final关键字
学习了继承后,我们知道,子类可以在父类的基础上改写父类内容,比如,方法重写。那么我们能不能随意的继承 API中提供的类,改写其内容呢?显然这是不合适的。为了避免这种随意改写的情况,Java提供了 final 关键字, 用于修饰不可改变内容。
- final:不可改变。可以用于修饰类、方法和变量
- 类:被修饰的类,不能被继承。
- 方法:被修饰的方法,不能被重写。
- 变量:被修饰的变量,不能被重新赋值。
使用方式:
- 修饰类
- 格式如下
final class 类名 { }
通过查询API回发现像 public final class String 、 public final class Math 、 public final class Scanner 等,很多我们学习过的类,都是被final修饰的,目的就是供我们使用,而不让我们所以改变其内容
修饰方法
格式如下
修饰符 final 返回值类型 方法名(参数列表){ //方法体 }
- 修饰变量基本类型的局部变量,被final修饰后,只能赋值一次,不能再更改。代码如下
- 局部变量——基本类型
- 局部变量——引用类型
19. 抽象类
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有 意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法 的类就是抽象类。
定义抽象方法 :
没有方法体的方法。
定义抽象类:
包含抽象方法的类。
abstract使用格式:
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。
- 定义格式
权限修饰符 abstract 返回值类型 方法名 (参数列表);
public abstract void playBall();
抽象类: 如果一个类包含抽象方法,那么该类必须是抽象类。
public abstract class Animal { public abstract void run(); }
abstract注意:
抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。
抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设 计。
抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象 类。
理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有 意义。
20. 接口
接口,是Java语言中一种引用类型,是抽象方法的集合,
如果说类的内部封装了成员变量、构造方法和成员方法,那么接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9)。
接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并 不是类,而是另外一种引用数据类型
接口的使用,它不能创建对象,但是可以被实现( implements ,类似于被继承)。一个实现接口的类(可以看做 是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象 类。
public interface 接口名称 { // 抽象方法 // 默认方法 // 静态方法 // 私有方法 }
抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
public interface UserService { public abstract void userLogin(); }
默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。
public interface UserService { public default void set() { // 方法内容 } }
静态方法:使用 static 修饰,供接口直接调用。
public interface UserService { public static void get() { // 方法内容 } }
私有方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。
public interface UserService { public static void getById(Integer id) { // 方法内容 } }
类与接口的关系为实现关系,即类实现接口,该类可以称为接口的实现类,也可以称为接口的子类。
- 实现的动作类 似继承,格式相仿,只是关键字不同,实现使用 implements 关键字。
- 非抽象子类实现接口:
- 必须重写接口中所有抽象方法。
- 继承了接口的默认方法,即可以直接调用,也可以重写。
实现格式:
public class 类名 implements 接口名 { // 重写接口中抽象方法【必须】 // 重写接口中默认方法【可选】 }
接口特点:
- 接口中,无法定义成员变量,但是可以定义常量,其值不可以改变,默认使用public static final修饰。
- 接口中,没有构造方法,不能创建对象。
- 接口中,没有静态代码块。
杨校老师课堂之Java面向对象知识点整理集锦3:https://developer.aliyun.com/article/1543058