【前端学java】JAVA中类的基础概念

news2024/11/29 10:54:04

theme: cyanosis

java中的类语法和前端的类语法几乎是一致的。

基础代码示例

JAVA的面向对象编程和JS的类语法十分接近,我们看一段代码

public class Object_oriented {
    public static void main(String[] args) {
        // 打工人 前的PeoPle是类型
        People dagongren =new People();
        dagongren.name = "zhangsan";
        dagongren.speak();
    }
}

class People {
    String name;
    void speak(){
        System.out.println("卧槽," + name +"讲话了!");
    }
}

上述代码包含一个名为Object_oriented的Java类和一个名为People的Java类。

  • Object_oriented类是程序的入口点,具有一个静态的main方法,是程序的执行起点。

  • 在main方法中,创建了一个People对象,名为dagongren,并设置了其name属性为"zhangsan"。接着调用了dagongren对象的speak方法。

  • People类是一个自定义的类,具有一个name属性和一个speak方法。name属性是一个字符串,存储了一个人的名字。

类的属性

在Java类中,属性也称为成员变量实例变量,是类的特征和状态的表示。

属性可以是任何基本数据类型(如整数、浮点数、字符、布尔值等)或引用数据类型(如字符串、数组、对象等)。

属性的声明语法如下:

<访问修饰符> <数据类型> <属性名>;

访问修饰符用于控制属性的可见性和访问范围:

  • public:可以从任何地方访问。
  • private:只能在同一个类中访问。
  • protected:可以在同一个包内或子类中访问。
  • 默认(不写修饰符):可以在同一个包内访问。

例如,以下是一个包含三个属性的示例:

public class Person {
  public String name;     // 公开的name属性
  private int age;        // 私有的age属性
  protected boolean sex;   // 受保护的sex属性
  // 构造方法和其他方法...
}

在上面的示例中,Person类有三个属性:name、age和sex。name属性是公开的,可以从类外部访问。age属性是私有的,只能在Person类内部访问。sex属性是受保护的,可以在同一个包内或Person类的子类中访问。

类的方法

类的方法和TS中的方法基本一致,类中的方法需要添加返回类型

方法由方法头方法体组成。方法头包括方法的修饰符、返回类型、方法名称参数列表

修饰符 返回类型 方法名(参数列表) {
    // 方法体
}
  • 修饰符指定方法的访问方式(public、private、protected等)
  • 返回类型指定方法返回的数据类型(如果没有返回值则使用关键字void)
  • 方法名是方法的标识符
  • 参数列表列出方法接受的参数。

我们可以看一个简单的demo

public class Object_oriented {
  public static void main(String[] args) {
    People dagongren =new People();
    dagongren.eat = true;
    dagongren.speak();
  }
}
class People {
  boolean eat;
  void speak(){
    System.out.println(getText());
  }
  String getText(){
    if(this.eat) {
      return "我吃饭了";
    }else {
      return "我没吃饭";
    }
  }
}

方法中引入类的属性可以使用this关键词

方法中可以引入类中的其他方法

如果类中的方法需要参数,其写法和js也是一致的,不过需要指定参数的类型,如

public void add(int num1, int num2) {
  // 方法体
}

静态

静态成员

静态变量是与类关联的变量,可以理解为类自身的属性,实例对象是木有的。静态变量可以用类名直接访问,而不需要创建类的实例。例如:

public class MyClass {
  static int count;
}

使用类名访问静态成员变量。例如:MyClass.count = 10;

静态方法

静态方法是与类关联的方法。与静态变量一样,无需创建类的实例即可访问静态方法。

使用类名调用静态方法。例如:MyClass.printMessage();

静态块

通过使用 ****static ****关键字定义,用于在类加载时执行一次的初始化操作。静态代码块在类首次被加载时执行,并且在类中的其他静态成员之前执行。

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    static {
        System.out.println("静态代码块1-------------------------------");
    }
    static {
        System.out.println("静态代码块3-------------------------------");
    }
}

根据代码运行结果,我们可以知道:第二次实例代码时,类中的静态块没有被执行

实例代码块

没有使用任何关键字定义,直接写在类中的代码块。实例代码块在创建对象时被调用,每次创建对象都会执行。通常用于在创建对象时进行一些通用的初始化操作。

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    {
        System.out.println("实例代码块2-------------------------------");
    }
}

静态代码块与实例代码的区别

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    static {
        System.out.println("静态代码块1-------------------------------");
    }
    {
        System.out.println("实例代码块2-------------------------------");
    }
    static {
        System.out.println("静态代码块3-------------------------------");
    }
}

可见:

  • 静态代码块优先级最高,只执行一次
  • 实例代码块优先级低,每次实例都执行

