JAVA基础知识4(static、继承)

JAVA基础知识4

  • static
      • 静态成员变量
      • 静态成员方法
      • 解释
      • 注意点
  • 继承
      • 父类(基类或超类)
      • 子类(派生类)
      • 使用继承的示例
      • 解释
      • 运行结果
    • 成员变量的访问特点
    • 成员方法的访问特点
    • 构造方法的访问特点
  • Java项目,包和类之间的联系
      • 包的概念
      • 包的声明
      • 类和包的关系
      • 包和类的示例
      • 使用包的优点
      • 导入包中的类
      • 完整示例

static

在这里插入图片描述

在 Java 中,static 关键字可以用来修饰成员方法和成员变量。以下是它们的用法和需要注意的点。

静态成员变量

静态成员变量(也叫类变量)是属于类的,而不是属于类的实例。它们在类的所有实例之间共享。

public class Students {private int id;private String name;private int age;private static int studentCount = 0; // 静态成员变量public Students(int id, String name, int age) {this.id = id;this.name = name;this.age = age;studentCount++; // 每创建一个实例,studentCount 增加}// Getter 和 Setter 方法public int getId() {return id;}public void setId(int id) {this.id = id;}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;}public static int getStudentCount() {return studentCount; // 静态方法可以访问静态变量}@Overridepublic String toString() {return "Students{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

静态成员方法

静态成员方法是属于类的,而不是属于类的实例。它们可以直接通过类名调用,而不需要创建类的实例。静态方法只能访问静态变量和调用其他静态方法。

import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<Students> list = new ArrayList<>();list.add(new Students(1, "玛丽", 18));list.add(new Students(2, "迪丽热巴", 35));list.add(new Students(3, "赵丽颖", 18));printStudent(list, 1);// 打印学生总数System.out.println("学生总数: " + Students.getStudentCount());}public static void printStudent(ArrayList<Students> list, int index) {System.out.println("学生的id\t学生的名字\t学生的年纪");System.out.println(list.get(index).getId() + "\t" + list.get(index).getName() + "\t" + list.get(index).getAge());}
}

解释

  1. 静态成员变量

    • private static int studentCount = 0; 是一个静态成员变量,用来统计创建的 Students 对象的数量。
    • studentCount 在类的所有实例之间共享,每创建一个新的 Students 对象,它都会增加。
  2. 静态成员方法

    • public static int getStudentCount() 是一个静态方法,用来获取 studentCount 的值。
    • 静态方法可以直接通过类名调用,例如:Students.getStudentCount()
  3. 静态方法中的调用

    • main 方法中,通过 printStudent(list, 1); 调用静态方法 printStudent 打印 list 中索引为 1Students 对象的信息。
    • 通过 Students.getStudentCount() 获取学生总数,并打印出来。

注意点

  • 静态成员变量和静态成员方法是属于类的,而不是属于类的实例。
  • 静态方法只能访问静态变量和调用其他静态方法,不能直接访问非静态变量或调用非静态方法。
  • 静态方法通常用于工具类方法或与特定实例无关的操作。
    在这里插入图片描述

继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
继承是面向对象编程中的一个重要概念,它允许一个类(子类)从另一个类(父类)继承属性和方法,从而实现代码重用和扩展。以下是一个简单的示例,展示如何在 Java 中实现继承。

父类(基类或超类)

public class Animal {private String name;private int age;public Animal(String name, int age) {this.name = name;this.age = age;}public void makeSound() {System.out.println("Some generic animal sound");}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;}@Overridepublic String toString() {return "Animal{" +"name='" + name + '\'' +", age=" + age +'}';}
}

子类(派生类)

子类 Dog 继承了父类 Animal,并可以添加自己的属性和方法。

