黑马程序员_继承



------- android培训java培训、期待与您交流! ----------

1-1 继承的概念

1-1-1 继承的概述

通过extends关键字让类与类之间产生继承关系。

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

多个类可以称为子类,单独这个类称为父类或者超类。


注意:

1、子类可以直接访问父类中的非私有的属性和行为。

2、子类无法继承父类中私有的内容。

3、父类怎么来的?共性不断向上抽取而来的。


好处:

继承的出现提高了代码的复用性。

继承的出现让类与类之间产生了关系,提供了多态的前提。


1-1-2 继承的特点

Java只支持单继承,不支持多继承。

一个类只能有一个父类,不可以有多个父类。


原因:

因为多继承容易出现问题。

两个父类中有相同的方法,子类到底要执行哪一个是不确定的。


Java支持多层继承(继承体系)

C继承B,B继承A,就会出现继承体系。

多层继承出现的继承体系中,通常看父类中的功能,了解该体系的基本功能,建立子类对象,即可使用该体系功能。


定义继承需要注意:

不要仅为了获取其他类中某个功能而去继承,类与类之间要有所属关系。


1-1-3 super关键字 & 函数覆盖


在子父类中,成员的特点体现:

1、成员变量

this和super的用法很相似。

this代表本类对象的引用。

super代表父类的内存空间的标识。


当本类的成员和局部变量同名用this区分。

当子父类中的成员变量同名用super区分父类。


2、成员函数

当子父类中出现成员函数一模一样的情况,会运行子类的函数。

这种现象,称为覆盖操作,这是函数在子类中的特性。

在子类覆盖方法中,继续使用被覆盖的方法可以通过super.函数名获取。


函数两个特性:

1、重载,同一个类中。

2、覆盖,子类中,覆盖也称为重写,覆写,override。


什么时候使用覆盖操作?

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。


注意:

1、父类中的私有方法不可以覆盖。

2、父类为static的方法无法覆盖。

3、覆盖时,子类方法权限一定要大于等于父类方法权限。


3、构造函数

子父类中构造函数的特点:

在子类构造函数执行时,发现父类构造函数也运行了。

原因:在子类的构造函数中,第一行有一个默认的隐匿语句:super();。

注意:如果使用super(4);语句调用父类的其他构造函数,那么默认的父类构造函数将不会再被调用。


1-1-4 子类的实例化过程

子类中所有的构造函数默认都会访问父类中空参数的构造函数。

因为每一个构造函数的第一行都有一条默认的语句super();。

子类会具备父类中的数据,所以要先明确父类是如何对这些数据初始化的。


为什么子类实例化的时候要访问父类中的构造函数呢?

那是因为子类继承了父类,获取到了父类中内容(属性),所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。


注意:

1、当父类中没有空参数的构造函数时,子类的构造函数必须通过this或者super语句指定要访问的构造函数。

2、子类构造函数中如果使用this调用了本类构造函数,那么默认的super();就没有了,因为super和this都只能定义在第一行,所以只能有一个。但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。

3、super语句必须要定义在子类构造函数的第一行!因为父类的初始化动作要先完成。


总结:

一个对象实例化过程,以Person p = new Person();为例:

1、JVM会读取指定的路径下的Person.class文件,并加载进内存,并会先加载Person的父类(如果有直接的父类的情况下)。

2、在内存中开辟空间,并分配地址。

3、并在对象空间中,对对象的属性进行默认初始化。

4、调用对应的构造函数进行初始化。

5、在构造函数中,第一行会先到调用父类中构造函数进行初始化。

6、父类初始化完结后,再对子类的属性进行显示初始化。

7、再进行子类构造函数的特定初始化。

8、初始化完毕后,将地址值赋值给引用变量。


1-1-5  final关键字

final可以修饰类,方法,变量。

final修饰的类不可以被继承。

final修饰的方法不可以被覆盖。

final修饰的变量是一个常量,只能被赋值一次。


为什么要用final修饰变量,其实在程序中如果一个数据是固定的。

那么直接使用这个数据就可以了,但是这种阅读性差,所以应该给数据起个名称。

而且这个变量名称的值不能变化,所以加上final固定。

写法规范:常量所有字母都大写,多个单词,中间用_连接。


