Java基础:面向对象编程5

1 Java内部类

1.1 概念

在 Java 中,内部类是指定义在另一个类内部或方法内部的类。内部类可以分为以下几种类型:

  1. 成员内部类
  2. 局部内部类
  3. 匿名内部类
  4. 静态内部类

1.2 成员内部类

  • 定义:成员内部类是最常见的内部类,它定义在外部类的成员位置。
  • 访问权限:成员内部类可以无限制地访问外部类的所有成员属性,包括私有成员。
  • 创建对象:外部类需要先创建一个成员内部类的对象,才能访问内部类的成员。
  • 示例
    class Outer {private int outerVar = 10;class Inner {void display() {System.out.println("Outer variable: " + outerVar);}}
    }public class Main {public static void main(String[] args) {Outer outer = new Outer();Outer.Inner inner = outer.new Inner();inner.display();}
    }
    

1.3 局部内部类

  • 定义:局部内部类定义在一个方法或作用域内,其生命周期仅限于该作用域。
  • 访问权限:局部内部类不能被权限修饰符(如 publicprotectedprivatestatic)修饰。
  • 示例
    class Outer {void method() {class LocalInner {void display() {System.out.println("Local Inner Class");}}LocalInner localInner = new LocalInner();localInner.display();}
    }public class Main {public static void main(String[] args) {Outer outer = new Outer();outer.method();}
    }
    

1.4 匿名内部类

  • 定义:匿名内部类是没有名字的内部类,通常用于实现接口或继承类,并且只使用一次。
  • 特点
    • 匿名内部类没有构造方法。
    • 匿名内部类的名字由系统自动生成。
    • 通常用于启动多线程或事件处理。
  • 示例
    interface Greeting {void greet();
    }public class Main {public static void main(String[] args) {Greeting greeting = new Greeting() {@Overridepublic void greet() {System.out.println("Hello, Anonymous Inner Class!");}};greeting.greet();}
    }
    

1.5 静态内部类

  • 定义:静态内部类与成员内部类类似,但使用 static 关键字修饰。
  • 访问权限:静态内部类不能访问外部类的非静态成员。
  • 示例
    class Outer {static class StaticInner {void display() {System.out.println("Static Inner Class");}}
    }public class Main {public static void main(String[] args) {Outer.StaticInner staticInner = new Outer.StaticInner();staticInner.display();}
    }
    

1.6 使用内部类的原因

  • 继承独立性:每个内部类可以独立地继承一个接口的实现,无论外部类是否已经继承了某个接口的实现。
  • 特性
    1. 内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
    2. 在单个外部类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类。
    3. 创建内部类对象的时刻并不依赖于外部类对象的创建。
    4. 内部类并没有令人迷惑的“is-a”关系,它就是一个独立的实体。
    5. 内部类提供了更好的封装,除了该外围类,其他类不能访问。

通过使用内部类,可以更好地组织代码,提高代码的可读性和可维护性。

2 Java封装、继承、多态

2.1 引入

Java 面向对象编程的三大特征是封装、继承和多态。这三大特征紧密联系,合理使用这些特征可以大大减少重复代码,提高代码的复用性和可维护性。

2.2 封装

  • 概念:封装是指将数据和基于数据的操作封装在一起,形成一个不可分割的独立实体。数据被保护在类的内部,只保留一些对外接口与外部进行交互。
  • 好处
    1. 减少耦合。
    2. 类内部的结构可以自由修改。
    3. 可以对成员进行更精确的控制。
    4. 隐藏信息,实现细节。
  • 示例
    class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
    }
    