public class Dog extends Animal {private String breed;public Dog(String name, int age, String breed) {super(name, age); // 调用父类的构造函数this.breed = breed;}@Overridepublic void makeSound() {System.out.println("Woof! Woof!");}public String getBreed() {return breed;}public void setBreed(String breed) {this.breed = breed;}@Overridepublic String toString() {return "Dog{" +"name='" + getName() + '\'' +", age=" + getAge() +", breed='" + breed + '\'' +'}';}
}

使用继承的示例

public class Main {public static void main(String[] args) {Animal genericAnimal = new Animal("Generic Animal", 5);System.out.println(genericAnimal);genericAnimal.makeSound();Dog dog = new Dog("Buddy", 3, "Golden Retriever");System.out.println(dog);dog.makeSound();}
}

解释

  1. 父类 Animal

    • 包含属性 nameage,以及方法 makeSoundgetNamesetNamegetAgesetAgetoString
    • makeSound 方法在父类中提供了一个通用的实现。
  2. 子类 Dog

    • 继承了 Animal 类的所有属性和方法。
    • 添加了新的属性 breed,以及相应的 gettersetter 方法。
    • 重写了 makeSound 方法,为 Dog 类提供特定的实现。
    • 使用 super(name, age) 调用了父类的构造函数。
  3. Main

    • 创建了一个 Animal 对象和一个 Dog 对象,分别调用它们的 toStringmakeSound 方法,展示继承和方法重写的效果。

运行结果

Animal{name='Generic Animal', age=5}
Some generic animal sound
Dog{name='Buddy', age=3, breed='Golden Retriever'}
Woof! Woof!

通过这个示例,你可以看到继承如何在子类中复用父类的代码,同时通过方法重写实现特定行为。
在这里插入图片描述
在 Java 中,子类确实无法直接访问父类中的私有成员变量。但是,子类可以通过父类提供的公共方法(如 getter 和 setter 方法)间接访问和操作这些私有成员变量。在我们的例子中,子类 Dog 并没有直接访问父类 Animal 的私有成员变量 name 和 age,而是通过父类提供的公共方法(getName 和 getAge)来获取这些值。
解释
父类 Animal:
name 和 age 是私有成员变量,无法被子类直接访问。
提供了 getName、setName、getAge 和 setAge 等公共方法,允许子类通过这些方法间接访问和修改私有成员变量。
子类 Dog:
子类 Dog 没有直接访问父类 Animal 的私有成员变量 name 和 age。
在子类 Dog 的 toString 方法中,调用了 getName 和 getAge 方法来获取父类的私有成员变量值。
总结
私有成员变量:子类无法直接访问父类的私有成员变量。
公共方法:子类可以通过父类提供的公共方法(getter 和 setter)来访问和操作父类的私有成员变量。
构造方法不能被继承。
封装性:私有成员变量的设计是为了保持封装性,确保数据只能通过受控的方式访问和修改。

描写继承结构

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

成员变量的访问特点

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

成员方法的访问特点

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

构造方法的访问特点

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

Java项目,包和类之间的联系

在 Java 中,包和类之间有着密切的联系。包(package)用于组织类和接口,以避免命名冲突,并提供访问控制。以下是包和类之间关系的详细解释:

包的概念

  • 是一组相关类和接口的集合。它们在逻辑上是相关的,可以在同一个包中进行分组。
  • 包名通常是由小写字母组成的,以避免与类名发生冲突。
  • 包可以嵌套,也就是说一个包可以包含多个子包。

包的声明

每个 Java 文件都可以选择性地包含一个包声明。包声明必须是文件的第一条语句(除非存在注释)。例如:

package com.example.myapp;

类和包的关系

  1. 类的组织

    • 类可以被组织到包中,通过包名来区分不同的类。
    • 使用包可以避免类名冲突。例如,两个不同的开发者可以在不同的包中创建名称相同的类。
  2. 包的层次结构

    • 包可以有层次结构,例如 com.example.myapp 表示 com 包下的 example 子包,再下是 myapp 子包。
    • 这种层次结构使得类的组织更有条理,便于管理和维护。
  3. 访问控制

    • 包还提供了访问控制功能。例如,默认(包级)访问权限允许同一个包中的类相互访问,但不允许不同包中的类访问。
    • 通过使用 publicprotectedprivate 关键字,可以进一步控制类和类成员的访问权限。

包和类的示例

假设我们有一个包 com.example.myapp,并在其中创建几个类。

// 文件:src/com/example/myapp/Main.java
package com.example.myapp;public class Main {public static void main(String[] args) {User user = new User("Alice", 30);System.out.println(user);}
}// 文件:src/com/example/myapp/User.java
package com.example.myapp;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

使用包的优点

