Java 多态、包、final、权限修饰符、静态代码块

多态

Java多态是指一个对象可以具有多种形态。它是面向对象编程的一个重要特性,允许子类对象可以被当作父类对象使用。多态的实现主要依赖于继承、接口和方法重写。

在Java中,多态的实现主要通过以下两种方式:

  1. 继承:子类继承父类的属性和方法,可以对方法进行重写(覆盖),从而实现不同的行为。

  2. 接口:类可以实现一个或多个接口,从而拥有接口中定义的方法。接口中的方法默认是抽象的,需要类来实现。

下面是一个简单的Java多态示例:

// 父类
class Animal {
    public void makeSound() {
        System.out.println("动物发出声音");
    }
}

// 子类
class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("狗汪汪叫");
    }
}

// 子类
class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("猫喵喵叫");
    }
}

public class Main {
    public static void main(String[] args) {
        // 使用父类引用指向子类对象,实现多态
        Animal myAnimal = new Dog();
        myAnimal.makeSound(); // 输出:狗汪汪叫

        myAnimal = new Cat();
        myAnimal.makeSound(); // 输出:猫喵喵叫
    }
}

在这个示例中,DogCat 类都继承了 Animal 类,并重写了 makeSound 方法。在 main 方法中,我们使用父类 Animal 的引用来指向子类 DogCat 的对象,实现了多态。当我们调用 makeSound 方法时,会根据实际对象的类型来执行相应的方法。

核心要素

多态的存在依赖于三个核心要素:

  1. 继承:多态的实现基于类的继承关系。这意味着必须有一个父类和至少一个子类,子类从父类那里继承了某些属性和方法。
  2. 方法重写:在子类中对继承自父类的方法进行重写(覆盖)。这样,当调用这些方法时,可以根据对象的实际类型(父类或子类)来执行相应的方法版本。
  3. 父类引用指向子类对象:使用父类类型的引用来指向子类的对象实例。这使得可以通过父类引用来操作子类对象,实现在不同子类对象上执行相同的操作,但表现出不同的行为。

此外,多态性通常与方法有关,与类的属性无关。这是因为多态性主要关注通过同一个接口(父类引用)调用不同类(子类)中的方法时,如何根据对象的实际类型来执行相应的方法版本。

 多态的弊端

多态在面向对象编程中是一种强大的特性,它允许不同类的对象对同一消息做出响应。然而,尽管多态性提高了代码的灵活性和可维护性,但它也有一些弊端。具体来说,多态的弊端主要包括以下几点:

  • 不能直接使用子类的特有属性和行为:当使用父类引用指向子类对象时,只能访问到父类中定义的属性和方法,而不能直接访问子类特有的属性和方法。这是因为在多态的情况下,编译器只知道该引用是父类类型,而不知道具体是哪个子类的实例。
  • 需要进行向下转型(强制类型转换):为了能够访问子类特有的属性和方法,需要将父类引用显式地转换为子类类型,这个过程称为向下转型。然而,向下转型可能会带来风险,如果转型的类型不正确,就会抛出ClassCastException异常。
  • 可能导致设计上的问题:过度依赖多态可能会导致设计上的问题,例如破坏了封装性,因为需要在外部代码中进行类型转换,这可能会增加代码的复杂性和出错的可能性。

 instanceof 关键字

instanceof是Java中的一个关键字,用于检查一个对象是否属于某个类或接口的实例。它的语法格式为:

object instanceof ClassName

其中,object是要检查的对象,ClassName是要检查的类或接口的名称。如果objectClassName的实例,那么表达式的结果为true,否则为false

例如,假设我们有一个名为Animal的类和一个名为Dog的子类,我们可以使用instanceof来检查一个对象是否是AnimalDog的实例:

Animal animal = new Animal();
Dog dog = new Dog();

if (animal instanceof Animal) {
    System.out.println("animal 是 Animal 的实例");
}

if (dog instanceof Animal) {
    System.out.println("dog 是 Animal 的实例");
}

if (dog instanceof Dog) {
    System.out.println("dog 是 Dog 的实例");
}

输出结果为:

animal 是 Animal 的实例
dog 是 Animal 的实例
dog 是 Dog 的实例

 包

