面向对象编程(下半)

面向对象编程(下半)

继承

面向对象的三大特征: 封装,继承,多态

继承的作用?能解决什么样的实际问题?

请添加图片描述

生活中的继承:将一方所拥有的东西给予另一方。父母的财富

类之间的继承:属性和方法的赠与或获得。

继承的作用:把多个子类中重复的代码抽取到父类中,提高代码的复用性。

子类可以在父类的基础上,增加其它功能,使子类更强大。


创建一个父类

父类Animal

package cn.it.Demo07.ch2.Demo02;public class Animal {String breed;int age;String sex;void eat(){System.out.println(breed+"吃饭中ing...");}void sleep(){System.out.println(breed+"睡觉中ing...");}
}
创建一个子类

语法:class 子类 extends 父类

子类1:鸟类

package cn.it.Demo07.ch2.Demo02;public class Bird  extends Animal{String color;void fly(){System.out.println(breed+"飞翔中ing...");}
}

子类2:狗类

package cn.it.Demo07.ch2.Demo02;public class Dog extends Animal{String color;void run(){System.out.println(breed+"运动中ing...");}
}

子类3:鱼类

package cn.it.Demo07.ch2.Demo02;public class Fish  extends Animal{void swim(){System.out.println(breed+"游泳中ing...");}
}

子类4:蛇类

package cn.it.Demo07.ch2.Demo02;public class Snake  extends Animal{void crawl(){System.out.println(breed+"爬行中ing...");}
}
测试类Demo01
package cn.it.Demo07.ch2.Demo02;public class Demo01 {public static void main(String[] args) {Dog dog = new Dog();dog.breed="金毛";dog.age = 2;dog.sex = "公";dog.run();dog.eat();dog.sleep();Bird bird = new Bird();bird.breed="金丝雀";bird.age = 3;bird.sex = "母";bird.fly();bird.eat();bird.sleep();Snake snake = new Snake();snake.breed="蝰蛇";snake.age = 1;snake.sex = "母";snake.crawl();snake.eat();snake.sleep();Fish fish = new Fish();fish.breed="珍珠鱼";fish.age = 1;fish.sex = "母";fish.swim();fish.eat();fish.sleep();}
}

类的继承特点

  1. 在Java中,类只支持单继承,不允许多重继承。也就是说一个类只能有一个直接父类。

    class A{}

    class B{}

    class C extends A,B{}

    C类不可以同时继承A类和B类。

  2. 多个类可以继承一个父类。

    class A{}

    class B extends A{}

    class C extends A{}

    类B和类C都可以继承类A

  3. 在Java中,可以多层继承,即一个类的父类可以再继承另外的父类。C类继承自B类,而B类又可以继承自A类,这时,C类也可称作A类的子类。

    class A{}

    class B extends A{} // 类B继承类A,类B是类A的子类。

    class C extends B{} // 类C继承类B,类C是类B的子类,同时也是类A的子类。

  4. 在Java中,子类和父类是一种相对概念,一个类可以是某个类的父类,也可以是另一个类的子类。例如,B类是A类的子类,同时又是C类的父类。

    class A{}

    class B extends A{} // 类B继承类A,类B是类A的子类。

    class C extends B{} // 类C继承类B,类C是类B的子类,同时也是类A的子类。


4种访问控制权限

  1. private(当前类访问级别):private属于私有访问权限,用于修饰类的属性和方法。类的成员一旦使用了private关键字修饰,则该成员只能在本类中进行访问。

  2. default:如果一个类中的属性或方法没有任何的访问权限声明,则该属性或方法就是默认的访问权限,默认的访问权限可以被本包中的其它类访问,但是不能被其他包的类访问。

  3. default:如果一个类中的属性或方法没有任何的访问权限声明,则该属性或方法就是默认的访问权限,默认的访问权限可以被本包中的其它类访问,但是不能被其他包的类访问。

  4. public:public属于公共访问权限。如果一个类中的成员使用了public访问权限,则该成员可以在所有类中被访问,不管是否在同一包中。请添加图片描述