  1. 命名冲突的避免:通过包名可以有效避免命名冲突。
  2. 代码的组织和管理:包有助于逻辑上组织代码,使项目更易于管理和维护。
  3. 访问控制:包提供了一种机制来控制类的访问权限,增强了代码的安全性。

导入包中的类

为了在一个类中使用另一个包中的类,必须使用 import 语句导入该类。例如:

import com.example.myapp.User;public class Test {public static void main(String[] args) {User user = new User("Bob", 25);System.out.println(user);}
}

完整示例

假设我们有一个 Java 项目,目录结构如下:

src/
├── com/
│   └── example/
│       └── myapp/
│           ├── Main.java
│           └── User.java

Main.java 文件内容:

package com.example.myapp;public class Main {public static void main(String[] args) {User user = new User("Alice", 30);System.out.println(user);}
}

User.java 文件内容:

package com.example.myapp;public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}

在这个示例中,我们通过包 com.example.myapp 来组织 MainUser 两个类。Main 类使用了 User 类,展示了包和类之间的联系。

希望这些解释能帮助你理解包和类之间的关系。如果有任何问题,请随时告诉我!

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

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

相关文章

vue elementui 在table里使用el-switch

<el-table-columnprop"operationStatus"label"状态"header-align"center"align"center"><template slot-scope"scope"><el-switch active-value"ENABLE" inactive-value"DISABLE" v-mod…

使用框架构建React Native应用程序的最佳实践

在React Conf上&#xff0c;我们更新了关于开始构建React Native应用程序的最佳工具的指导&#xff1a;一个React Native框架——一个包含所有必要API的工具箱&#xff0c;让您能够构建生产就绪的应用程序。 现在推荐使用React Native框架&#xff08;如Expo&#xff09;来创建…

Spring 依赖注入02

文章目录 1. 核心概念2. 依赖注入的方式3. 构造函数注入3.1 构造函数注入的优点包括&#xff1a; 4. 设值注入4.1 设值注入的特点和优点4.2 使用设值注入的注意事项 5. 接口注入5.1 接口注入的基本概念&#xff1a;5.2 使用接口注入的注意事项&#xff1a; 依赖注入&#xff08…

代码随想录day23 ||39组合总和1 40组合总和2 131分割回文串

39组合总和1 力扣题目链接 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…

【C语言】两个数组比较详解

目录 C语言中两个数组比较详解1. 逐元素比较1.1 示例代码1.2 输出结果1.3 分析 2. 内置函数的使用2.1 示例代码2.2 输出结果2.3 分析 3. 在嵌入式系统中的应用3.1 示例代码3.2 输出结果3.3 分析 4. 拓展技巧4.1 使用指针优化比较4.2 输出结果4.3 分析 5. 表格总结6. 结论7. 结束…

高级及架构师高频应用型面试题

一、微服务多节点批量应该怎么设计&#xff1f; 1、异步任务分类&#xff1a; 周期性定时任务调度任务批量任务 2、需要考虑并解决的问题&#xff1a; 2.1、避免同一任务同时被多个节点捞取。 1&#xff09;数据库的行级锁 2&#xff09;redis分布式锁 3&#xff09;quartz…

后端面试题日常练-day06 【Java基础】

题目 希望这些选择题能够帮助您进行后端面试的准备&#xff0c;答案在文末 在Java中&#xff0c;以下哪个关键字用于表示类之间的关联性&#xff0c;表明一个类包含另一个类的对象&#xff1f; a) include b) contain c) reference d) composition Java中的方法重写&#xff…

Python写UI自动化--playwright(通过UI文本匹配实现定位)

本篇简单拓展一下元素定位技巧&#xff0c;通过UI界面的文本去实现定位 目录 匹配XPath 匹配文本元素 .count()统计匹配数量 处理匹配文本返回多个元素 1、使用.nth(index)选择特定元素: 2、获取所有匹配的元素并遍历: 3、错误处理: 匹配XPath 比如我们要定位到下图的…

