今日内容介绍
1、Object
2、String
3、StringBuilder

###01API概念

* A:API(Application Programming Interface)
* 应用程序编程接口
* B:Java API
* 就是Java提供给我们使用的类,这些类将底层的实现封装了起来,
* 我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
* C: 演示查看Object类中的相关方法

###02Object类概述
* A:Object类概述
* 类层次结构的根类
* 所有类都直接或者间接的继承自该类
* Object中描述的所有方法子类都可以使用
* 所有类在创建对象的时候,最终找的父类就是Object。
* B:构造方法
* public Object()
* 回想面向对象中为什么说:
* 子类的构造方法默认访问的是父类的无参构造方法

###03equals方法比较内存地址
* A:equals方法比较内存地址
* a: Object类中的equals方法
* 用于比较两个对象是否相同,Object类中就是使用两个对象的内存地址在比较。
* Object类中的equals方法内部使用的就是==比较运算符。

* b: 案例代码

public class Person extends Object{
private String name;
private int age;

public Person(){}

public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
* 将父类的equals方法写过来,重写父类的方法
* 但是,不改变父类方法的源代码, 方法equals 比较两个对象的内存地址
*
*/
public boolean equals(Object obj){
return this == obj;
}

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 class TestEquals {
public static void main(String[] args) {
//Person类继承Object类,继承下来了父类的方法equals
Person p1 = new Person("李四",20);
Person p2 = new Person("张三",20);


//Person对象p1,调用父类的方法equals,进行对象的比较
boolean b = p1.equals(p1);
System.out.println(b);

}
}

###04重写equals方法
* A: 重写equals方法
* a: 开发中要比较两个对象是否相同,经常会根据对象中的属性值进行比较
* b: 在开发经常需要子类重写equals方法根据对象的属性值进行比较。
* c: ==号和equals方法的区别
* ==是一个比较运算符号,既可以比较基本数据类型,也可以比较引用数据类型,基本数据类型比较的是值,引用数据类型比较的是地址值
* equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,
equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性
* d: 案例代码
public class Person extends Object{
private String name;
private int age;

public Person(){}

public Person(String name, int age) {
this.name = name;
this.age = age;
}
/*
* 重写父类的方法toString()
* 没有必要让调用者看到内存地址
* 要求: 方法中,返回类中所有成员变量的值
*/
public String toString(){
return name + age;
}


/*
* 将父类的equals方法写过来,重写父类的方法
* 但是,不改变父类方法的源代码, 方法equals 比较两个对象的内存地址
*
* 两个对象,比较地址,没有意义
* 比较两个对象的成员变量,age
* 两个对象变量age相同,返回true,不同返回false
*
* 重写父类的equals,自己定义自己对象的比较方式
*/
public boolean equals(Object obj){
if( this == obj){
return true;
}

//对参数obj,非null判断
if( obj == null){
return false;
}

if( obj instanceof Person){
// 参数obj接受到是Person对象,才能转型
// 对obj参数进行类型的向下转型,obj转成Person类型
Person p = (Person)obj;
return this.age == p.age;
}
return false;
}

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 class TestEquals {
public static void main(String[] args) {
//Person类继承Object类,继承下来了父类的方法equals
Person p1 = new Person("李四",20);
Person p2 = new Person("张三",20);


//Person对象p1,调用父类的方法equals,进行对象的比较
boolean b = p1.equals(p1);
System.out.println(b);

}
}

###05重写toString方法
* A: 重写toString方法
* a: 为什么要重写toString方法
* toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
* 由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
* Object类中的toString的核心代码
getClass().getName() + "@" + Integer.toHexString(hashCode())
* 由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
* b: 案例核心代码(重写Person类中的toString方法)
/*
* 重写父类的方法toString()
* 没有必要让调用者看到内存地址
* 要求: 方法中,返回类中所有成员变量的值
*/
public String toString(){
return name + age;
}
//Eclipse中自动生成的toString
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//测试代码
public class TestToString {
public static void main(String[] args) {
//调用Person类的方法toString()
//输出语句中,写的是一个对象,默认调用对象的toString方法
Person p = new Person("张三",20);
String s = p.toString();
System.out.println(p);
System.out.println(s);
/*
* System.out.println(p);
* System.out.println(p.toString());
*/

/*Random r = new Random();
System.out.println(r.toString());

Scanner sc = new Scanner(System.in);
System.out.println(sc.toString());*/
}
}

###06String类的概念和不变性
* A: String类的概念和不变性
* a:String类
* API中的String类的描述,发现String 类代表字符串
* Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
* 字符串是常量,在创建之后不能更改
* 其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
* 源码分析,String类底层采用的是字符数组:
private final char value[]
private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数组,就无法改变数组中元素的值
final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了

* b: 案例代码
/*
* String类特点:
* 一切都是对象,字符串事物 "" 也是对象
* 类是描述事物,String类,描述字符串对象的类
* 所有的 "" 都是String类的对象
*
* 字符串是一个常量,一旦创建,不能改变
*/
public class StringDemo {
public static void main(String[] args) {
//引用变量str执行内存变化
//定义好的字符串对象,不变
String str = "itcast";
System.out.println(str);
str = "itheima";
System.out.println(str);


}
}

###07String类创建方式和比较
* A: String类创建方式和比较
* a: 创建对象的数量比较
* String s3 = "abc";
* 在内存中只有一个对象。这个对象在字符串常量池中
 * String s4 = new String("abc");
* 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
* b: 案例代码
public class StringDemo2 {
public static void main(String[] args) {
//字符串定义方式2个, 直接= 使用String类的构造方法
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1);
System.out.println(str2);

System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
System.out.println(str1.equals(str2));//true
}
}

###08String类构造方法
* A: String类构造方法
* a: 常见构造方法
* public String():空构造
* public String(byte[] bytes):把字节数组转成字符串
* public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
* public String(String original):把字符串常量值转成字符串
* b: 案例代码
public class StringDemo3 {
public static void main(String[] args) {
function_1();
}
/*
* 定义方法,String类的构造方法
* String(byte[] bytes) 传递字节数组
* 字节数组转成字符串
* 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
* 平台 : 机器操作系统
* 默认字符集: 操作系统中的默认编码表, 默认编码表GBK
* 将字节数组中的每个字节,查询了编码表,得到的结果
* 字节是负数,汉字的字节编码就是负数, 默认编码表 ,一个汉字采用2个字节表示
*
* String(byte[] bytes, int offset, int length) 传递字节数组
* 字节数组的一部分转成字符串
* offset 数组的起始的索引
* length 个数,转几个 , 不是结束的索引
*/
public static void function(){
byte[] bytes = {97,98,99,100};
//调用String类的构造方法,传递字节数组
String s = new String(bytes);
System.out.println(s);

byte[] bytes1 ={65,66,67,68,69};
//调用String构造方法,传递数组,传递2个int值
String s1 = new String(bytes1,1,3);
System.out.println(s1);
}
}

###09String类构造方法_2
* A: String类构造方法
* a: 常见构造方法
* public String(char[] value):把字符数组转成字符串
* public String(char[] value,int index,int count):把字符数组的一部分转成字符串
* B: 案例代码
/*
* String类构造方法
* String类的构造方法,重载形式
*
*/
public class StringDemo3 {
public static void main(String[] args) {
function_1();
}
/*
* String(char[] value) 传递字符数组
* 将字符数组,转成字符串, 字符数组的参数,不查询编码表
*
* String(char[] value, int offset, int count) 传递字符数组
* 将字符数组的一部分转成字符串
* offset 数组开始索引
* count 个数
*/
public static void function_1(){
char[] ch = {'a','b','c','d','e','f'};
//调用String构造方法,传递字符数组
String s = new String(ch);
System.out.println(s);

String s1 = new String(ch,1,4);
System.out.println(s1);
}
}

Java语言学习day29--8月04日的更多相关文章