public class Test {public int aa;                          // 可以被所有的类访问protected boolean bb;                   // 可以被所有子类以及本包的类使用private String cc;                      // 能在本包范围内使用void dd(){                              // 可以在本类中访问System.out.println("包访问权限");}
}

不可继承

  1. 构造方法

类中的构造方法,只负责创建本类对象,不可继承。

  1. 私有属性和方法(private)

在继承中,子类不能继承父类中的私有成员。

  1. 默认属性和方法(default)

父类和子类不在同一个包中,不可以继承 default修饰的属性和方法。

父类和子类在同一个包中,可以继承 default修饰的属性和方法。

父类方法的重写

第一:子类中是否可以定义和父类相同的方法?

第二:为什么要重写?

第三:当父类提供的方法无法满足子类需求时,可在子类中定义相同的方法进行覆盖。

package cn.it.xheShi;public class Test {static class Animal {void eat() {System.out.println("父类未修改");}}static class Dog extends Animal {void eat() {System.out.println("子类已修改");}}public static void main(String[] args) {Dog dog = new Dog();dog.eat();}
}

方法重写要求

  1. 方法名称、参数列表、返回值类型必须与父类相同。
  2. 访问修饰符不能比父类更严格。
  3. 子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。

super关键字

package cn.it.xheShi;public class Test {static class Animal {void eat() {System.out.println("父类未修改");}}static class Dog extends Animal {void eat() {super.eat();System.out.println("子类已修改");}}public static void main(String[] args) {Dog dog = new Dog();dog.eat();}
}

在子类中加上super关键字会保留父类的内容


super调用父类的成员变量

不同位置的变量i

package cn.it.xheShi;class Animal {int i = 10;
}class Dog extends Animal{String color;int i = 20;public void eat(){int i = 30;System.out.println(i);System.out.println(this.i);System.out.println(super.i);}
}

测试类