C++笔试强训8

文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 根据下面的定义故选A。 函数重载:在相同作用域中&#xff0c;函数名字相同&#xff0c;参数列表不同的一系列函数称为函数重载参数列表不同具体的体现:参数个数不同参数类型不同类型的次序不同注意:…

单元测试--Junit

Junit是Java的单元测试框架提供了一些注解方便我们进行单元测试 1. 常用注解 常用注解&#xff1a; TestBeforeAll&#xff0c;AfterAllBeforeEach&#xff0c;AfterEach 使用这些注解需要先引入依赖&#xff1a; <dependency><groupId>org.junit.jupiter<…

6 C 语言指针的奥秘:理论与实践详解

目录 1 变量访问机制 1.1 内存地址 1.2 变量的直接访问 1.3 变量的间接访问 2 指针变量及其内存大小 2.1 指针与指针变量 2.2 指针变量的定义格式 2.3 指针变量的内存大小 3 取地址操作符与取值操作符 3.1 取地址操作符 & 3.2 取值操作符 * 3.3 解引用与数据类…

Xcode是什么?它在iOS开发中的作用和功能有哪些?

Xcode是苹果公司为macOS平台开发的一款集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;&#xff0c;它主要用于开发iOS、iPadOS、macOS、watchOS和tvOS的应用程序。Xcode集成了从编写代码、界面设计、调试程序、版本控制到应用发布…

【数据结构】顺序表(杨辉三角、简单的洗牌算法)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 欢迎志同道合的朋友一起加油喔 &#x1f4aa;&#x1f4aa;&#x1f4aa; 谢谢你这么帅…

pandas.core.series.Series 转json

在Python中&#xff0c;可以使用Pandas库中的Series.to_json()方法将Series对象转换为JSON格式的字符串。以下是一个简单的例子&#xff1a; import pandas as pd# 创建一个Pandas Seriess pd.Series({a: 1, b: 2, c: 3})# 转换为JSON字符串json_str s.to_json(orientrecords…

Android SurfaceFlinger——通知消费流程(三十五)

上一篇文章介绍了 onFrameAvailable() 函数的流程&#xff0c;最终回调到了 BLASTBufferQueue 中&#xff0c;这里测处理跟 Android 老版本还是有区别的&#xff0c;在 BLASTBufferQueue 中通过提交事务的方式通知 SurfaceFlinger 进行更新&#xff0c;而不是老版本中的直接调用…

学习React(描述 UI)

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件。在本章…

netty应用-手写RPC

文章目录 手写RPC之案例定位与通信过程介绍RPC框架案例定位服务端与客户端架构通信过程1. 服务注册与发现2. 请求序列化与传输3. 请求处理与响应4. 响应反序列化与结果处理实现细节1. 服务端2. 客户端技术选型关键挑战总结手写RPC之请求响应通信协议定制协议结构示例消息头格式…

GO集成方式、Java文字识别接口集成方法

我们现在经常使用到的那些软件、APP、微信小程序产品来说&#xff0c;在注册的时候需要手动填写一些证件信息的时候已经可以通过上传证件照片自动填写信息了&#xff0c;这就是OCR API的功劳&#xff0c;接入翔云OCR API的系统可以自动识别用户上传的证件信息并填写到相应的栏目…

优化医疗数据管理:Kettle ETL 数据采集方案详解

在现代医疗保健领域&#xff0c;数据的准确性、完整性和及时性对于提高医疗服务质量和患者护理至关重要。为了有效管理和利用医疗数据&#xff0c;Kettle ETL&#xff08;Extract, Transform, Load&#xff09;数据采集方案成为了许多医疗机构的首选工具之一。本文将深入探讨Ke…

【基础算法总结】队列 + 宽搜(BFS)

队列 宽搜BFS 1.N 叉树的层序遍历2.二叉树的锯齿形层序遍历3.二叉树最大宽度4.在每个树行中找最大值 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#…