Java 包是一种命名空间,用于将类和接口进行分组管理,它有助于提高代码的可读性、查找效率以及控制访问权限。以下是关于Java包的一些基本信息:

  1. 概念:Java 包是组织类和接口的一种机制,它可以防止命名冲突,并且有助于管理大型项目中的代码。
  2. 声明:在Java文件中,使用package关键字来声明一个包。例如,package com.example;表明该文件属于com.example这个包。
  3. 导入:要使用其他包中的类,可以使用import关键字来导入。例如,import java.util.List;表示导入了java.util包下的List类。
  4. 作用域:包的作用域决定了类和接口的可见性。默认情况下,类和接口的访问级别是包私有的,即只有相同包内的其他类可以访问。
  5. 命名规范:包的命名通常采用全小写字母,并使用点号.分隔不同的名称层级,如com.example.myapp。这种命名方式有助于避免与标准Java类库的名称冲突,并且反映了组织的域名结构。
  6. 创建包:在IDE(如IntelliJ IDEA)中,可以通过右键点击项目目录结构来创建新的包。然后,可以在新包中创建类和其他资源。
  7. 访问方法:要访问不同包中的类,可以使用类的完全限定名(包括包名和类名),或者通过import语句导入后直接使用类名。
  8. 注意事项:在设计包结构时,应该考虑到代码的逻辑分组和功能划分,以便于维护和扩展。同时,避免创建过于庞大或过于细化的包,以免造成管理上的不便。

Java 包是管理Java代码的一个重要工具,它不仅能够帮助开发者组织代码结构,还能够提供访问控制和命名空间的管理功能。在大型项目中,合理地使用包可以大大提高代码的可维护性和可读性。

 fianl 关键字

final关键字在Java中确实扮演着重要的角色,它可以用来修饰类、方法和变量,下面是对这些用途的详细介绍:

  1. 修饰类:当一个类被声明为final时,它不能被继承。这通常用于那些包含核心功能且不希望被修改的类。例如,Java中的String类就是一个final类,因为它的设计不允许更改其核心行为。
    final class FinalClass {
        // 该类不能被继承
    }
    
    // class SubFinalClass extends FinalClass { // 错误,无法继承final类
    //     // ...
    // }
  2. 修饰方法final方法不能被子类重写。这通常用于确保某些方法的行为在子类中保持一致,或者出于安全考虑,防止子类改变其行为。
    class MyClass {
        public final void printMessage() {
            System.out.println("This is a final method.");
        }
    }
    
    class SubClass extends MyClass {
        // 无法重写父类的final方法
        // public void printMessage() {
        //     System.out.println("Cannot override final method.");
        // }
    }
  3. 修饰成员变量:成员变量被声明为final后,只能被赋值一次,即它们的值在初始化后就不能再更改。这有助于确保数据的不变性,这对于创建不可变对象非常有用。
    final int MAX_VALUE = 100; // 定义一个常量,其值不能被修改
    int count = 0;
    count = MAX_VALUE; // 正确赋值
    // count = 200; // 错误赋值,会编译报错
  4. 修饰局部变量:局部变量被声明为final后,也必须在声明时或构造函数内赋值,之后不能再更改。这有助于提高代码的可读性和可维护性,因为它明确表明了变量的值在初始化后不会发生变化。
    public void myMethod() {
        final int localVar = 10; // 局部变量被声明为final
        // localVar = 20; // 错误,无法修改final变量的值
    }
  5. 修饰方法参数:当方法参数被声明为final时,它可以确保参数在方法执行期间不会被修改。这有助于避免在方法内部意外修改参数值的错误。
    public void myMethod(final int value) {
        // value = 20; // 错误,无法修改final参数的值
    }

final关键字是Java中一个重要的工具,它通过限制类的继承、方法的重写和变量的修改,帮助开发者编写更安全、更稳定的代码。在使用final关键字时,需要根据具体的需求和设计考虑来决定是否使用,以及如何使用,以确保代码的可读性和可维护性。

权限修饰符 

在Java中,权限修饰符是用来控制类、变量、方法和构造函数访问权限的一种机制。它们定义了其他类对这些成员的访问级别。Java提供了以下几种权限修饰符:

  1. public:公共的,没有访问限制。任何外部类都可以访问公共的成员。
    public class MyClass {
        public int publicVar; // 公共变量,可以在任何地方访问
    }
    
    class AnotherClass {
        MyClass obj = new MyClass();
        obj.publicVar = 10; // 可以访问公共变量
    }
  2. private:私有的,只能在其定义的类内部访问。从外部类无法直接访问私有成员,但可以通过公共方法(如getter和setter)进行访问。
    public class MyClass {
        private int privateVar; // 私有变量,只能在类内部访问
    
        public void setPrivateVar(int value) {
            privateVar = value; // 通过公共方法设置私有变量的值
        }
    
        public int getPrivateVar() {
            return privateVar; // 通过公共方法获取私有变量的值
        }
    }
    
    class AnotherClass {
        MyClass obj = new MyClass();
        // obj.privateVar = 10; // 错误,无法直接访问私有变量
        obj.setPrivateVar(10); // 通过公共方法设置私有变量的值
        int value = obj.getPrivateVar(); // 通过公共方法获取私有变量的值
    }
  3. protected:受保护的,可以在同一个包内以及子类中访问。如果试图从其他包的非子类中访问,则会出错。
    public class MyClass {
        protected int protectedVar; // 受保护的变量,可以在同一个包内以及子类中访问
    }
    
    class AnotherClass {
        MyClass obj = new MyClass();
        obj.protectedVar = 10; // 可以访问受保护变量(在同一个包内)
    }
    
    class SubClass extends MyClass {
        void accessProtectedVar() {
            protectedVar = 20; // 可以访问受保护变量(在子类中)
        }
    }
  4. 默认(无修饰符):也称为包级私有,只能在同一个包内访问。如果试图从其他包中访问,则会出错。
    package com.example;
    
    public class MyClass {
        int defaultVar; // 默认访问权限的变量,只能在同一个包内访问
    }
    
    class AnotherClass {
        MyClass obj = new MyClass();
        obj.defaultVar = 10; // 可以访问默认访问权限的变量(在同一个包内)
    }