2.3 继承

  • 概念:继承是面向对象编程中的一个概念,允许子类继承父类的属性和方法,从而复用代码。
  • 分类
    1. 单继承:一个子类只有一个父类。
    2. 多继承:Java 不支持多继承,但可以通过实现接口达到类似效果。
  • 实现
    • extends 关键字
      class Animal {void sayHello() {System.out.println("Hello from Animal");}
      }class Dog extends Animal {
      }public class Main {public static void main(String[] args) {Dog dog = new Dog();dog.sayHello(); // 输出 "Hello from Animal"}
      }
      
    • implements 关键字
      interface DoA {void sayHello();
      }interface DoB {void eat();
      }class Cat implements DoA, DoB {@Overridepublic void sayHello() {System.out.println("Hello from Cat");}@Overridepublic void eat() {System.out.println("Cat is eating");}
      }public class Main {public static void main(String[] args) {Cat cat = new Cat();cat.sayHello(); // 输出 "Hello from Cat"cat.eat(); // 输出 "Cat is eating"}
      }
      
  • 特点
    • this 和 super 关键字

      • this 表示当前对象的引用。

        this.属性 // 调用成员变量,要区别成员变量和局部变量
        this.() // 调用本类的某个方法
        this() // 表示调用本类构造方法
        
      • super 表示父类对象的引用。

        super.属性 // 表示父类对象中的成员变量
        super.方法() // 表示父类对象中定义的方法
        super() // 表示调用父类构造方法
        
    • 构造方法

      • 父类的构造方法不能被继承
      • 子类构造方法必须调用父类构造方法。
      • 如果子类构造方法中没有显式调用父类构造方法,系统默认调用父类无参构造方法。
    • 方法重写(Override)

      • 子类重写父类方法,方法名、参数列表和返回值类型必须相同。
    • 方法重载(Overload)

      • 方法名相同,参数列表不同。
  • 修饰符
    • 访问修饰符:子类重写的方法不能降低访问权限。
    • 非访问修饰符
      • static:静态变量和方法。
      • final:最终变量、方法和类。
      • abstract:抽象类和方法。

2.4 多态

  • 概念:多态是指同一个类的对象在不同情况下表现出的不同行为和状态。
  • 前提条件
    1. 子类继承父类。
    2. 子类重写父类的方法。
    3. 父类引用指向子类对象。
  • 示例
    class Animal {void makeSound() {System.out.println("Animal sound");}
    }class Dog extends Animal {@Overridevoid makeSound() {System.out.println("Woof");}
    }public class Main {public static void main(String[] args) {Animal animal = new Dog();animal.makeSound(); // 输出 "Woof"}
    }
    
  • 多态与后期绑定
    • 在运行时根据对象的类型进行方法调用。
  • 多态与构造方法
    • 在构造方法中调用多态方法时,可能会出现意外结果。
  • 多态与向下转型
    • 向下转型可能抛出 ClassCastException,需要谨慎使用。

2.5 小结

封装:是对类的封装,封装是对类的属性和方法进行封装,只对外暴露方法而不暴露具体使用细节,所以我们一般设计类成员变量时候大多设为私有而通过一些 get、set 方法去读写。
继承:子类继承父类,即“子承父业”,子类拥有父类除私有的所有属性和方法,自己还能在此基础上拓展自己新的属性和方法。主要目的是复用代码。
多态:多态是同一个行为具有多个不同表现形式或形态的能力。即一个父类可能有若干子类,各子类实现父类方法有多种多样,调用父类方法时,父类引用变量指向不同子类实例而执行不同方法,这就是所谓父类方法是多态的

3 思维导图

在这里插入图片描述在这里插入图片描述

4 参考链接

  1. 聊聊Java内部类:成员内部类、局部内部类、匿名内部类、静态内部类
  2. 深入理解Java三大特性:封装、继承和多态

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

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

相关文章

深度解析 Redis 存储结构及其高效性背后的机制

目录 1. Redis 存储结构存储结构存储转换 2. 字典实现数据结构冲突处理负载因子 3. 扩容扩容步骤影响与优化 4. 缩容缩容步骤优化策略 5. 渐进式 Rehash**渐进式 Rehash 的工作原理**Rehash 规则优势 6. SCAN 命令SCAN 的实现原理遍历顺序避免重复和遗漏使用场景 7. 过期&#…

电子商务网站维护技巧:保持WordPress、主题和插件的更新

在这个快节奏的数字时代,维护一个电子商务网站的首要任务之一是保持WordPress、主题和插件的最新状态。过时的软件不仅可能导致功能故障,还可能带来安全风险。本文将深入探讨如何有效地更新和维护您的WordPress网站,以确保其安全性和性能。 …

工业物联网关-ModbusTCP

Modbus-TCP模式把网关视作Modbus从端设备,主端设备可以通过Modbus-TCP协议访问网关上所有终端设备。用户可以自定义多条通道,每条通道可以配置为TCP Server或者TCP Slave。注意,该模式需要指定采集通道,采集通道可以是串口和网口通…

简述微服务高可用之Sentinel、Seate

简述微服务高可用之Sentinel、Seate使用 下文主要讲述使用sentinel,如何降级限流熔断及如何使用seata管理分布式事务 sentinel服务端安装与使用 1、下载 进入https://github.com/alibaba/Sentinel/releases 根据你的需求进行下载对应版本 我这里是JDK17 下载的1.8.8版本&am…

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…

【C#】WPF MVVM 简单示例代码

1. 目录结构 2. 代码 2.1 DelegateCommand.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace MVVSSample.Commands {class DelegateCommand : ICommand{publ…

信息安全工程师(52)网络安全审计系统组成与类型

前言 网络安全审计系统是一种用于监控、分析和报告网络环境中安全事件的系统。其组成与类型均体现了对网络安全性的全面考虑和细致划分。 一、网络安全审计系统的组成 网络安全审计系统一般由以下几个关键部分组成&#xff1a; 审计数据采集系统&#xff1a;负责采集被审计系统…

shell案例之一键部署kafka

Shell案例之一键部署kafka 一、案例问题 &#xff08;1&#xff09;Kafka是用Java编写的&#xff0c;需要配置jdk环境变量 &#xff08;2&#xff09;Kafka配置文件数目多 &#xff08;3&#xff09;命令安装繁琐 二、案例分析&#xff1a; &#xff08;1&#xff09;检查…

elementUI,设置日期,只能选择过去的和今天的日期

在 el-date-picker 组件中加&#xff1a;:picker-options"pickerOptions" <el-form-item label"票据生成日期&#xff1a;"> <el-date-picker v-model"date1" type"daterange" range-separator"至" value-format&…

chatgpt搭建大模型技术知识解读与总结

搭建大型语言模型&#xff08;如ChatGPT&#xff09;的技术知识涉及多个领域&#xff0c;包括机器学习、自然语言处理&#xff08;NLP&#xff09;、深度学习、数据处理等。下面是一些关键概念和步骤的总结&#xff1a; ### 1. **基础知识** #### a. **自然语言处理 (NLP)** …

基于Qt/QChart实现折线图和散点图的绘制示例程序解析

1. 项目简介 本文讲解的是一个基于Qt框架的QChart模块实现的折线图与散点图结合的绘制程序。程序通过自定义类LineChartWithGradient实现折线图、散点图以及带有渐变填充的区域图&#xff0c;最终形成一个美观的数据可视化效果。 2. 类构造函数 LineChartWithGradient::LineC…

天锐绿盾VS Ping32数据安全新选择,用户体验分享

随着网络威胁日益严重&#xff0c;如何保护个人和企业的网络安全成为了一个迫在眉睫的问题。天锐绿盾和Ping32作为市场上两款备受欢迎的网络安全软件&#xff0c;各自拥有独特的特点和功能。本文将对这两款软件进行深入的使用体验分享&#xff0c;帮助用户做出最佳选择。 防护性…

Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)

文章目录 写在前面一、Docker 官方源二、更换Docker 国内可用镜像源 &#xff08;推荐使用&#xff09;参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;docker-27.3.1 一、Docker 官方源 打开 /etc/docker/daemon.json文件&#xff1a; sudo gedit …

3.Three.js程序基本框架结构和API说明

Three.js程序基本框架结构和API说明 1.基本框架结构代码 一个基本的Three.js程序&#xff0c;基本都需要设置场景、渲染器、相机、灯光等等通用操作&#xff0c;因而我们可以把Three.js基本程序框架进行整理&#xff0c;如下。其中&#xff0c;我们可以用Three.js提供的Orbit…

JAVA 中的克隆对象

克隆对象就是复制一个一模一样的对象&#xff0c;但是复制出来的对象和原对象不是同一个对象&#xff0c;是两个对象&#xff0c;只不过复制过来的对象和原对象除了内存地址之外&#xff0c;其它的属性一模一样。 在超类 Object 中有一个 clone() 方法&#xff1a; protected…

NC 单据模板自定义项 设置参照(自定义参照)

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 如图下图&#xff0c;NC 单据模板自定义项 设置参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#xff0c;即bd…

Ubuntu-Ubuntu22.04下Anacodna3的qmake和Qt的qmake冲突问题

Ubuntu22.04下Anacodna3的qmake和Qt的qmake冲突问题 一、问题描述二、原因分析三、解决办法 一、问题描述 Ubuntu22.04下Anacodna3的qmake和Qt的qmake冲突问题 zhyzhy-HP:~/Sources/mpv-examples/libmpv/qt$ make g -c -pipe -g -Wall -Wextra -D_REENTRANT -fPIC -DQT_WIDGET…

python 基础笔记(其实有点内容的)

print(math.gamma(n)) # 求 (n-1) 的阶乘 数值, 数值计算 format(50, “b”) bin(50)[2:]&#xff0c; 这个“b” 就代表的是 binary format(14, ‘b’) ------> ‘1110’ 去除 0b 去掉前导零 str(000001) # 只适合python2.x ‘1’ “00000001”.lstrip(“0”) # python3…

图论day62|拓扑排序理论基础、117.软件构建(卡码网)、最短路径之dijkstra理论基、47.参加科学大会(卡码网 第六期模拟笔试)

图论day62|拓扑排序理论基础、117.软件构建&#xff08;卡码网&#xff09;、最短路径之dijkstra理论基、47.参加科学大会&#xff08;卡码网 第六期模拟笔试&#xff09; 拓扑排序理论基础117.软件构建&#xff08;卡码网&#xff09;最短路径之dijkstra理论基础47.参加科学大…

AI控制工业机器人入门教程

简介 AI控制的工业机器人正在改变现代制造业的面貌。与传统的编程控制不同&#xff0c;AI使机器人能够通过感知环境、自主决策和学习不断优化自身的操作。这篇教程将介绍实现AI控制工业机器人的必要知识和技能&#xff0c;帮助读者从基础开始构建起AI控制机器人的理解和能力。…