构造方法

构造方法是一种特殊的方法,用于创建并初始化对象。构造方法的名称必须与类名相同,并且没有返回类型。

这和js类中的constructor是一致的

构造方法有以下特点:

  1. 构造方法在使用new关键字创建对象时被调用,且只调用一次。
  2. 构造方法可以有多个重载版本,即可以根据不同的参数列表创建不同的构造方法。
  3. 如果没有显式定义构造方法,Java会隐式地提供一个无参的默认构造方法,用于创建对象。
public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    // java提供的构造方法
    People(){
        System.out.println("构造方法-------------------------------");
    }
}

构造方法与静态块的执行顺序

public class test {
    public static void main(String[] args) {
        new People();
        new People();
    }
}
class People {
    static {
        System.out.println("静态代码块1-------------------------------");
    }
    {
        System.out.println("实例代码块2-------------------------------");
    }
    People(){
        System.out.println("构造方法-------------------------------");
    }
    static {
        System.out.println("静态代码块3-------------------------------");
    }
}

可见,优先级顺序 静态块 > 实例块 > 构造方法

继承

Java中的继承语法格式如下:

class Subclass extends Superclass {
    // 子类的方法和属性
}

其中,Subclass是子类,Superclass是父类。

我们看下面这个具体示例:

class Animal {
    public void eat() {
        System.out.println("Animal is eating");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("Dog is barking");
    }
}

public class Test {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.eat();   // 继承自Animal类
        d.bark();  // 继承自Dog类
    }
}

在上面的例子中,Dog类继承了Animal类。因此,Dog类可以使用Animal类中定义的eat() 方法。同时,Dog类还定义了自己的bark() 方法。

this关键字

如果上述Animal类需要一个入参来指定eat的内容,Animal类需要做一些更改

class Animal {
    String food;
    // 我们在构造方法中使用this改变了类的属性food的值
    public Animal(String food){
        this.food = food;
    }
    public void eat() {
        System.out.println("狗吃了" + this.food);
    }
}

this关键字可以用于访问当前类的成员变量和方法。

super

此时,Dog在继承Animal类时,也需要访问父类的成员变量food

class Dog extends Animal {
    public Dog(String food){
        // 使用super()可以调用父类的构造方法
        super(food);
    }
    public void bark() {
        System.out.println("Dog is barking");
    }
}

super关键字用于访问父类的成员变量和方法,super() 必须是构造方法中的第一条语句

完整代码

public class Test {
    public static void main(String args[]) {
        Dog d = new Dog("火腿肠");
        d.eat();   // 继承自Animal类
        d.bark();  // 继承自Dog类
    }
}
class Animal {
    String food;
    public Animal(String food){
        this.food = food;
    }
    public void eat() {
        System.out.println("狗吃了" + this.food);
    }
}

class Dog extends Animal {
    public Dog(String food){
        super(food);
    }
    public void bark() {
        System.out.println("Dog is barking");
    }
}

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

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

相关文章

微信自动回复怎么设置?

宝子们 你们有遇到或正面临以下情况吗&#xff1f; NO.1 “消息爆炸” 小能&#xff0c;是一位在微信公众号分享美食和旅行的博主 由于内容质量高、互动性强&#xff0c;他的粉丝数量迅速增长 然而&#xff0c;随之而来的是大量的留言和私信 小明根本无法应付 他曾经试…

GFLv2 论文学习

1. 解决了什么问题&#xff1f; 预测定位质量对于目标检测很重要&#xff0c;在 NMS 时它能提供准确的得分排序&#xff0c;提高模型的表现。现有方法都是通过分类或回归的卷积特征来预测定位质量得分。 2. 提出了什么方法&#xff1f; 受到 GFLv1 的 general distribution …

端口复用与重映射

端口复用和重映射 STM32F1有很多的内置外设&#xff0c;这些外设的外部引脚都是与GPIO复用的。也就是说&#xff0c;一个GPIO如果可以复用为内置外设的功能引脚&#xff0c;那么当这个GPIO作为内置外设使用的时候&#xff0c;就叫做复用。 大家都知道&#xff0c;MCU都有串口…

Linux中的ldd命令使用方法总结

ldd&#xff08;List Dynamic Dependencies&#xff09;命令是Linux系统中的一个工具 它用于打印出一个可执行文件所依赖的共享库文件&#xff08;动态链接库&#xff09; 当你运行ldd命令&#xff0c;并跟上一个可执行文件作为参数&#xff0c;它会列出该可执行文件所需要的…

Spingboot 整合netty-socket.io

