Java学习之String类的本质及内部类

目录

常量池

API文档如何阅读

String类常用的方法

示例

内部类

特点

成员内部类

非静态内部类

成员变量访问要点

内部类的访问

示例

在别的类中调用

静态内部类

定义方式

使用要点

示例

匿名内部类

示例

局部内部类

面向对象知识总结思维导图:


String是最常用的类

  • String类又称作不可变字符序列

  • String类位于java.lang包中,Java程序默认导入java.lang包下的所有类

  • Java字符串就是Unicode字符序列,例如"Java"就是4个Unicode字符"J"、"a"、"v"、"a"组成的

  • Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例

public class TestString {public static void main(String[] args) {
//      String s0 = null;String s = "";String s1 = "Java";String s2 = new String("Java");
​
//      System.out.println(s0.length()); // 报NullPointerException(空指针异常)的错System.out.println(s.length());  // 0System.out.println(s1.length()); // 4System.out.println(s2.length()); // 4}
}

常量池

  • 全局字符串常量池

  • class文件常量池

  • 运行时常量池(Runtime Constant Pool)

每个class运行时都有一个运行时常量池

System.out.println("--------------字符串相等问题---------------");
String s3 = "张三";
String s4 = "张三";
String s5 = new String("张三");
​
System.out.println(s3 == s4);   // true
System.out.println(s3 == s5);   // false
System.out.println(s5.equals(s3)); // true

API文档如何阅读

  • 下载API文档地址:

Java Development Kit 8 Documentation (oracle.com)

String类常用的方法

方法解释说明
char charAt(int index)返回字符串中方第index个字符
boolean equals(String other)如果字符串与other相等,返回ture;否则,返回false
boolean equalsIgnoreCase(String other)如果字符串与other相等(忽略大小写),则返回true;否则返回false
int indexOf(String str)返回从头开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,返回-1
lastIndex(Of)返回从末尾开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,返回-1
int length()返回字符串的长度
String replace(char oldChar,char newChar)返回一个新串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的
boolean startWith(String prefix)如果字符串以prefix开始,则返回true
boolean endsWith(String prefix)如果字符串以prefix结尾,则返回true
String subString(int beginIndex)返回一个新字符串,该串包含从原始字符串beginIndex到串尾
String subString(int beginIndex,int endIndex)返回一个新字符串,该串包含从原始字符串beginIndex到串尾或endIndex - 1的所有字符
String toLowerCase()返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母
String toUpperCase()返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母
String trim()返回一个新字符串,该串删除了原始字符串头部和尾部的空格

示例

public class TestString02 {public static void main(String[] args) {String s = "HELLO EVERYONE!";String s1 = "hello everyone!";
​System.out.println(s.charAt(4));            // 提取下标为4的字符             OSystem.out.println(s.length());             // 返回字符串s的长度             15System.out.println(s.equals(s1));           // 判断s与s1是否相等             falseSystem.out.println(s.equalsIgnoreCase(s1)); // 同上,但忽略大小写             trueSystem.out.println(s.indexOf("HELLO"));     // 查找s中是否有Hello并返回位置    0System.out.println(s1.indexOf("Pink"));     // 查找s1中是否有Pink            -1
​String s2 = s.replace("E","A");  // 将s1中的E换成ASystem.out.println(s2);                     // 打印s2,一个全新的字符串: HALLO AVARYONA!System.out.println(s);                      // HELLO EVERYONE! String是不可变序列
​String s3 = "Hi,beautiful girl~ do you love me? girl ?";System.out.println(s3.lastIndexOf("girl")); // 从后往前找girl,找到了从前往后数位置并返回   35System.out.println(s3.indexOf("girl"));       // 从前往后找girl并返回位置               13}
}
public class TestString03 {public static void main(String[] args) {String s = "";String s1 = "Hi Zhangsan Hello~";System.out.println(s1.startsWith("Hi"));      // 判断是否以Hi开头             trueSystem.out.println(s1.startsWith("Hello"));   // 判断是否以hello开头          falseSystem.out.println(s1.endsWith("~"));         // 判断是否以~结尾              trues = s1.substring(5);                // 提取字符串从5开始到字符串结尾System.out.println(s);                        // 打印s                      angsan Hello~s = s1.substring(3,8);                        // 提取3-8的字符串,不包括8System.out.println(s);                        //                           Zhangs = s1.toLowerCase();                         // 转小写System.out.println(s);                        //                           hi zhangsan hello~s = s1.toUpperCase();                         // 转大写                     HI ZHANGSAN HELLO~System.out.println(s);                        //String s2 = "  How  are  you ~~~   ";s = s2.trim();                                // 去除首尾字符串,但不能去掉中间的System.out.println(s);                        //                           How  are  you ~~~System.out.println(s2.toLowerCase());                       // String是不可变字符,s2不变     How  are  you ~~~}
}

内部类

把一个类放在另一个类的内部定义,称为内部类(inner class)

特点