identity 身份认证 购VIP最低享 7 折! triangle vip 30元优惠券将在58:6:9后过期 去使用 triangle QT+Poppler+PDFviewer.zip 是一个用于在Windows操作系统下,使用QT5框架结合Poppler库开发PDF阅读器的项目。这个项目的核心是利用Poppler库解析PDF文档,并通过QT5进行用户界面的设计和交互。以下将详细介绍相关知识点: 1. **QT5框架**:QT(Qt)是一个跨平台的应用程序开发框架,支持多种操作系统,如Windows、Linux、macOS等。它提供了丰富的库函数和组件,使得开发者可以方便地构建图形用户界面(GUI)应用程序。QT5是QT的第五个主要版本,引入了许多新特性和改进,如QML(Qt Meta Object Language)用于声明式UI设计,以及更好的性能和API优化。 2. **Poppler库**:Poppler是一个开源的PDF文档处理库,源自Xpdf项目,主要用于PDF文件的解析、渲染和提取文本。Poppler提供了C++接口,使得开发者能够方便地在应用程序中集成PDF阅读和处理功能。它可以读取PDF文件,显示页面,提取文本和元数据,甚至支持对PDF文件进行注释和修改(但本项目可能仅涉及阅读功能)。 3. **PDF viewer的实现**:在本项目中,PDF viewer是基于QT5 GUI组件构建的,它利用Poppler库来加载和解析PDF文档。`mainwindow.cpp`和`mainwindow.h`包含了主窗口类的定义和实现,这是用户与应用程序交互的主要界面。`pdfcanvas.cpp`和`pdfcanvas.h`则可能包含了用于显示PDF页面的自定义画布类,该类使用Poppler库来渲染PDF页面到QT的画布上。 4. **项目构建与编译**:`newtime.pro`是QT项目的配置文件,用于指定项目依赖的库(如Poppler)、源代码文件、编译选项等。`.pro.user`文件则保存了用户的特定编译设置,如编译器路径或调试选项。开发者需要使用QT的qmake工具或直接在IDE如Qt Creator中打开此项目,进行编译和链接,确保所有依赖库都正确安装并链接。 5. **文件操作**:`main.cpp`通常是程序的入口点,负责初始化QT应用环境并运行主循环。在PDF viewer中,可能会在`main.cpp`中实例化主窗口,并调用Poppler库的相关函数来加载PDF文件。 6. **使用流程**:用户可以通过QT界面选择PDF文件,然后通过Poppler库读取文件内容,将页面渲染到QT的控件上。用户可以通过滚动、缩放等操作查看PDF内容。 Poppler库的强大功能使得PDF viewer可以支持多页显示、文本搜索、书签管理等高级特性。 7. **优化与扩展**:为了提升用户体验,开发者可能会对PDF viewer进行各种优化,比如添加平滑滚动、快速查找、页面预加载等功能。此外,还可以考虑支持批注、打印、PDF转换等更复杂的操作,以增强软件的功能性和实用性。 QT+Poppler+PDFviewer.zip项目提供了一个基础的PDF阅读器实现,开发者可以在此基础上进一步定制和扩展,以满足特定的PDF处理需求。
继承是Java中的一种重要的面向对象编程概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,子类可以从父类中获得已有的属性和方法,并且可以在此基础上进行扩展或者修改。 在Java中,使用关键字"extends"来实现继承。子类通过继承父类,可以使用父类中的非私有属性和方法。子类可以直接访问父类的公有属性和方法,也可以通过super关键字来访问父类的构造方法和成员。 下面是一个简单的继承示例: ```java // 父类 class Animal { private String name; public Animal(String name) { this.name = name; } public void eat() { System.out.println(name + "正在吃饭"); } } // 子类 class Dog extends Animal { public Dog(String name) { super(name); } public void bark() { System.out.println("汪汪汪"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog("旺财"); dog.eat(); // 调用父类的eat方法 dog.bark(); // 调用子类的bark方法 } } ``` 在上面的示例中,Animal类是父类,Dog类是子类。Dog类通过关键字"extends"继承了Animal类,从而可以使用Animal类中的属性和方法。在main方法中,我们创建了一个Dog对象,并调用了eat方法(来自父类)和bark方法(来自子类)。 通过继承,子类可以扩展父类的功能,并且可以在需要时覆盖父类的方法来实现特定的行为。继承是Java中实现代码重用和多态性的重要手段之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值