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

news2024/9/24 21:29:28

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; // 静态方法可以访问静态变量
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public void makeSound() {
        System.out.println("Woof! Woof!");
    }

    public String getBreed() {
        return breed;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

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

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

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

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

相关文章

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

[代码审计]记一次简单的java代码审计

如果觉得该文章有帮助的&#xff0c;麻烦师傅们可以搜索下微信公众号&#xff1a;良月安全。点个关注&#xff0c;感谢师傅们的支持。 免责声明 本博客所发布的所有内容&#xff0c;包括但不限于信息、工具、项目以及文章&#xff0c;均旨在提供学习与研究之用。所有工具安全…

《代码大全》读书笔记-第Ⅰ部分 奠定基础

0.欢迎来到软件构建世界 什么是软件构件&#xff1a; 对于非正式及项目&#xff0c;会觉得罗列出来的这些活动太过于繁复。但是这些对于正式项目都是很有必要的(大部分人都没经历过&#xff0c;比如说我)。一般一些小公司主要也就是需求分析、编码、开发人员自测、集成测试这几…

数据库第五次作业

1. 触发器 建立触发器&#xff0c;订单表中增加订单数量后&#xff0c;商品表商品数量同步减少对应的商品订单出数量,并测试 建立触发器&#xff0c;实现功能:客户取消订单&#xff0c;恢复商品表对应商品的数量 建立触发器&#xff0c;实现功能:客户修改订单&#xff0c;商品…

步入新时代,使用区块链服务API打造创新应用

随着区块链技术的兴起&#xff0c;我们正步入一个全新的数据时代——一个由透明性、安全性和去中心化定义的时代。Blockchain公司的区块链API&#xff0c;作为连接现实世界与区块链世界的桥梁&#xff0c;为全球开发者和企业提供了一种前所未有的方式&#xff0c;以访问、交互并…

文件共享功能无法使用提示错误代码0x80004005【笔记】

环境情况&#xff1a; 其他电脑可以正常访问共享端&#xff0c;但有一台电脑访问提示错误代码0x80004005。 处理检查&#xff1a; 搜索里输入“启用或关闭Windows功能”按回车键&#xff0c;在“启用或关闭Windows功能”里将“SMB 1.0/CIFS文件共享支持”勾选后&#xff08;故…

屏幕管控——保护文档内容安全

屏幕管控是保护文档内容安全的重要手段之一&#xff0c;它涉及到对终端屏幕的使用、访问权限、内容展示以及操作行为的监控和管理。专业的企业级防泄密系统&#xff0c;如金刚钻信息&#xff0c;会有一些专业功能针对屏幕这块有对应的防护措施。 一、屏幕水印设置 屏幕水印是…

外卖霸王餐系统推荐,哪家的系统比较稳定呢?

以下是一些较为稳定且有一定用户基础的外卖霸王餐系统&#xff0c;你可以根据自身需求进一步考察和选择&#xff1a; - **饭否霸王餐**&#xff1a;有专门的APP&#xff0c;如在应用宝上其开发商为南京有惠鲸选电子商务有限公司。它覆盖了多个城市&#xff0c;提供美团、饿了么…

从0到1,AI我来了- (1)从AI手写数字识别开始

前两篇我们我们把控制台、Python环境Anaconda 搞定了&#xff0c;接下来&#xff0c;我们快速进入主题&#xff0c;把AI 界的“Hello World” 实现一下&#xff0c;有个感觉&#xff0c;再逐步了解一些AI的概念。 1、Pytorch 安装 1) 什么是Pytorch? 一个深度学习框架&#…

C语言常见字符函数和字符串函数精讲

目录 引言 一、字符函数 1.字符分类函数 2.字符转换函数 二、字符串函数 1.gets、puts 2.strlen 3.strcpy 4.strncpy 5.strcat 6.strncat 7.strcmp 8.strncmp 9.strstr 10.strchr 11.strtok 12.strlwr 13.strupr 引言 在C语言编程中&#xff0c;字符函数…

第二证券:股票交易费用有哪些?

出资者生意股票是需求付出生意费用的&#xff0c;一般来说股票的生意费用主要有以下几种&#xff1a; 1、证券公司佣金。这是证券公司收取的一种服务费&#xff0c;用于供给股票生意的途径和服务。证券公司佣金的份额由证券公司自行拟定&#xff0c;但最高不得超越成交金额的0…

elasticsearch8.14.1集群安装部署

elasticsearch安装部署&#xff0c;首先需要准备至少三台服务器&#xff0c;本例再windows11下安装三台vmware虚拟机&#xff0c;利用centOS7系统模拟服务器环境。 本例假设你已经安装了三台vmware和centOS7&#xff0c;且centOS7运行正常。接下来我们直接讲解elasticsearch下载…

通过IEC104转MQTT网关轻松接入阿里云平台

随着智能电网和物联网技术的飞速发展&#xff0c;电力系统中的传统IEC 104协议设备正面临向现代化、智能化转型的迫切需求。阿里云作为全球领先的云计算服务提供商&#xff0c;其强大的物联网平台为IEC 104设备的接入与数据处理提供了强大的支持。本文将深入探讨钡铼网关在MQTT…

Python seaborn超级细节篇-使用配色palette

本文分享Python seaborn中通过配色palette美化图形。配色(palette),用于设置color palette,例如,Set1、#a1c9f4、red等。 内容很多,快速浏览一下,节选自👉Python可视化-seaborn篇 这里展示部分, 5.3 palette设置图形配色 设置图形配色palette目的在于有效地展示数…

【ffmpeg命令入门】视频剪切,倍速与倒放

文章目录 前言1. 视频剪切2. 视频倍速公式说明例子 3. 视频倒放总结 前言 在视频编辑中&#xff0c;剪切、倍速和倒放是常见的操作&#xff0c;能够帮助我们调整视频的长度、播放速度以及播放顺序。掌握 FFmpeg 命令中的相关参数和用法将使视频处理变得更加高效。在这篇文章中…

vLLM——使用PagedAttention加速推理

参考自https://blog.vllm.ai/2023/06/20/vllm.html 介绍 vLLM是一个用于快速LLM推理和服务的开源库。vLLM 利用PagedAttention&#xff0c;可以有效地管理注意力键和值。PagedAttention 的 vLLM 重新定义了 LLM 服务的最新水平&#xff1a;它提供了比 HuggingFace Transforme…

jdk的major version和minor version是啥意思?

写在前面 1&#xff1a;正文 major version是大版本号&#xff0c;minor version是小版本号&#xff0c;但目前minor version都是0&#xff08;也可能是我没有发现&#x1f605;&#xff09;&#xff0c;如jdk8就是52&#xff0c;如下表&#xff1a; 可以看到jdk版本号和ma…

【Java】随机值设置

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; 在Java中设置随机值通常涉及到java.util.Random类或Math.random()方法。 使用Math.random()方法 Math.random()生成的随机…

AI在Facebook的应用:预见智能化社交的新前景

在数字化时代&#xff0c;社交媒体平台已成为我们生活的重要组成部分&#xff0c;而人工智能&#xff08;AI&#xff09;的快速发展正推动着这些平台向更智能、更个性化的方向发展。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;正不断探索和应用AI技术&…

leetcode日记(54)加一

很简单 class Solution { public:vector<int> plusOne(vector<int>& digits) {int ndigits.size();for(int in-1;i>0;i--){if(digits[i]<9){digits[i];break;}else if(i0){digits[i]0;digits.insert(digits.begin(),1);}else digits[i]0;}return digits…