  • 内部类提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问

  • 内部类可以直接访问外部类的私有属性,内部类被当成其他外部类放入成员,但外部类不能访问内部类的内部属性

  • 接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整

  • 它只是一个编译时的概念,一旦编译成功,就会变成完全不同的两个类。是相对独立的一种存在,其成员变量/方法名可以和外部类相同

成员内部类

非静态内部类
  • 对象必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在对应的外部内对象

  • 可以直接访问外部类的成员,但不能直接访问非静态类内部类成员

  • 不能有静态方法,静态属性和静态初始化块

  • 外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例

成员变量访问要点
  • 内部类属性:this.变量名

  • 外部类属性:外部类名.this.变量名

内部类的访问
  • 外部类中定义内部类:new Inner()

  • 外部类以外的地方使用非静态内部类

    • Outer.Inner varname = new Outer().new Inner()

示例
package InnerClassTest;
​
public class Outer {public static void main(String[] args) {Outer o = new Outer();o.show();Outer.Inter i = new Outer().new Inter();i.show();}private int age = 18;private String name = "张三";
​public void show(){System.out.println("Outer.show");System.out.println(age);System.out.println(name);}
​public class Inter {int age = 19;String name = "李四";public void show(){System.out.println("Inter.show");System.out.println(age);System.out.println(Outer.this.age);Outer.this.show();}}
}
在别的类中调用
package InnerClassTest;
​
public class TestInner {public static void main(String[] args) {Outer o = new Outer();
//      Inner i = new Inner();   错误的调用Outer.Inter i = new Outer().new Inter(); /*正确调用*/o.show();i.show();}
}
静态内部类
定义方式

static class ClassName{

// 类体

}

使用要点
  • 看作外部类的一个静态成员

