Day03:注意事项、this关键字、构造器、JavaBean、String、ArrayList

OOP的注意事项

  • 类名要跟class文件名一致(一个class可以有多个类,但只有一个public,且与文件名一致),命名介意大驼峰;
  • 如果某个对象没有变量指向他,就成垃圾对象了(空指针),但JAVA的虚拟机有垃圾GC机制(cpp没有),可以自动回收。

this关键字

  • this就是一个变量,在类的方法中拿到当前对象;
  • this的作用:用来解决变量名称的冲突问题。比如成员方法中的成员变量和形参:
public class Student {
    String name;
    double score;
    public void test(Student this){
        System.out.println(this);
    }
 
    public void printPass(double score){
        if(this.score >= score){
            System.out.println("恭喜您,您成功考入了哈佛大学~~");
        }else {
            System.out.println("很遗憾,您没有考过~~");
        }
    }
}

这个this.score和score就避免了重名。

构造器

  • 也就是cpp中的构造函数
  • 无参数构造器和有参数构造器(方便初始化):
public class Student {
    String name;
    double score;
    
    // 无参数构造器
    public Student() {
        System.out.println("无参数构造器");
    }
    
    // 有参数构造器
    public Student(String name, double score) {
        this.name = name;
        this.score = score;
    }
}
  • 类在设计时如果不写构造器默认生成无参数构造器(也就是为什么写Student s = new Student()
  • 如果一旦定义了有参数构造器,就不会自动生成,这时需要自己手写一个无参数构造器;

封装

  • 面向对象的三大特征:封装、继承和多态
  • 封装:

image

  • 封装的设计规范:合理隐藏(private),合理暴露(public)
  • 比如对于student类:
package com.gmz;

public class Student {
    public String name;
    public double score;
    public int grade;

    public void printScore() {
        System.out.println("Name: " + name);
        System.out.println("Score: " + score);
        System.out.println("Grade: " + grade);
    }


}

这样不正确,我们的成员对象应该是不可见的,而是自定义set函数来设置、get函数来取:

public class Student {
    private String name;
    private double score;
    private int grade;

    public void setScore(int score){
        if(score < 0 || score > 100){
            System.out.println("Invalid score");
            return;
        }
        this.score = score;
    }
    
    public double getScore(){
        return score;
    }

}

实体类JavaBean

  • 实体类:
    • 成员变量都是private
    • 对外提供get和set方法;
    • 必须有一个无参构造器
  • 小技巧:IDEA右键generate自动生成set、get和构造器函数;
public class Student {
    private String name;
    private double score;
    private int grade;

    public Student() {

    }

    public Student(String name, double score, int grade) {
        this.name = name;
        this.score = score;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}



  • 实体类的作用:数据和方法分离,比如Student存信息,StudentOperator存操作。
public class StudentOperator {
    private Student student;
    public StudentOperator(Student student){
        this.student = student;
    }
 
    public void printPass(){
        if(student.getScore() >= 60){
            System.out.println(student.getName() + "学生成绩及格");
        }else {
            System.out.println(student.getName() + "学生成绩不及格");
        }
    }
}

Java中的包

  • 建包类似于建文件夹方便管理,建包的语法:
package com.gmz.javabean

public class Student {
  ...
}

image

(相当于cpp中的include)

  • IDEA的自动导包:

image

String类

  • 全称为java.lang.String (不需要导包)相当于cpp中的string
  • 创建String对象:
//最简单的直接赋值
String str = "abc";

//构造器
String str = new String();

String rs2 = new String("itheima");
System.out.println(rs2);

char[] chars = {'a', '黑', '马'};
String rs3 = new String(chars);
System.out.println(rs3);

byte[] bytes = {97, 98, 99}
String rs4 = new String(bytes);
System.out.println(rs4);
  • 几个常见的字符串方法:
public static void main(String[] args) {
        System.out.println(new Object());
        // 目标:快速熟悉String提供的处理字符串的常用方法。
        String s = "黑马Java";
        // 1、获取字符串的长度
        System.out.println(s.length());

        // 2、提取字符串中某个索引位置处的字符
        char c = s.charAt(1);
        System.out.println(c);

        // 字符串的遍历
        for (int i = 0; i < s.length(); i++) {
            // i = 0 1 2 3 4 5
            char ch = s.charAt(i);
            System.out.println(ch);
        }

        System.out.println("-------------------");

        // 3、把字符串转换成字符数组,再进行遍历
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }

        // 4、判断字符串内容,内容一样就返回true
        String s1 = new String("黑马");
        String s2 = new String("黑马");
        System.out.println(s1 == s2); // false
        System.out.println(s1.equals(s2)); // true

        // 5、忽略大小写比较字符串内容
        String c1 = "34AeFG";
        String c2 = "34aEfg";
        System.out.println(c1.equals(c2)); // false
        System.out.println(c1.equalsIgnoreCase(c2)); // true

        // 6、截取字符串内容 (包前不包后的)
        String s3 = "Java是最好的编程语言之一";
        String rs = s3.substring(0, 8);

        // 7、从当前索引位置一直截取到字符串的末尾
        String rs2 = s3.substring(5);

        // 8、把字符串中的某个内容替换成新内容,并返回新的字符串对象给我们
        String info = "这个电影简直是个垃圾,垃圾电影!!";
        String rs3 = info.replace("垃圾", "**");

        // 9、判断字符串中是否包含某个关键字
        String info2 = "Java是最好的编程语言之一,我爱Java,Java不爱我!";
        System.out.println(info2.contains("Java"));
        System.out.println(info2.contains("java"));
        System.out.println(info2.contains("Java2"));

        // 10、判断字符串是否以某个字符串开头。
        String rs4 = "张三丰";
        System.out.println(rs4.startsWith("张"));
        System.out.println(rs4.startsWith("张三"));
        System.out.println(rs4.startsWith("张三2"));

        // 11、把字符串按照某个指定内容分割成多个字符串,放到一个字符串数组中返回给我们
        String rs5 = "张无忌,周芷若,殷素素,赵敏";
        String[] names = rs5.split(",");
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
    }
  • String使用时的注意事项(面试常考

    • String对象是不可变字符串对象,一旦创建内容不能改变(只能改后产生新的赋给另一个);

    注意常量字符串会放在字符串常量池:

image

- 只要是以双引号给出的字符串对象,存储在常量池中,而且内容相同时只会存储一份(**节约内存)**,比如:

```cpp
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1 == s2);

```


输出true。


- new String创建字符串对象,每次new出来的都是一个新对象,放在堆内存中

```cpp
char[] chars = {'a', 'b', 'c'};
        String a1 = new String(chars);
        String a2 = new String(chars);
        System.out.println(a1 == a2);
```


输出false。(地址不同)


- 易错题:

image

[外链图片转存中…(img-TUWu39Ng-1699718499323)]

ArrayList

  • 已经有数组[]了,选择集合的好处:数组创建就固定了,集合大小可变(类似于cpp中的vector)
  • 集合(Collection)是一种用来存储多个元素的容器。它提供了一系列的方法供我们对其中的元素进行操作,包括添加、删除、遍历等。Java中的集合框架提供了多种集合类,如ArrayList、LinkedList、HashSet等。
  • ArrayList的构造方法:
 ArrayList<String> list = new ArrayList<>();

new后面尖括号中的String省略不写从JDK 1.7开始支持;

这样就指定了ArrayList(范型类)中只能添加类型为String的元素,如果是:

 ArrayList list = new ArrayList();

就可以添加各种类型的元素(最好不要)。

  • ArrayList的相关操作:增删查改:
//1. 往末尾插入元素
list.add("黑马");
list.add(“jav”);

// 打印arrayList
System.out.println(list);

// 2、往集合中的某个索引位置处添加一个数据
list.add(1, "MySQL");

// 3、根据索引获取集合中某个索引位置处的值
String rs = list.get(1);

// 4、获取集合的大小(返回集合中存储的元素个数)
System.out.println(list.size());

// 5、根据索引删除集合中的某个元素值,会返回被删除的元素值给我们
System.out.println(list.remove(1));

// 6、直接删除某个元素值,删除成功会返回true,反之
System.out.println(list.remove("Java"));
// 默认删除的是第一次出现的这个黑马的数据的
System.out.println(list.remove("黑马"));

// 7、修改某个索引位置处的数据,修改后会返回原来的ArrayList给我们
System.out.println(list.set(1, "黑马程序员"));



  • 这里注意list.remove(“黑马”)删除的是第一次出现的黑马字符串。
  • 注意list.size()有括号,length没括号!!!(cpp中两个都有括号)

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

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

相关文章

Redis(三)

4、分布式锁 4.1 、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路 那么…

FM8317-USB TYPE-C PD 多协议控制器

产品描述&#xff1a; FM8317是一款集成了USB Type-C、USB Power Delivery&#xff08;PD3.0&#xff09;、PPS的多协议端口控制器&#xff0c;为AC-DC适配器、车载充电器等设备提供高性价比的USB Type-C 端口充电解决方案。 FM8317内置的Type-C协议可以支持Type-C设备插入自动…

Netty - 回顾Netty高性能原理和框架架构解析

文章目录 概述JDK 原生 NIO 程序的问题Why Netty使用场景Related ProjectsNetty 高性能设计I/O 模型【阻塞 I/O】&#xff1a;【I/O 复用模型】【基于 Buffer】 线程模型事件驱动模型Reactor 线程模型Netty的线程模型异步处理 Netty框架的架构设计功能特性模块组件Bootstrap、S…

Linux驱动开发——PCI设备驱动

目录 一、 PCI协议简介 二、PCI和PCI-e 三、Linux PCI驱动 四、 PCI设备驱动实例 五、 总线类设备驱动开发习题 一、 PCI协议简介 PCI (Peripheral Component Interconnect&#xff0c;外设部件互联) 局部总线是由Intel 公司联合其他几家公司一起开发的一种总线标准&#…

2560 动物保护宣传网站设计JSP【程序源码+文档+调试运行】

摘要 本文介绍了一个动物保护宣传网站的系统的设计与实现。该系统包括前台用户模块和后台管理员模块&#xff0c;具有用户注册/登录、新闻、资源库、法律法规、图片赏析、留言板、关于我们、用户后台等功能。通过数据库设计和界面设计&#xff0c;实现了系统的基本功能&#x…

腾讯云3年期轻量应用服务器优惠(薅羊毛教程)

腾讯云轻量应用服务器特价是有新用户限制的&#xff0c;所以阿腾云建议大家选择3年期轻量应用服务器&#xff0c;一劳永逸&#xff0c;免去续费困扰。腾讯云轻量应用服务器3年优惠可以选择2核2G4M和2核4G5M带宽&#xff0c;3年轻量2核2G4M服务器540元&#xff0c;2核4G5M轻量应…

SW如何显示样条曲线的控标

刚刚学习隔壁老王的sw画图时&#xff0c;怎么点都点不出样条曲线的控标&#xff0c;于是果断查询了一下解决方法&#xff0c;其实很简单&#xff0c;只不过是培训机构故意不说&#xff0c;叫你还解决不了&#xff0c;难受了就会花钱买他们的课了。毕竟如果学会了怎么解决问题了…

泛微E-Office信息泄露漏洞复现

简介 Weaver E-Office是中国泛微科技&#xff08;Weaver&#xff09;公司的一个协同办公系统。 Weaver E-Office 9.5版本存在安全漏洞。攻击者利用该漏洞可以访问文件或目录。 漏洞编号&#xff1a;CVE-2023-2766 漏洞复现 FOFA语法&#xff1a; app"泛微-EOffice&qu…

快速走进通信世界 --- 基础知识扫盲

想不到吧&#xff0c;家人们&#xff0c;博主好久没来更新文章了&#xff0c;而且这次更新的是关于通信工程的文章。博主确实以前一直更新关于编程的文章&#xff0c;只不过最近在学习一些新的知识&#xff0c;以后有机会了我还是会继续更新一些编程技术文章的。不过每一门技术…

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

在 Microsoft Word 中启用护眼模式

在 Microsoft Word 中启用护眼模式 在使用 Microsoft Word 365 或 Word 2019&#xff08;Windows&#xff09;版本时&#xff0c;启用护眼模式&#xff08;也称为“夜间模式”&#xff09;可以有效减轻屏幕亮度&#xff0c;有助于减少眼睛疲劳。以下是启用护眼模式的步骤&…

YOLOv5算法进阶改进(1)— 改进数据增强方式 + 添加CBAM注意力机制

前言:Hello大家好,我是小哥谈。本节课设计了一种基于改进YOLOv5的目标检测算法。首先在数据增强方面使用Mosaic-9方法来对训练集进行数据增强,使得网络具有更好的泛化能力,从而更好适用于应用场景。而后,为了更进一步提升检测精度,在backbone中嵌入了CBAM注意力机制模块,…

[100天算法】-面试题 04.01.节点间通路(day 72)

题目描述 节点间通路。给定有向图&#xff0c;设计一个算法&#xff0c;找出两个节点之间是否存在一条路径。示例1:输入&#xff1a;n 3, graph [[0, 1], [0, 2], [1, 2], [1, 2]], start 0, target 2 输出&#xff1a;true 示例2:输入&#xff1a;n 5, graph [[0, 1], …

Python异常处理:三种不同方法的探索与最佳实践

Python异常处理&#xff1a;三种不同方法的探索与最佳实践 前言 本文旨在探讨Python中三种不同的异常处理方法。通过深入理解各种异常处理策略&#xff0c;我们可以更好地应对不同的编程场景&#xff0c;选择最适合自己需求的方法。 异常处理在编程中扮演着至关重要的角色。合…

Springboot集成JWT,用户名,密码生成token

何为token&#xff1f;【如果想直接看代码可以往下翻】 使用基于 Token 的身份验证方法&#xff0c;在服务端不需要存储用户的登录记录。大概的流程是这样的&#xff1a; 1. 客户端使用用户名跟密码请求登录 2. 服务端收到请求&#xff0c;去验证用户名与密码 3. 验证成功后&a…

IOC - Google Guice

Google Guice是一个轻量级的依赖注入框架&#xff0c;专注于依赖注入和IoC&#xff0c;适用于中小型应用。 Spring Framework是一个全面的企业级框架&#xff0c;提供了广泛的功能&#xff0c;适用于大型企业应用。 是吧&#xff01;IOC 容器不止Spring,还有Google Guice,来体…

Linux的make和Makefile

目录 一、 介绍二、快速使用三、依赖关系和依赖方法四、语法 一、 介绍 1、makefile带来的好处就是——“自动化编译”&#xff0c;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率。 2、make是一个命令工具&…

一文了解游戏行业(数据分析)

一.概况 1.基本术语 游戏行业基础术语——持续更新ing... 2.产业链 包括游戏开发&#xff0c;发行和销售等环节 游戏开发&#xff1a;上游环节&#xff1b;是游戏产业链的核心环节&#xff0c;包括游戏策划&#xff0c;美术设计&#xff0c;程序开发等&#xff0c;是决定游…

redux-devtools谷歌扩展插件的使用示例

目录 1. store.ts 2. reducer.ts 3. ReduxProvider.tsx 4. mapStateToProps.ts 5. mapDispatchToProps.ts 6. Todo组件(最外层包ReduxProvider 7. Todo组件里面涉及的子组件 1) TodoInput.tsx 2) TodoList.tsx 3) TodoItem.tsx 8. App组件使用Todo组件 1. store.ts …

组件的设计原则

目录 插槽的基本概念 基础用法 具名插槽 使用场景 布局控制 嵌套组件 组件的灵活性 高级用法 作用域插槽 总结 前言 Vue 的 slot 是一项强大的特性&#xff0c;用于组件化开发中。它允许父组件向子组件传递内容&#xff0c;使得组件更加灵活和可复用。通过 slot&…