百无聊赖之JavaEE从入门到放弃(十一)string类 常量池原理 内部类
目录
一.String类和常量池
1.String基础知识
2.常量池
二.内部类
1.概念
2.内部类的作用
3.注意
4.非静态内部类
5.静态内部类
6.匿名内部类
7.局部内部类
一.String类和常量池
1.String基础知识
String数称作不可变字符序列。
String位于java.lang包中,Java 程序默认导入java.lang包下的所有类。
Java字符串就是Unicode字符序列,例如字符串"Java" 就是4个Unicode字符’J'、'a'、'v'、' a'组成的。
Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类:
String,每个用双引号括起来的字符串都是String 类的一个实例。
String类的函数对员原字符串都没有影响,都会在原字符串的基础上生成新字符串!
toString()方法是打印:类名@对象地址,但是打印字符串的时候字符串却是原样输出,因为String类重写了toString()方法。
示例代码(含有==,equals与去除空格的知识点):
public class string {public static void main(String[] args) {String str1="abc";String str2=new String("abc");System.out.println(str1==str2);System.out.println(str1);//会自动调用toString()函数,但是String类重写了System.out.println(str2);System.out.println(str1.equals(str2));//比较字符串内容时用此函数System.out.println();String str3=" a b ";//长度7,前后俩空格,中间一个空格String str4=str3.trim();//去除头尾两端的空格System.out.println(str4.length());System.out.println(str4);//String是不可变字符序列,所有的替换,截取子字符串,去空格,转换大小等都是生成了新字符串System.out.println(str3.replace(" ",""));//去除所有空格System.out.println(str3);//原字符串不变}
}
输出:
false
abc
abc
true3
a b
aba b
str1==str2返回false的原因如下图:
可见str1的地址是0x1,而str2的地址是0x2,str1==str2比较的又是对象地址,显然返回false
2.常量池
在Java的内存分析中,我们会经常听到关于“常量池”的描述,实际上常量池也分了以下三种:
1.全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到String Pool中的,在每个VM中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class文件常量池(Class Constant Pool)
class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量(文本字符串、final 常量等)和符号引用。
3.运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,
也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。
二.内部类
1.概念
内部类是一类特殊的类,指的是定义在一个类的内部的类。 实际开发中,为了方便的使用外部类的相关属性和方法。这时候我们通常会定义一个内部类。
内部类分为成员内部类,匿名内部类,局部内部类;其中成员内部类又分为非静态内部类和静态内部类。
一般情况 ,我们把类定义成独立的单元。有些情况下,我们把一个类放在另一个类的内部定义,称为内部类(innerclasses)。
内部类可以使用public、default、 protected 、private 以及static修饰。而外部顶级类(我们以前接触的类)只能使用public和default修饰。
2.内部类的作用
内部类提供了更好的封装。只能让外部类直接访问,不允许同一个包中的其他类直接访问。
内部类可以直接访问外部类的私有属性,内部类被当成其外部类的成员。 但外部类不能访问内部类的内部属性。
3.注意
内部类只是一个编译时概念, 一旦我们编译成功, 就会成为完全不同的两个类。对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后会出现Outer.class和Outer$Inner.class两个类的字节码文件。所以内部类是相对独立的一种存在, 其成员变量/方法名可以和外部类的相同。
右键包名,选择show in Explorer就可查看编译之后的字节码文件,找一找可看到编译之后的内部类和外部类生成了如下两个文件。
4.非静态内部类
非静态内部类(外部类里使用非静态内部类和平时使用其他类没什么不同)
1.非静态内部类对象必须寄存在一 个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
2.非静态内部类可以直接访问外部类的成员 ,但是外部类不能直接访问非静态内部类成员。
3.非静态内部类不能有静态方法、静态属性和静态初始化块。
4.成员变量访问要点 :
1.内部类里方法的局部变量:变量名。
2.内部类属性 : this.变量名。
3.外部类属性 :外部类名.this变量名。
示例代码1:
//外部类
public class Outer1 {private int age=10;private void show(){System.out.println("要你好看!");}//内部类public class Inner1{private String name="tom";private int age=20;public void showInner(){System.out.println("Inner.showInner");System.out.println(age);//当外部类属性和内部类属性发生重名时,可以通过:Outer1.this.成员名 来调用System.out.println(Outer1.this.age);show();//内部类可以直接使用外部类的成员!}}public static void main(String[] args) {//创建内部类对象Outer1.Inner1 inner01=new Outer1().new Inner1();inner01.showInner();//下面的定义方式和上面效果一样Outer1 out02=new Outer1();Inner1 inn02=out02.new Inner1();inn02.showInner();}
}
输出:
Inner.showInner
20
10
要你好看!
Inner.showInner
20
10
要你好看!
代码2:
public class Face {private String shape="国字脸";//内部类class Nose{private String shape="高鼻梁";public void breath(){System.out.println("鼻子长在了"+Face.this.shape+"形状的脸上");System.out.println("呼吸,呼吸,呼吸");}}class Ear{}class Eye{}public static void main(String[] args) {Face.Nose nose=new Face().new Nose();nose.breath();}
}
输出:
鼻子长在了国字脸形状的脸上
呼吸,呼吸,呼吸
5.静态内部类
定义方式:
static class ClassName {
//类体
}
使用要点:
1.静态内部类可以访问外部类的静态成员,不能访问外部类的普通成员。
2.静态内部类看做外部类的一个静态成员。
代码:
/*
测试静态内部类*/
public class testStaticInnerClass {public static void main(String[] args) {//通过new外部类名.内部类名来创建内部类对象Outer2.Inner2 inner2=new Outer2.Inner2();inner2.test();}
}class Outer2{private int a=10;private static int b=20;//相当于外部类的一个静态成员static class Inner2{public void test(){//System.out.println(a);//静态内部类不能访问外部类的普通属性System.out.println(b);//静态内部类可以访问外部类的普通属性}}
}
输出:
20
6.匿名内部类
适合那种只需要使用一次的类。比如:键盘监听操作等等。在安卓开发、awt、 swing开发中常见。
语法:
new 父类构造器(实参类表) \实现接口() {
//匿名内部类类体!
}
代码:
//匿名内部类
public class TestAnonymousClass {public void test(A a){a.run();}public static void main(String[] args) {TestAnonymousClass tac=new TestAnonymousClass();tac.test(new AA());tac.test(new A(){@Overridepublic void run() {System.out.println("TestAnonymousClass。run");}});}
}class AA implements A{@Overridepublic void run() {System.out.println("AA.run");}
}interface A{void run();
}
输出:
AA.run
TestAnonymousClass.run
7.局部内部类
定义在方法内部的,作用域只限于本方法,称为局部内部类。
局部内部类的的使用主要是用来解决比较复杂的问题想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类。
局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法中被使用, 出了该方法就会失效。
局部内部类在实际开发中应用很少。
代码:
/*** 测试局部内部类*/
public class TestLocalInnerClass {public void show(){//作用域仅限于该方法class Inner3{public void fun(){System.out.println("hello world");}}new Inner3().fun();}public static void main(String[] args) {new TestLocalInnerClass().show();}
}
输出:
hello world
百无聊赖之JavaEE从入门到放弃(十一)string类 常量池原理 内部类相关推荐
- 百无聊赖之JavaEE从入门到放弃(二)基础语法
目录 一.注释(单行,多行,文档) 二.标识符_关键字_驼峰原则 三.bug解决:Welcome.java:6: 错误: 编码GBK的不可映射字符 四.常量constant 五.数据类型 1.整型 2 ...
- 百无聊赖之JavaEE从入门到放弃(十)抽象方法_抽象类 接口
目录 一.abstract 1.抽象方法 2.抽象类 3.抽象类的使用要点 4.示例代码 二.接口 1.接口是什么 2.接口的作用 3.区别 4.格式 (1)声明格式: (2)定义接口的详细说明 (3 ...
- 百无聊赖之JavaEE从入门到放弃(五)this的本质_对象创建过程的4 步_隐式参数 static
目录 一.this关键字 1.对象创建的过程和this的本质 2.this最常的用法: 二.static关键字 三.变量分类 一.this关键字 1.对象创建的过程和this的本质 构造方法是创建Ja ...
- 百无聊赖之JavaEE从入门到放弃(十二)数组
目录 一.基础知识 1.数组的定义 2.建议 3.注意 4.数组的默认初始化 二.基操示例代码 三.拷贝 四.Arrays类 一.基础知识 1.数组的定义 数组是相同类型数据的有序集合.数组描述的是相 ...
- 百无聊赖之JavaEE从入门到放弃(七)继承
目录 一.继承 1.继承使用要点 二.instanceof关键字 三.方法的重写(override) 四.final关键字 五.组合 定义啥的就不说了,说说要点,跑跑代码. 一.继承 1.继承使用要点 ...
- 百无聊赖之JavaEE从入门到放弃(三)JVM内存机制
一.从属于线程的内存区域 JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;我们将这部分归为一类. 1.程序计数器(Program Counter Register) 在JVM规 ...
- 百无聊赖之JavaEE从入门到放弃(六)包机制 静态导入
一.包机制 包机制是Java中管理类的重要手段.开发中, 我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理. 包对于类,相当于文件夹对于文件的作用. 我们通过pac ...
- 百无聊赖之JavaEE从入门到放弃(九)封装详解 多态详解
目录 一.封装 1.封装的作用和含义 2.编程中封装的具体优点: 3.封装的实现一使用访问控制符 4.关于protected的两个细节: 5.开发中封装的简单规则 6.javaBean 二.多态(po ...
- 百无聊赖之JavaEE从入门到放弃(四)垃圾回收机制(Garbage Collection)
目录 一.垃圾回收原理和算法 1.内存管理 2.垃圾回收过程 3.垃圾回收相关算法 二.通用的分代垃圾回收机制 1.年轻代 2.年老代 3.永久代 4.三种GC 三. JVM调优和Full GC 四. ...
最新文章
- (笔记)Mysql命令select from:查询表中的数据(记录)
- 如何实现拼音与汉字的互相转换
- Anaconda 环境下 对Tushare进行测试
- visual studio installer可以卸载吗_ArcGIS 怎样彻底删除和卸载
- 面试题_翻转句子中单词的顺序
- BPSK调制系统MATLAB仿真实现(1)
- 量子计算机平行宇宙,量子纠缠效应揭示:每个人的行为也会影响到其它平行宇宙里的自己...
- 大学计算机课程日记,大学计算机实习日记
- audio接线图解_图文:主板跳线(排线)连接技巧HD AUDIO连线接法
- c语言n的阶乘 longfact,如何定义函式fact(n) 计算n的阶乘:n!=1*2*……*n,函式返回值型别是double?...
- Flutter 报错:Could not resolve io.flutter:flutter_embedding_debug:1.0.0-ee76268252c22f5c11e82a7b87423c
- html自动循环播放视频列表
- POJ1008 玛雅历
- HG30-3交直流校准源
- GhSAD1基因调节棉花的冷应激反应
- [转帖]房博士教你购房(六)
- 释放数据价值,华为云大数据BI解决方案“有几手”
- 学会计软件测试,会计专业毕业生1个月转行软件测试,她是怎么做到的?
- .net sqlite 下载地址
- web前端学习css“北方高温“案例
热门文章
- PCB上开窗 去掉绿油 把铜皮裸露,无脑教程
- Python基础学习笔记三(变量和字面量)
- 如何强制刷新组策略并显示应用的组策略有哪些?
- 运维面试必问的负载均衡高频面试题(2021年最新版)
- 基于百度AI平台的人脸识别评分小程序
- android中录音断点播放,Android实现语音播放与录音功能
- Java 代码如何获取CPU核心数和定义线程池的核心数
- j计算机应用研究,中科院成都计算机应用研究所导师介绍:陈光喜
- apex英雄机器人探路者怎么玩_Apex英雄探路者使用技巧 Apex英雄手游探路者技能怎么用...
- 创新奇智完成超4亿元A轮和A+轮融资,中金甲子领投