java:Java类与对象(继承篇)

前言:

为什么要继承?

如:创建两个类,一个猫类,一个狗类,猫与狗都有眼睛,嘴巴,鼻子这些相同的属性,为了避免代码重复我们可以通过创建一个动物类,包含这些重复的属性,在通过继承的方式使用。

继承是面向对象编程中的重要概念,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的重用和扩展。通过继承,子类可以拥有父类的属性和方法,并且可以在此基础上添加新的属性和方法,实现代码的层次化和结构化。

下面通过一个简单的示例代码来演示继承的概念:

假设我们有一个父类 Animal,包含属性 name 和方法 eat(),表示动物的基本特征和行为。然后我们定义一个子类 Dog,继承自Animal类,并添加新的方法 bark(),表示狗特有的行为。

// Animal类
public class Animal {
    private String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(this.name + " is eating");
    }
}

// Dog类继承自Animal类
public class Dog extends Animal {
    public Dog(String name) {
        super(name); // 调用父类的构造方法
    }

    public void bark() {
        System.out.println(this.name + " is barking");
    }

    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat(); // 调用父类的eat方法
        dog.bark(); // 调用子类的bark方法
    }
}

在上面的示例中,子类 Dog 继承自父类 Animal,通过关键字 extends 实现继承。子类 Dog 可以访问父类 Animal 的属性和方法,同时可以定义自己的属性和方法。在子类的构造方法中,使用 super(name) 调用父类的构造方法来初始化父类的属性。


继承的概念

继承是面向对象编程中的重要概念,它允许一个类(称为子类或派生类)获取另一个类(称为父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,同时可以在不修改父类的情况下添加新的属性和方法,从而实现代码的重用和扩展。

在继承关系中,子类继承了父类的特征(属性)和行为(方法),并且可以在此基础上进行定制化。子类可以覆盖(重写)父类的方法,以实现自己特有的行为。继承还遵循了里氏替换原则,即子类可以替换父类出现的任何地方,而不会影响程序的正确性。

通过继承,可以建立类之间的层次关系,使得代码更加结构化和易于维护。同时,继承也有助于代码的扩展和灵活性,使得程序更容易适应需求变化。

继承的基本格式

在Java中,继承的基本格式如下所示:

class ParentClass {
    // 父类的属性和方法
}

class ChildClass extends ParentClass {
    // 子类的属性和方法
}

在这个基本格式中:

  • ParentClass 是父类,包含了一些属性和方法。
  • ChildClass 是子类,通过关键字 extends 指定继承自哪个父类。
  • 子类继承了父类的属性和方法,可以直接访问父类的公共和受保护成员。
  • 子类可以重写父类的方法,实现多态性。
  • 子类可以添加自己的属性和方法,扩展父类的功能。

继承的具体示例

以下是一个具体的Java代码示例,演示了继承的概念和用法

// 父类Animal
class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating");
    }
}

// 子类Dog继承自Animal
class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void bark() {
        System.out.println(name + " is barking");
    }
}

// 子类Cat继承自Animal
class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void meow() {
        System.out.println(name + " is meowing");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.eat();  // 调用父类方法
        dog.bark(); // 调用子类方法

        Cat cat = new Cat("Whiskers");
        cat.eat();  // 调用父类方法
        cat.meow(); // 调用子类方法
    }
}

在这个例子中,我们定义了一个父类Animal,包含name属性和eat()方法。然后分别定义了DogCat两个子类,它们分别继承自Animal类并添加了自己特有的方法bark()meow()

Main类的main方法中,我们实例化了DogCat对象,并调用它们的方法来展示继承的效果。通过这个具体的代码示例,可以更清晰地理解Java中继承的概念和用法。

 super关键字

出现情况,子类和父类可能会存在相同名称的成员,在子类的方法中访问父类同名成员(作用)

public class Base {
    int a;
    int b;
 public void methodA(){
     System.out.println("Base中的methodA()");
 }
 
 public void methodB(){
     System.out.println("Base中的methodB()");
 }
}
public class Derived extends Base{
    int a;    // 与父类中成员变量同名且类型相同

    char b;   // 与父类中成员变量同名但类型不同

    // 与父类中methodA()构成重载

    public void methodA(int a) {
        System.out.println("Derived中的method()方法");
   }
 
    // 与基类中methodB()构成重写(即原型一致,重写后序详细介绍)

    public void methodB(){
        System.out.println("Derived中的methodB()方法");
   }
 