这些修饰符可以用来控制对类、变量、方法和构造函数的访问,从而确保数据的安全性和封装性。在编写Java代码时,应根据具体需求选择适当的权限修饰符来保护成员的访问权限。

publicprotected默认private
同一类中
同一包中的类
不同包的子类
不同包中的无关类

静态代码块 

静态代码块是指在Java类中定义的静态代码块,它在类被加载时执行一次。静态代码块通常用于初始化静态变量或执行一些只需要执行一次的操作。以下是一个简单的Java静态代码块示例:

public class MyClass {
    static {
        System.out.println("This is a static block.");
    }

    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

在这个示例中,当MyClass类被加载时,静态代码块会被执行一次,输出"This is a static block."。然后,程序进入main方法,输出"Hello, World!"。

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

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

相关文章

斜率优化dp 笔记

任务安排1 有 N 个任务排成一个序列在一台机器上等待执行,它们的顺序不得改变。 机器会把这 N 个任务分成若干批,每一批包含连续的若干个任务。 从时刻 00 开始,任务被分批加工,执行第 i 个任务所需的时间是 Ti。 另外&#x…

PHP开发全新29网课交单平台源码修复全开源版本,支持聚合登陆易支付

这是一套最新版本的PHP开发的网课交单平台源代码,已进行全开源修复,支持聚合登录和易支付功能。 项目 地 址 : runruncode.com/php/19721.html 以下是对该套代码的主要更新和修复: 1. 移除了论文编辑功能。 2. 移除了强国接码…

linux之进程

一、背景 冯.诺依曼体系结构 输入设备键盘、鼠标、摄像头、话筒、磁盘、网卡...输出设备显示器、声卡、磁盘、网卡...CPU运算器、控制器存储器一般就是内存 数据在计算机的体系结构进行流动,流动过程中,进行数据的加工处理,从一个设备到另一…

网上兼职赚钱攻略:六种方式让你轻松上手

在互联网时代,网上兼职已经成为一种非常流行的赚钱方式。对于许多想要在家里挣钱的人来说,网上兼职不仅可以提供灵活的工作时间,还可以让他们在自己的兴趣领域中寻求机会,实现自己的财务自由。 在这里,我将为您介绍六…

OpenGL 实现“人像背景虚化“效果

手机上的人像模式,也被人们称作“背景虚化”或 ”双摄虚化“ 模式,也称为 Bokeh 模式,能够在保持画面中指定的人或物体清晰的同时,将其他的背景模糊掉。突出画面的主体部分,主观上美感更强烈。 人像模式的一般实现原理是,利用双摄系统获取景深信息,并通过深度传感器和图…

带流量主功能的外卖菜谱小程序源码:助你轻松领取优惠券,个人使用也可通过审查

外卖菜谱小程序源码-带流量主功能-外卖领劵个人也可过审 这套小程序优点就带很多菜谱,各种你爱吃菜的做法与各类食材介绍营养搭配,相信很多小姐姐会感兴趣。 宝妈宝爸这个小程序肯定能留的住这个群体的人脉流量,这是小程序最大的亮点&#…

深圳区块链交易所app系统开发,撮合交易系统开发

随着区块链技术的迅速发展和数字资产市场的蓬勃发展,区块链交易所成为了数字资产交易的核心场所之一。在这个快速发展的领域中,区块链交易所App系统的开发和撮合交易系统的建设至关重要。本文将探讨区块链交易所App系统开发及撮合交易系统的重要性&#…

【QGIS从shp文件中筛选目标区域导出为shp】

文章目录 1、写在前面2、QGIS将shp文件中目标区域输出为shp2.1、手动点选2.2、高级过滤 3、上述shp完成后,配合python的shp文件,即可凸显研究区域了 1、写在前面 利用shp文件制作研究区域mask,Matlab版本,请点击 Matlab利用shp文…

【Leetcode】单链表常见题

🔥个人主页:Quitecoder 🔥专栏:Leetcode刷题 本节内容我们来讲解常见的几道单链表的题型,文末会赋上单链表增删查,初始化等代码 目录 1.移除链表元素2.链表的中间节点3.返回倒数第K个节点:4.环…

【Java - 框架 - Lombok】(1) 普通Java项目通过Lombok+Logback完成日志的创建使用 - 快速上手

普通Java项目通过"Lombok""Logback"完成日志的创建使用 - 快速上手&#xff1b; 步骤A 说明 创建"Maven"项目&#xff1b; 图片 步骤B 说明 添加相关依赖项&#xff1b; 图片 代码 <!-- "Lombok"依赖项--> <dependency>&…

C语言--动态内存管理

为什么存在动态内存管理&#xff1f; 在之前我们讲到的类型创建的变量再空间开辟好之后就不能再改变了&#xff0c;但是有时候我们希望能够自由地为某个变量分配空间&#xff0c;就比如上一篇文章中的通讯录&#xff0c;在没有动态内存管理情况下&#xff0c;我们就只能为通讯…

18.字面量

文章目录 一、字面量二、区分技巧三、扩展&#xff1a; /t 制表符 一、字面量 在有些资料&#xff0c;会把字面量说成常量、字面值常量&#xff0c;这种叫法都不是很正确&#xff0c;最正确的叫法还是叫做&#xff1a;字面量。 作用&#xff1a;告诉程序员&#xff0c;数据在…

地物波谱库共享网站汇总

ENVI自5.2版本重新梳理了原有的标准波谱库&#xff0c;新增一些物质波谱&#xff0c;在ENVI5.6中存放在…\Harris\ENVI56\ resource\speclib&#xff0c;分别存放在四个文件夹中&#xff0c;储存为ENVI波谱库格式&#xff0c;有两个文件组成&#xff1a;.sli和.hdr。 ENVI保留…

小米还涉足了哪些领域

小米作为一家全球性的移动互联网企业&#xff0c;其业务领域相当广泛&#xff0c;除了核心的智能手机业务外&#xff0c;还涉足了许多其他领域。以下是对小米涉足领域的简要介绍&#xff1a; 智能硬件与IoT平台&#xff1a;小米是全球领先的智能硬件和IoT平台公司&#xff0c;致…

linux:线程同步

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言线程同步条件变量接口简单示例pthread_cond_wait为什么要有mutex伪唤醒问题的解决 (if->while) 总结 前言 本文作为我对于线程同步知识总结 线程同步 同步&…

资讯头条P3自媒体搭建

自媒体素材管理与文章管理 一.后台搭建 1.1 搭建自媒体网关 导入网关模块>>>在网关模块的pom.xml文件中添加该子模块>>>刷新maven <modules><module>heima-leadnews-app-gateway</module><!--新增--><module>heima-leadnew…

Aurora插件安装

介绍 Latext是一种基于TEX的排版系统。 CTeX中文套装是基于Windows下的MiKTeX系统&#xff0c;集成了编辑器WinEdt和PostScrip处理软件Ghostscript和GSview等主要工具。CTeX中文套装在MikTeX的基础上增加了对中文的完整支持。 CTeX&#xff1a; CTeX套装 - CTEX 下载安装 然后…

【Java程序设计】【C00345】基于Springboot的船舶监造管理系统(有论文)

基于Springboot的船舶监造管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 项目获取 &#x1f345;文末点击卡片获取源码&#x1f345; 开发环境 运行环境&#xff1a;推荐jdk1.8&#xff1b; 开发工具&#xff1a;eclipse以及i…

Day50:WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒

目录 文件包含-原理&分类&利用&修复 文件读取 文件写入 代码执行 远程利用思路 黑盒利用-VULWEB 白盒利用-CTFSHOW-伪协议玩法 78-php&http协议 79-data&http协议 80-81-日志包含 87-php://filter/write&加密编码 88-data&base64协议 …

韩顺平Java | C21网络编程

1 网络的相关概念 ip地址的组成&#xff1a;网络地址 主机地址 A类&#xff1a;0 ~ 2^7-1 0 ~ 127 B类&#xff1a;128 ~ 1282^6-1 128 ~ 191 C类&#xff1a;192 ~ 1922^5-1 192 ~ 223 D类&#xff1a;224 ~ 2242^4-1 224 ~ 239 E类&#xff1a;240 ~ 2402^3-1 240 ~ 2…
最新文章