  1. Java语言学习day01--6月28日

    Java语言学习day01一:Java概述 1.Java语言发展史 任职于太阳微系统的 詹姆斯·高斯林 等人于1990年代初开发Java语言的雏形,最初被命名为 Oak ,目标设置在 家用电器等小型系 ...

  2. Java语言学习day02--6月29日

    Java语言学习day02###01常用的DOS命令 * A: 常用的DOS命令 * a: 打开Dos控制台 * win+r--cmd--回车 * b: 常用dos命令 * cd.. : 退回到上一级 ...

  3. Java Calendar获取年、月、日、时间

    Java Calendar获取年.月.日.时间 Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+08:00" ...

  4. 【06月04日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年06月04日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2019年06月04日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历史 ...

  5. Java语言学习day32--8月07日

    ###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...

  6. Java语言学习day33--8月8日

    今日内容介绍1.基本类型包装类2.System类3.Math类4.Arrays类5.大数据运算 ###01基本数据类型对象包装类概述 *A:基本数据类型对象包装类概述 *a.基本类型包装类的产生 在实 ...

  7. Java语言学习day15--7月21日

    今日内容介绍1.Eclipse开发工具2.超市库存管理系统 ###01Eclipse的下载安装 * A: Eclipse的下载安装  * a: 下载 * http://www.eclipse.org ...