package cn.it.xheShi;public class Test {public static void main(String[] args) {Dog dog = new Dog();dog.eat();
//        30
//        20
//        10}
}

super与this关键字的作用非常相似,都可以调用构造方法、普通方法和属性,但是两者之间还是有区别的,super与this的区别如下表。
请添加图片描述

final关键字

final的英文意思是“最终,不可更改”。在Java中,可以使用final关键字声明类、属性、方法,在声明时需要注意以下几点:

  1. 使用final修饰的类不能有子类。

  2. 使用final修饰的方法不能被子类重写。

  3. 使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改。


  • Java中的类被final关键字修饰后,该类将不可以被继承。
package cn.it.xheShi;final class Animal {}class Dog extends Animal{
//    Animal处报红
}
  • 当一个类的方法被final关键字修饰后,这个类的子类将不能重写该方法。
package cn.it.xheShi;class Animal {public final void shout(){}
}class Dog extends Animal{public void shout(){//方法shout无法被重写System.out.println("Dog");}
}
  • Java中被final修饰的变量是为常量,常量只能在声明时被赋值一次,在后面的程序中,其值不能被改变。
package cn.it.xheShi;class Animal {public static void main(String[] args) {final int AGE = 18; //变成常量了AGE = 20; //变成常量赋值后无法再修改}
}

抽象类abstract

为什么要有抽象类

假设:你创建了一个计时器,有别人想用你的计时器但发现没办法完全满足他所需要的功能,而每个想用这个东西的人需求各不同,他们就需要把名字继承下来再去修改内容

如何限制这种对象的创建?

使用abstract修饰类,此类不能new对象,称为抽象类。

抽象方法

抽象方法是使用abstrac关键字修饰的成员方法,抽象方法在定义时不需要实现方法体。

当一个类包含了抽象方法,该类必须是抽象类。抽象类和抽象方法一样,必须使用abstract关键字进行修饰。

abstract 返回值类型 方法名称(参数);

package cn.it.Demo07.ch2.Demo03;
//抽象类的作用
//当父类的方法无法完全满足所有子类所需的方法,通过抽象化在父类不定义内容(且无法被new出来),由子类来写,再使用
//继承抽象类必须实现里面的所有抽象方法
public abstract class Animal {//返回值类型 方法名//抽象后无法写方法体也就是{}的内容abstract void shout();abstract void eat();
}
class Dog extends Animal{@Overridevoid eat() {System.out.println("吃饭");}@Overridevoid shout() {System.out.println("你在狗叫什么!");}
}class TestAnimal{public static void main(String[] args) {Dog dog = new Dog();dog.shout();dog.eat();}
}

抽象类总结

抽象类的定义规则如下:

  1. 包含抽象方法的类必须是抽象类,抽象类不能实例化。
  2. 抽象类和抽象方法都要使用abstract关键字声明。
  3. 如果一个类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法。
  4. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类。

接口

接口的作用:克服单继承的限制,因为一个类只能有一个父类

如果一个抽象类的所有方法都是抽象的,则可以将这个类定义接口。接口是Java中最重要的概念之一,接口是一种特殊的类,由全局常量和公共的抽象方法组成,不能包含普通方法。

JDK 8对接口进行了重新定义,接口中除了抽象方法外,还可以定义默认方法和静态方法,默认方法使用default关键字修饰,静态方法使用static关键字修饰,且这两种方法都允许有方法体。

接口的语法格式:

[public] interface 接口名 [extends 接口1,接口2…] {

					**[public] [static] [final] 数据类型 常量名 = 常量;****[public] [abstract] 返回值的数据类型 方法名(参数列表);**

[public] static 返回值的数据类型 方法名(参数列表){}

		**[public] default 返回值的数据类型 方法名(参数列表){}**

}

接口

//InterfaceA.java
public interface InterfaceA{public void start();//抽象方法声明public void stop();//抽象方法声明}//实现类
//MovingDisk.java
public class MovingDisk implements InterfaceA{//方法实现public void start(){System.out.println("开始");}public void stop(){System.out.println("结束");}
}//测试类
//Test.java
public class Test{public static void main(String[] args){InterfaceA a1=new MovingDisk();//将移动硬盘插入到接口Aa1.start();//开启移动硬盘a1.stop();//关闭移动硬盘}
}

一个类可以实现多个接口,但只能继承一个父类(单继承)。


实现多个接口

public class 类名 implements 接口1,接口2,接口3{//接口中的方法实现
}

当实现多个接口时,注意必须实现每一个接口所声明的方法。接口作为类型可以声明一个对象的引用变量,实现接口的类实例化后,其对象的引用可以保存在这个变量中,在通过引用变量访问方法。实际将调用哪个方法,将根据实际创建出来的对象调用相对应的实现方法(此处表现出程序通过接口找到方法的多态性)。在实现对象时,有必要时需要做接口转换,
假设b对象都实现了接口1和接口2,则可以将b对象进行接口转换与实现,将其转换后的接口与实现赋予另一个对象

//a1接收b对象转换后的接口1与实现
接口1 a1=(接口1) b;
a1.接口1的方法;
//a2接收b对象转换后的接口2与方法实现
接口2 a2=(接口2)b;
a2.接口2的方法;

子类同时继承抽象类和实现接口,代码举例

//Test.java
//接口A
interface A{public String name="nacy";//定义全局变量public void print();//定义抽象方法
}
//抽象类B
abstract class B{public abstract void say();
}
//子类同时实现接口,覆写抽象类B的抽象方法
class Child extends B implements A{//覆写抽象类B中的抽象方法public void say(){System.out.println("Hello");}//覆写接口A中的抽象方法public void print(){Systeem.out.println("Name:"+name);}
}
public class Test{public static void main(String [] args){Child c=new Child();//实例化子类对象c.say();//调用被覆盖过的方法c.print();//调用被覆写过的方法}
}

抽象类实现接口:

interface A{public String name="nacy";//定义全局变量public void print();//定义抽象方法
}//抽象类B,实现接口
abstract class B implements A{public abstract void say();//此时抽象类中存在两个抽象方法:print()和say()
}//子类继承抽象类B
class Child extends B {//覆写抽象类B中的抽象方法public void say(){System.out.println("Hello");}//覆写抽象类B中的抽象方法public void print(){Systeem.out.println("Name:"+name);}
}
public class Test{public static void main(String [] args){Child c=new Child();//实例化子类对象c.say();//调用被覆盖过的方法c.print();//调用被覆写过的方法}
}

在Java中,允许一个接口继承多个接口,允许抽象类继承接口,但不允许接口继承抽象类。注意,不要混淆子类继承接口(implements)、子类继承父类(extends)、子接口继承父接口(extends)的关键字。

单个接口可以同时继承多个父接口:

//接口继承多个父接口
public  interface 子接口名 extends 接口1,接口2,接口3{//接口中的方法实现
}

接口的多继承:

interface A{public String name="A";public void printA();
}
interface B{public void printB();
}//定义接口C,同时继承接口A和B
interface C extends A,B{public void printC();
}//子类实现接口C,并覆写所有接口的抽象方法
class Child implements C{public void printA(){System.out.println("A");}public void printB(){System.out.println("B");}public void printC(){System.out.println("C");}
}
public class Test{public static void main(String[] args){Child c=new Child();//实例化子类对象c.printA();//调用方法c.printB();c.printC();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490140.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 给 Excel 写入数据的四种方法

Python 在数据处理领域应用广泛,其中与 Excel 文件的交互是常见需求之一。 本文将介绍四种使用 Python 给 Excel 文件写入数据的方法,并结合生活中的例子进行解释,帮助新手小白快速上手。 1. 使用 openpyxl 库 openpyxl 是一个用于读写 Exc…

Vue3项目的创建与使用

Vue 有 Vue2 和 Vue3 ,因为 Vue2 已经停止维护,所以我是直接从 Vue3 开始学习的。 Vue 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML 、 CSS 和 JavaScript 构建,并提 供了一套声明式的、组件化的编程模型,帮…

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块?模块是一个封装了特定功能的代码块,可以独立开发、测试和维护。模块通过导出(export)和导入(import)与其他模块通信,保持内部细节的封装。 前端 JavaScript 模块化是指…

第十三周Scrum Meeting记录

组长: 张楷 副组长:王骏 小组成员:林佳欣 王文秋 李昌豪 陈俊泽 赵浩然 项目链接:https://github.com/ctrlshiftm129/Tuanzi 文章目录 个人工作记录燃尽图组会照片代码签入记录本周总结 个人工作记录 成员工作内容张楷完成了从…

Linux 磁盘满了怎么办?快速排查和清理方法

当 Linux 磁盘满了,会导致系统无法正常运行,比如无法写入文件、服务停止、甚至系统崩溃。因此,快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤: 一、快速定位磁盘占用原因 1. 检查磁盘使用情况 使用 df 命令查…

中科网威-anysec安全网关 arping 远程命令执行漏洞复现(CNVD-2024-46119)

0x01 产品简介 深圳市中科网威科技有限公司成立于深圳市南山科技园信息产业化基地(也有说法称总部位于深圳市福田国际电子商务产业园),是深圳市高新技术企业、双软企业。公司致力于VPN防火墙、流量监控、网络行为管理、ANYSEC安全网关、IT运维设备等前沿网络设备的研发、生…

什么是PCB的CAF效应?

导电阳极丝(CAF)现象及其影响 在高科技电子产品制造中,尤其是在对环境适应性要求极高的汽车电子和军工领域,产品的耐高温和高湿性能显得尤为重要。 随着电子产品向更高集成度发展,电路板上的孔间距不断缩小&#xff…

harbor镜像仓库搭建

Harbor简介 Harbor的发展背景和现状 Harbor项目起始于2014年左右,当时正值容器技术和微服务架构迅速崛起的时期。随着越来越多的企业开始采用容器化部署应用,对于私有镜像管理的需求也日益增长。传统的解决方案要么缺乏必要的企业级特性(如访问控制、安全性和可扩展性),…

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现顺序查找的算法。 相关知识 为了完成本关任务,你需要掌握:1.根据输入数据建立顺序表,2.顺序表的输出,…

UOB大华银行|校招网申综合能力SHL测评题库英语版本真题分析

大华银行有限公司(大华银行)是亚洲银行业的翘楚,大华银行总部位于新加坡,并在中国、印度尼西亚、马来西亚、泰国及越南设立了全资法人银行,在全球拥有约500 间分行及办事处,分布在亚太、欧洲与北美的19 个国…

[C#与C++交互] 跨进程通信NamedPipes

目录 1、前言 2、什么是命名管道? 3、实现步骤 4、示例代码 4.1 C 服务器代码 4.2 C# 客户端代码 5、运行步骤 6、注意事项 7、应用场景 8、优缺点 9、总结 1、前言 在 C# 和 C 应用程序之间进行数据交换时,命名管道(Named Pipes…

《宇宙机器人》提示错误弹窗“找不到d3dx9_43.dll”是什么原因?“d3dx9_43.dll缺失”怎么解决?

电脑游戏运行时常见问题解析:《宇宙机器人》提示“找不到d3dx9_43.dll”的解决之道 TGA2024落幕,年度最佳游戏——《宇宙机器人》,作为一名在软件开发领域深耕多年的从业者,我深知电脑游戏在运行过程中可能会遇到的各种挑战&…

Hive-4.0.1数据库搭建(可选配置用户名密码远程连接)

1.官网下载tar包上传到服务器并解压&#xff08;我这里解压到了hive目录): 2.进入到conf目录&#xff0c;并复制模板配置文件进行修改&#xff1a; cd /apache-hive-4.0.1-bin/conf cp hive-default.xml.template hive-site.xml3.编写内容如下&#xff1a; <property>&…

计算机内存里面4个字节与float类型数据的转换原理

在计算机科学中&#xff0c;四个字节与float&#xff08;单精度浮点数&#xff09;之间的转换是一种常见的操作。这种转换涉及到数据类型的转换和内存存储的相关知识&#xff0c;其原理主要基于IEEE 754标准。以下是对四个字节和float转换原理的详细解释&#xff1a; 一、基本…

MATLAB 识别色块和数量

文章目录 前言步骤 1: 读取图像步骤 2: 转换为 HSV 颜色空间步骤 3: 定义颜色范围步骤 4: 创建颜色掩码步骤 5: 应用形态学操作&#xff08;可选&#xff09;步骤 6: 标记和显示结果完整代码步骤七 返回色块坐标 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&…

抓包分析DHCP的工作过程

一、DHCP简介 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;动态主机配置协议&#xff0c;前身是BOOTP协议。在大型局域网中&#xff0c;需要给很多主机配置地址信息&#xff0c;如果采用传统手工配置&#xff08;累死&#xff09;&#xff0c;效率太低&am…

MUR3060PTR-ASEMI快恢复二极管对管MUR3060PTR

编辑&#xff1a;ll MUR3060PTR-ASEMI快恢复二极管对管MUR3060PTR 型号&#xff1a;MUR3060PTR 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 正向电流&#xff1a;30A 反向电压&#xff1a;600V 正向压降&#xff1a;0.98V~1.90V 引线数量&#xff1a;3 芯片个数&a…

CSS学习记录13

CSS组合器 组合器是解释选择器之间关系的某种机制。CSS选择器可以包含多个简单选择器。在简单选择器之间&#xff0c;我们可以包含一个组合器。 CSS中有四种不同的组合器&#xff1a; 后代组合器&#xff08;空格&#xff09;子选择器&#xff08;>)相邻兄弟选择器&#…

城市大脑新型智慧城市数据中台建设方案

建设背景与现状 随着城市化进程的加速&#xff0c;城市数据呈现出爆炸式增长&#xff0c;但数据的整合、共享和利用却面临诸多挑战。信息孤岛、数据冗余、管理分散等问题日益突出&#xff0c;制约了智慧城市的发展。为了解决这些问题&#xff0c;构建城市大脑新型智慧城市数据…

LeetCode 热题 100-两数之和(简单)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出和为目标值 target 的那两个整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。…