    public void methodC(){
        // 对于同名的成员变量,直接访问时,访问的都是子类的

        a = 100;   // 等价于: this.a = 100;

        b = 101;   // 等价于: this.b = 101;

        // 注意:this是当前对象的引用

 
        // 访问父类的成员变量时,需要借助super关键字

        // super是获取到子类对象中从基类继承下来的部分

        super.a = 200;
        super.b = 201;
 
 
        // 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法

        methodA();      // 没有传参,访问父类中的methodA()

        methodA(20);    // 传递int参数,访问子类中的methodA(int)

 
        // 如果在子类中要访问重写的基类方法,则需要借助super关键字

        methodB();      // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到

        super.methodB(); // 访问基类的methodB()

   }
}

【注意事项】

1.只能在非静态方法中使用

2.在子类方法中,访问父类中的变量和方法

 this和super之间的区别

1.this关键字:

  • this关键字用于引用当前对象的成员,包括属性和方法。
  • 可以用this来区分实例变量和方法参数或局部变量,以解决命名冲突。
  • 可以在构造方法中使用this()来调用本类的其他构造方法。
  • 可以在方法内部使用this来调用本类的其他方法。

super关键字:

  • super关键字用于引用父类的成员,包括属性和方法。
  • 可以在子类的构造方法中使用super()来调用父类的构造方法。
  • 可以在子类中使用super来调用父类的方法或属性。
  • 在子类中,如果没有显式调用super()来调用父类的构造方法,Java会默认调用父类的无参构造方法。

总结:

  • this关键字用于引用当前对象的成员,解决当前对象内部的命名冲突。
  • super关键字用于引用父类的成员,实现子类对父类的访问和调用。

 访问权限

Java提供了四种访问修饰符,用于控制类、属性、方法和构造方法的访问权限。这些访问修饰符包括:

1.public

  • 公共访问修饰符,被声明为public的类、属性、方法可以被任何其他类访问。
  • 没有访问限制,可以在任何地方访问。

2.protected

  • 保护访问修饰符,被声明为protected的类、属性、方法可以被同一包内的类以及所有子类访问。
  • 在不同包的子类中,可以访问protected成员,但不能直接访问protected成员。

3.default(默认,不写访问修饰符):

  • 默认访问修饰符,即不写访问修饰符,被声明为默认访问修饰符的类、属性、方法只能被同一包内的类访问。
  • 在不同包的子类中,不能访问默认访问修饰符的成员。

4.private

  • 私有访问修饰符,被声明为private的类、属性、方法只能被本类访问,其他类无法访问。
  • 在同一类中可以访问private成员,但其他类无法直接访问private成员。

这些访问修饰符可以用于类、属性、方法和构造方法上,以控制对它们的访问权限。合理使用访问修饰符可以提高代码的安全性和可维护性,同时也可以隐藏实现细节,降低类之间的耦合度。

总结:

  • public:公共访问权限,任何地方都可以访问。
  • protected:受保护访问权限,同一包内和子类可以访问。
  • default:默认访问权限,同一包内可以访问。
  • private:私有访问权限,只有本类可以访问。


继承方式

在java中,只支持以下几种方式:

单继承,多层继承,不同类继承同一个类。


final关键字 

final关键可以用来修饰变量,成员方法以及类。

  • 1.修饰变量或者字段,表示常量(即不能修改)
final int a=10;
a=20;//编译出错
  • 2.修饰类:表示次类不能被继承
final public class Animal {
   ...
}
 

public class Bird extends Animal {
   ...
}
 

// 编译出错

Error:(3, 27) java: 无法从最终com.bit.Animal进行继

 继承与组合

和继承类似, 组合也是一种表达类之间关系的方式, 也是能够达到代码重用的效果。组合并没有涉及到特殊的语法(诸如 extends 这样的关键字), 仅仅是将一个类的实例作为另外一个类的字段

// 轮胎类

class Tire{
    // ...

}
 

// 发动机类

class Engine{
    // ...

}
 

// 车载系统类

class VehicleSystem{
    // ...

}
 

class Car{
    private Tire tire;          // 可以复用轮胎中的属性和方法

    private Engine engine;      // 可以复用发动机中的属性和方法

    private VehicleSystem vs;   // 可以复用车载系统中的属性和方法

    
    // ...

}
 

// 奔驰是汽车

class Benz extend Car{
    // 将汽车中包含的:轮胎、发送机、车载系统全部继承下来

}

 完结!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

更改android 安装的sdk版本

打开sdk manager 勾选show details 就可以选择了。

CTF之comment

网站的登录框里有提示 账号:zhangwei 密码:zhangwei***(后三位要自己猜) 用burpsuit抓包爆破发现密码为zhangwei666 进去后就一个留言榜(目前没发现怎么用) 扫一下网站发现git泄露 1.下载 进入root用户&…

【讲解下常见的分类算法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

ELK企业级日志分析系统(elasticsearch+logstash+kibana)