  • 当一个静态内部类对象存在,并不一定存在对应得外部类对象。因此,静态内部类得实例方法不能直接访问外部类的实例方法

示例
package InnerClassTest;
​
class Outer2 {private int a = 56;static private int b = 33;
​static class Inner2{public void test(){
//         System.out.println(a);  // 静态内部类不能访问外部类的普通属性System.out.println(b);  // 静态内部类可以访问外部类的静态属性}}
}
public class TestStaticInnerClass{public static void main(String[] args) {// 通过 new 外部类名.内部类名()  来创建内部类对象Outer2.Inner2 i2 = new Outer2.Inner2();i2.test();                 // 33}
}

匿名内部类

  • 适合只需要使用一次的类,eg:键盘监听操作等等,在安卓开发、awt、swing开发中常见

  • 里面没有访问修饰符

  • 没有构造方法

语法:

new 父类构造器(实参列表) \ 实现接口(){

// 匿名内部类类体

}

示例
package InnerClassTest;
​
import javax.swing.plaf.synth.SynthOptionPaneUI;
​
public class TestAnonymousInnerClass {public void test(A a){a.run();}public static void main(String[] args) {TestAnonymousInnerClass t = new TestAnonymousInnerClass();
//      t.test(new AImpl());  // 之前的做法
​// 匿名类的做法--只用这一次t.test(new A() {   // new的不是接口,是一个没有名字的A的实现类@Overridepublic void run() {System.out.println("run");}});t.test(new A(){   // 完全可以与上面的共存@Overridepublic void run(){System.out.println("run2");}});}
}
// 之前的做法
//class AImpl implements A{
//    @Override
//    public void run(){
//      System.out.println("run");
//    }
//}
interface A{void run();
}

局部内部类

开发中用的极少

  • 定义在方法内部,作用域只限于本方法,称为局部内部类

  • 作用域仅限于所在方法

package InnerClassTest;
​
public class TestLocalInnerClass {public void show(){class Inner3{public void fun(){System.out.println("hahaha");}}new Inner3().fun();}
​public static void main(String[] args) {new TestLocalInnerClass().show();}
}

面向对象知识总结思维导图:

链接:知犀思维导图 - 免费思维导图 - 知犀 密码:3797

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

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

相关文章

使用msf进行有防火墙限制的3389端口转发

使用msf进行有防火墙限制的3389端口转发 这里主要是针对在内网中遇到需要开启3389的时候,发现存在防火墙,就没有办法直接远程连接,这个时候就可以使用端口转发使用msf,使用前记得先初始化,连接好数据库这里先使用msf进…

二.音视频编辑-媒体组合-播放

引言 当涉及到音视频编辑时,媒体资源的提取和组合是至关重要的环节。在iOS平台上,AVFoundation框架提供了丰富而强大的功能,使得媒体资源的操作变得轻松而高效。从原始的媒体中提取片段,然后将它们巧妙地组合成一个完整的作品&am…

51之定时器与中断系统

目录 1.定时器与中断系统简介 1.1中断系统 1.2定时器 1.2.1定时器简介 1.2.2定时器大致原理及其配置 1.2.3定时器所需的所有配置总介 2.定时器0实现LED闪烁 3.使用软件生成定时器初始化程序 1.定时器与中断系统简介 1.1中断系统 首先,我们需要来了解一下什么…

设计模式:生活中的享元模式

享元模式的概念可以用日常生活中的图书馆来类比。想象一下,图书馆中的书籍就像是需要大量重复使用的对象。 图书馆中的书籍:享元对象 在图书馆中,每本书都有一个或多个副本。如果每个想要阅读特定书籍的读者都去购买一个新副本,…

深入浅出 -- 系统架构之单体到分布式架构的演变

一、传统模式的技术改革 在很多年以前,其实没有严格意义上的前后端工程师之分,每个后端就是前端,同理,前端也可以是后端,即Ajax、jQuery技术未盛行前的年代。 起初,大部分前端界面很简单,显示的…

AcWing1402.星空之夜

【题目链接】1402. 星空之夜 - AcWing题库 夜空深处,闪亮的星星以星群的形式出现在人们眼中,形态万千。 一个星群是指一组非空的在水平,垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如…

上传下载图片的

上传图片 1.上传图片的方法一般是用Upload组件直接上传File的信息 2.通过FormData对象上传 FormData对象是一个JavaScript对象,可以用来存储表单数据 headers:{“Content-type”:“multipart/form-data”} 3.通过Form表单上传 在HTML中创建一个表单&#xff0c…

【蓝桥杯】GCD与LCM

一.概述 最大公约数(GCD)和最小公倍数(Least Common Multiple,LCM) 在C中,可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

Tensorboard以及Transforms初步学习

一.前情提要 1.本文是代码结合知识点,注释即为知识点 2.主要详细讲解Tensorboard以及Transforms代码以及基础知识 3.若想深入学习,建议阅读 P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)_哔哩哔哩_bilibili 二.简述…

抖音运营技巧

1、视频时长 抖音的作品是否能够继续被推荐,取决于综合数据,包括完播率、点赞率、评论率、转发率和收藏率等。其中,完播率是最容易控制的因素。对于新号来说,在没有粉丝的初期,发布过长的视频可能会导致无人观看。因此…

金田金业带你一文了解现货黄金开户注意事项

现货黄金作为一种受欢迎的投资品种,吸引了越来越多的投资者。然而,在进行现货黄金开户时,有一些重要的注意事项需要牢记。本文将为您详细介绍现货黄金开户的九大关键要点,确保您能够在投资过程中做出明智的决策。 第一&#xff0c…

汇编——SSE对齐

SIMD是(Single Instrument Multi Data),MMX实现了SIMD;SSE是(Streaming SIMD Extension),它取代了MMX;后来AVX(Advanced Vector Extension,高级向量扩展)对SSE进行了扩展…

Java- maven下载jar包,提示找不到,Could not find artifact

1、执行下面命令行 mvn install:install-file -Dfile/home/quangang/桌面/isv-sdk-2.0.jar -DgroupIdcom.jd -DartifactIdisv-sdk -Dversion2.0 -Dpackangjar 2、然后这里要加上jar包

C语言:strlen和sizeof的适用场景

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️感谢大家点赞👍&…

macOS上QT打开麦克风和摄像头的权限问题

同样的代码在Windows上可以轻松操作麦克风和摄像头,特别是用QT这种跨平台的框架。但是对macOS这种权限要求完善的系统还需要进行一些配置,那就是增加Info.plist属性配置文件。如果是之前的早期5.x版本的QTCreator因为使用的是qmake构建系统,估…

No dashboards are active for the current data set.

再次记录一下这个离谱的问题 之前出现这个问题是因为目录没写对 今天遇到这个问题的原因是目录是对的,跟目录是否带有中文也没关系 是writer写入的时候写的是空的,离谱的是写入是空的情况下也会生成events日志文件,看起来好像成功写入了一样&…

Spring源码解析上

spring源码解析 整体架构 defaultListableBeanFactory xmlBeanDefinitionReader 创建XmlBeanFactory 对资源文件进行加载–Resource 利用LoadBeandefinitions(resource)方法加载配置中的bean loadBeandefinitions加载步骤 doLoadBeanDefinition xml配置模式 validationMode 获…

2024-04-05 问AI: 介绍一下深度学习中的Leaky ReLU函数

文心一言 Leaky ReLU(Leaky Rectified Linear Unit)函数是深度学习领域中的一种激活函数,主要用于解决ReLU(Rectified Linear Unit)函数在负值区域为零的问题。ReLU函数在输入为正时保持原样,而在输入为负…

nodejs实现TCP端口转发并截包的小工具

近期我正致力于开发一个基于 Go-CQHTTP 的 QQ 机器人应用程序项目,该项目现已成功实现了 Go-CQHTTP 的容器化部署,利用 Docker 技术确保其运行环境的一致性与便捷性。随着项目推进,接下来的工作重心转向部署配套的签名服务器(qsig…