  8. Java语言学习总结 扩展篇 DateFormat类

    DateFormat类 java.text .DateFormat 是 日期/时间格式化子类的抽象类,我们通过这个类可以帮我们完成日期和文本之间的转换:也就是可以在Date对象与String对象之间进 ...

  9. 【03月04日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2018年12月05日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2018年12月05日市盈率在300以下的公司. 1 - 青松股份(SZ300132) - 历史 ...

  10. python学习 day21 (3月28日)----(抽象类 多态 nametuple dump)

    不要因为走的路太久了,而忘记了为了什么而出发. 提前作准备了吗?把思维导图的东西做了吗? 和工作了几年的人,相比,是不是相同的水平,如果要写简历的话. 一边学习,一边复习. 小就是大,少就是多. 1. ...

随机推荐

  1. springboot 踩坑之路之 Configuration Annotation Proessor not found in classpath

    1.出现spring boot Configuration Annotation Proessor not found in classpath的提示是在用了@ConfigurationPropert ...

  2. 嵌套OOPS导致系统卡死 每个CPU都上报softlockup的问题

    问题现象:在ARM服务器上,构造oops异常,本应该产生panic,进入dump流程,并且系统重启,但是系统并未重启,而是出现了卡死,在串口会隔一段时间就循环打印调用栈信息.如下所示 linux-fA ...

  3. 三层PetShop架构设计

    <解剖 PetShop >系列之一 前言:   PetShop 是一个范例,微软用它来展示 .Net 企业系统开发的能力.业界有许多 .Net 与 J2EE 之争,许多数据是从微软的 Pe ...

  4. Notion-douan:搭建自己的阅读清单

    前言 交完论文盲审稿,终于从接近一年的实习.秋招和论文的忙碌中闲下来. 在复盘秋招的时候发现自己虽然看过不少书,但缺少整理和思考,所以想趁这个机会梳理一下自己的阅读习惯,希望以后再读新的东西可以更系统 ...

  5. HTTP1.0和HTTP1.1和HTTP2.0的区别

    1 HTTP1.0和HTTP1.1的区别1.1 长连接(Persistent Connection)       HTTP1.1支持长连接和请求的流水线处理,在一个TCP连接上可以传送多个HTTP请求 ...

  6. springboot常用的starter有哪些?

    spring-boot-starter-web 嵌入tomcat和web开发需要servlet与jsp支持 spring-boot-starter-data-jpa 数据库支持 spring-boot ...

  7. Log4j使用(转)

    from:http://www.cnblogs.com/ITtangtang/p/3926665.html 一.Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders ...

  8. css浮动的"巨坑"与完美解决办法

    浮动 1 浮动概念 如果想实现网页中排版布局,比如一行内显示对应的标签元素,可以使用浮动属性.浮动可以实现元素并排. 块转行内日块也可以实现一行显示,不过存在空白折叠现象 float 浮动 属性值 描 ...

  9. ACM - 动态规划 - P1282 多米诺骨牌

    多米诺骨牌由上下 \(2\) 个方块组成,每个方块中有 \(1 \sim 6\) 个点.现有排成行的上方块中点数之和记为 \(S_1\),下方块中点数之和记为 \(S_2\),它们的差为 \(\lef ...

  10. python学习笔记(五)——静态方法、类方法、运算符重载

    我们都知道类名是不能够直接调用类方法的.在C++中,把成员方法声明为 static 静态方法后可以通过类名调用.同样的在python中也可以通过定义静态方法的方式让类名直接调用. 静态方法 使用 @s ...