Spingboot 整合netty-socket.io 依赖 注意版本号&#xff0c;不然client版本不对的话也是连不上的 https://github.com/mrniko/netty-socketio ​ <dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</art…

使用TensorFlow训练深度学习模型实战(下)

大家好&#xff0c;本文接TensorFlow训练深度学习模型的上半部分继续进行讲述&#xff0c;下面将介绍有关定义深度学习模型、训练模型和评估模型的内容。 定义深度学习模型 数据准备完成后&#xff0c;下一步是使用TensorFlow搭建神经网络模型&#xff0c;搭建模型有两个选项…

年轻小伙爆肝ARST

关于 ARTS 的释义 —— 每周完成一个 ARTS&#xff1a; ⭐️● Algorithm: 每周至少做一个 LeetCode 的算法题 ⭐️● Review: 阅读并点评至少一篇技术文章 ⭐️● Tips: 学习至少一个技术技巧 ⭐️● Share: 分享一篇有观点和思考的技术文章 希望通过此次活动能聚集一波热爱技…

GitLab 删除项目

1.点击头像 2.点击Profile 3.选择要删除的项目点进去 4.settings-general-Advances-expand 5.然后在弹出框中输入你要删除的项目名称即可

【WEB开发】Java获取高德POI(关键词搜索法)实现数据展示

前言 该篇文章是关键词搜索法获取高德poi&#xff0c;但鉴于无法突破200条记录的上限&#xff0c;所以采用了本方法进行区/县循环检索。开始之前我们首先需要明白一些常识 poi是兴趣点&#xff0c;它本身除了经纬度&#xff0c;还记录了一些信息&#xff0c;如名称、地址、联…

mirror功能

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…

【Redis】高级篇: 一篇文章讲清楚Redis的单线程和多线程

目录 面试题 Redis到底是多线程还是单线程&#xff1f; 简单回答 详解 Redis的“单线程” Redis为什么选择单线程&#xff1f; 后来Redis为什么又逐渐加入了多线程特性&#xff1f; Redis为什么快&#xff1f; 回答 IO多路复用 Unix网络编程的5种IO模型 主线程和IO…

温湿度传感器的工作原理及应用领域你了解多少呢?

传感器是一种将物理量转换为电信号的装置&#xff0c;用于检测温度、湿度、压力、光强、震动等物理量。它能够将检测到的物理量转换为电信号&#xff0c;并输送到计算机、单片机等设备进行分析和处理。生产生活中&#xff0c;不同的场所和环境对温湿度有着特殊要求&#xff0c;…

看完即会,抓取微信小程序数据包教程

在给VIP学员答疑的时候&#xff0c;有很多小伙伴问到能不能抓取到微信小程序数据呢&#xff1f;答案当然是肯定的&#xff0c;通过Fiddler或者Charles这些主流的抓包工具都可以抓得到&#xff0c;在IOS平台抓取微信小程序和https请求都是一样的设置&#xff0c;接下来给大家通过…

【代码随想录day20】验证二叉搜索树

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 思路 最开始想简单…

Linux 学习记录58(ARM篇)

Linux 学习记录58(ARM篇) 本文目录 Linux 学习记录58(ARM篇)一、GIC相关寄存器1. 系统框图2. 中断号对应关系 二、GICD寄存器1. GICD_CTLR2. GICD_ISENABLERx3. GICD_IPRIORITYRx4. GICD_ITARGETSRx5. GICD_ICPENDRx 三、GICC寄存器1. GICC_PMR2. GICC_CTLR3. GICC_IAR4. GICC_…

JAVA面试总结-Redis篇章(五)——持久化

Java面试总结-Redis篇章&#xff08;五&#xff09;——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件)&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#x…

持续贡献开源力量,棱镜七彩加入openKylin

近日&#xff0c;棱镜七彩签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入openKylin 开源社区。 棱镜七彩成立于2016年&#xff0c;是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

短视频账号矩阵系统源码开发部署路径

一、短视频批量剪辑的开发逻辑算法 1.视频剪辑之开发算法 自己研发视频剪辑是指通过对视频素材进行剪切、调整、合并等操作&#xff0c;利用后台计算机算法&#xff0c;进行抽帧抽组抽序进行排列以达到对视频内容进行修改和优化的目的。自己研发的视频剪辑工具可以通过后台码…

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…

系统架构设计师-软件架构设计(3)

目录 一、软件架构风格&#xff08;其它分类&#xff09; 1、闭环控制结构&#xff08;过程控制&#xff09; 2、C2风格 3、MDA&#xff08;模型驱动架构 Model Driven Architecture&#xff09; 4、特定领域软件架构&#xff08;DSSA&#xff09; 4.1 DSSA基本活动及产出物…