目录 一.ELK概述 1.定义 (1)ElasticSearch (2)Kiabana (3)Logstash (4)Filebeat 2.filebeat结合logstash带来好处 3.为什么要是用ELK? 4.完整日志系统基本特征 …

快速寻找可以构建出网通信隧道的计算机

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 为加强内网的安全防范,安全管理员往往会限制内网计算机访问互联网,当然不同机构的限制策略是不一样的,有的完全阻断了内网计算机访问…

企业中台技术架构解决方案(中台建设指南Word原件2024)

通过中台建设实现企业能力复用,包括能力整合、业务创新、业务和数据闭环、组织模式演进等。 数字能力整合 企业的数字能力一般包括数字化营销、数字化产品、数字化供应链、数字化生产、数字化运营等。企业的数字化能力的充分利用,从而达到可持续发展。数…

面试算法-177-二叉搜索树中第K小的元素

题目 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。 示例 1: 输入:root [3,1,4,null,2], k 1 输出:1 解 class Solution…

Stable Diffusion教程:LoRA模型

LoRA模型是一种微调模型,它不能独立生成图片,常常用作大模型的补充,用来生成某种特定主体或者风格的图片。 下载模型 在模型下载网站,如果模型是LoRA模型,网站会特别标识出来。以 liblib.ai为例: 模型左…

操作系统(第五周 第一二堂总结)

目录 回顾 前景知识 概述 定义 进程和线程的关系 进程和线程的区别 线程优缺点 优点: 缺点: 易混概念 线程实现方式 线程的类型: ​编辑 多线程模型: 线程函数 头文件: 线程创建函数: 线…

【高录用-快速见刊】2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者,共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿研究成果,讨论数字技术在金融领域的应用与创新,并推动数…

CSS导读 (元素显示模式 上)

(大家好,今天我们将继续来学习CSS的相关知识,大家可以在评论区进行互动答疑哦~加油!💕) 目录 三、CSS的元素显示模式 3.1 什么是元素显示模式 3.2 块元素 3.3 行内元素 3.4 行内块元素 3.5 元素…

星邦生化设备有限公司将出席2024第13届生物发酵展

参展企业介绍 宁波星邦生化设备有限公司,致力于发酵空气处理、发酵尾气处理及发酵罐节能环保装备的研发制造达30余年。公司拥有20多项自主开发的具有竞争力的国家发明专利技术及核心专有技术。连续三届被中国生物发酵产业协会评为——节能环保重点推荐企业。公司用…

超声波清洗机有用吗?无广推荐清洁力比较强超声波清洗机

超声波清洗机利用超声波在液体中产生的微小气泡爆炸,产生强大的冲击力,能够深入物品的各个角落,有效去除油污、灰尘和细菌。与传统的手工清洗相比,不仅清洁效率高,而且能够保护眼镜不受损伤,特别适合清洗眼…

Java安全管理器-SecurityManager

定义: SecurityManager是Java中的一个类,用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理,并控制哪些操作可以执行,哪些应该被拒绝。主要功能包括: 安全策略管理:SecurityManager允许…

JavaEE之锁策略,cas 和 synchronized 优化过程深入浅出

目录 题外话 正题 锁策略 乐观锁和悲观锁 轻量锁和重量锁 CAS算法(Compare And Swap) 自旋锁和挂起等待锁 普通互斥锁和读写锁 公平锁和非公平锁 可重入锁和不可重入锁 synchronized原理 基本特点 锁升级 其它锁优化 锁消除 锁粗化 小结 题外话 时间紧任务重,直…

C++-基础

C语言介绍 C 是一种通用编程语言,具有高性能、灵活性和广泛的应用领域。它是在 1979 年由 Bjarne Stroustrup 开发的,最初被称为“C with Classes”,随后在 1983 年正式更名为 C。C 基于 C 语言,同时引入了面向对象编程&#xff0…

【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。

操作环境: MATLAB 2022a 1、算法描述 粒子群算法(Particle Swarm Optimization,简称PSO)是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述: 基本思想: 鸟群在寻找食物时,每只鸟都…

003 【笔记神器】Obsidian:打造属于自己的万能工作台

前言:Obsidian 是一款很多大神都在用的笔记软件,具有强大的功能,能够满足日常各种笔记的需求。强大之处在于:Obsidian 能够安装各种强大的插件,实现各种功能。 废话不多说,玩转 Obsidian 仅需这篇文章足矣&…

Linux/Iclean

Iclean Enumeration nmap 先使用默认规则扫描常用的端口,发现对外开放了 22 和 80 端口,然后扫描这两个端口的详细信息,结果如下,很常规的结果,没发现什么有趣的东西 ┌──(kali㉿kali)-[~/vegetable/HTB/Iclean] …

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议(CHHASD2024)将在中国武汉举行,主题为“文化、历史,人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…