day010

子类的构造函数执行–>先执行super()//默认隐藏–>执行父类的构造函数–>先执行super()–>执行爷类的构造函数-----在上就是object了—X

#####################################

API是一些预先设定好的函数/接口,所以学习的重点是先使用,先学习使用方式和效果

查询API–这个方法的:返回值类型,参数列表

java中所有类都直接或间接指向object类

Object所处的包是java.lang包是java的核心包,不需要导包,会自动导包

#####################################

Object类中常用方法
toString():返回这个对象对应的字符串
重写之前:打印的是地址值
重写之后:重写之后的效果取决于你怎么重写的
重写后:自定义对象自动添加重写的toString()打印的对象类型+属性名+属性值

hashCode():返回对应对象的哈希码值
同一个对象多次调用这个方法,返回的是同一个哈希码值
不同的对象调用这个方法,返回的是不同的哈希码值

equals()方法与hashCode()应该保持一致,两者要重写都重写,要不重写都不重写
↓ ↓
比较地址值 类型+属性判断

equals()比较当前对象与参数对象是否"相等"
重写前:比较是通过==比较(值)//引用类型比较的就是地址值
重写之后:重写之后的效果取决于你怎么重写的
重写后:自定义对象自动添加重写的equals()比较的是对象的类型+属性名+属性值

String类重写了这个方法,只比较属性内容

#####################################

Java中只要调用子类的构造函数就一定会调用父类的构造函数,这是毋庸置疑的!有时我们并没有在父类中写有参和无参的构造方法,但是这样我们在定义子类对象时调用子类构造函数时,其实也调用父类的构造函数,这是系统自动为我们添加的“public Pen(){}”。

但是如果我们在父类中已经自己定义了有参的构造方法,却没有定义无参的构造方法,那么此时系统是不会为我们自动添加无参的构造方法的,此时程序结果就会提醒你父类没有无参的构造方法,程序就会报错。

#####################################

						<String>

String是一个封装char[]数组的对象,字符串不可变

底层实现可以看出:被final修饰,是常量

String str = “abc”; 等效于:char data[] = {‘a’, ‘b’, ‘c’};

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。

 String str = "abc";//str存的是"abc"的地址值

等效于:
char data[] = {‘a’, ‘b’, ‘c’};//创建数组
String str = new String(data);//将数组作为参数传给构造函数
(String构造函数很多)

#####################################

alt+回车:只要写对,可以智能快捷输入

						<String API总结>

int hashCode() 返回此字符串的哈希码。
boolean equals(Object anObject) 将此字符串与指定的对象比较,比较的是重写后的串的具体内容
String toString() 返回此对象本身(它已经是一个字符串!)。

int length() 返回此字符串的长度。
String toUpperCase() 所有字符都转换为大写。
String toLowerCase() 所有字符都转换为小写
boolean startsWith(String prefix) 测试此字符串是否以指定的元素开头。
boolean endsWith(String suffix) 测试此字符串是否以指定的字符串结束。

char charAt(int index) 返回指定索引/下标处的 char 值/字符
int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。
int lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。
String concat(String str) 将指定字符串连接/拼接到此字符串的结尾,注意:不会改变原串
String[] split(String regex) 根据给定元素来分隔此字符串。

String trim() 返回去除首尾空格的字符串
byte[] getBytes() 把字符串存储到一个新的 byte 数组中
String substring(int beginIndex) 返回一个新子串,从指定下标处开始,包含指定下标
String substring(int beginIndex, int endIndex) 返回一个新子串,从执定下标开始,到结束下标为止,但不包含结束下标
static String valueOf(int i) 把int转成String

#####################################

System.currentTimeMillis:
返回以毫秒为单位的当前时间。
返回:
当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位测量)。

#####################################

StringBuilder/StringBuffer:构造一个字符串缓冲区

封装了char[]数组
是可变的字符序列
提供了一组可以对字符内容修改的方法
常用append()来代替字符串做字符串连接”+”

#####################################

能在页面上做处理就在页面上做处理,不要连累服务器(比如JS作判断格式)

正则表达式Regex
正则表达式 匹配的字符串格式
k 必须匹配字符k
abc 必须匹配指定字符abc
[abc] 只匹配单个字符
[abc][123] 两个里面各取一个进行组合
[a-z] 匹配小写26个字符
[a-zA-Z0-9]

https://blog.csdn.net/weixin_43884234/article/details/116865138

#####################################

// 身份证号的规律:一共是18位,前17位是数字,最后一位可能是数字还可能是X
String regex = “[0-9]{17}[0-9X]”;
// 判断用户输入的数据是否符合正则表达式
/**
* 正则表达式常用的方法仅此一个
* input是接收到的数据,regex是定义的正则表达式,也就是要匹配的规则
* matches()方法用来判断input数据是否符合regex定义的规则
*/
if(input.matches(regex)){
System.out.println(“恭喜你,输入正确!”);
}else{
System.out.println(“输入错误!”);
}

    /**单个\在java中有特殊含义,认为这是一个转义符号
    * 所以如果你想单纯的表示这就是一个\,需要在它的前面加一个用来转义的\
    * 也就是\\
    * */
    String regex1="\\d{17}[0-9X]";

#####################################

					八大基本类型

名称 对应工具包 字节空间 默认值 取值范围
byte Byte 1 0 -128~127
short Short 2 0 -215~215-1
int Integer 4 0 -231~231-1
long Long 8 0L -263~263-1

float Float 4 0.0f 单精度,对小数部分的精度要求不高
double Double 8 0.0d 双精度,精确的小数部分并操作值很大时

char Character 2 ‘\u0000’ 0~65535

boolean Boolean 1 FALSE true/false

https://blog.csdn.net/weixin_43884234/article/details/116865138

#####################################

    //定义包装类型的数据
    Integer i1 = new Integer(127);
    Integer i2 = Integer.valueOf(127);



    //现在的方式:
   /*自动装箱:编译器会自动把基本类型int5,包装成包装类型Integer
     然后交给Integer类型的引用类型变量i3来保存
     自动装底层发生的代码:Integer.valueOf(5)
     valueOf()的方向:int-->Integer*/
    Integer i3 = 5;//不会报错,这个现象就是自动装箱



    /*自动拆箱编译器会自动把包装类型的i1拆掉"箱子",变回基本类型的数据127
    * 然后交给基本类型int的变量i4来保存
    * 自动拆箱底层发生的代码:i1.intValue();
    * intValue()的方向:Integer0->int*/
    int i4 = i1;//不会报错,这个现象就是自动拆箱

#####################################

Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。

    //打印Integer的默认值
    System.out.println(i0);//null

    //创建int类型对应的包装类Integer类型的对象
    Integer i1 = new Integer(5);
    Integer i11 = new Integer(5);
    System.out.println(i1 == i11);
    //false,因为是new的不同对象,所以==比较的是引用的堆内存中地址值

    /**Integer有一个高效的效果,数据在(-218~127)在此范围内
    * 相同的数据只存一次,后续再存都是使用之前存过的数据
    * 仅在此范围内--->高效*/

#####################################

Java 的包装类有两个主要的目的:

Java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向Collections中添加元素(泛型的操作限制加入的只能是对象,比如List = new ArrayList() 的写法是错误的),或者从带对象返回值的方法中返回。
更加方便类型的转换,如常见的Integer向字符的转换

Java 在SE5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换

装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型装换为基本数据类型

在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱的时候自动调用的是Integer的intValue方法。

https://blog.csdn.net/qq_31749835/article/details/88662590

#####################################

对象与引用(气球和绳)
https://www.cnblogs.com/liuurick/p/10713656.html

方法如果没有返回值则必须加void

#####################################

1.字符串类型底层维护的是char[],因为是对象所以存在堆里
char[] value = {‘a’, ‘b’, ‘c’};
String s1 = new String(value);//触发String(Char[])的含参构造来创建对象

#####################################

2.创建String的方式二,写法简单+效率高->堆中的常量池
'创建对象-销毁对象’的过程:隔河往返造船拆船,低效。
“池”:隔河往返租船----第一次如果没有,新建,以后如果还要则直接去常量池取,不新建。

#####################################

    System.out.println(s1==s2);//false,前者在堆里,后者在堆中的常量池里
    System.out.println(s1==s11);//false,两个不同的对象,地址值不同
    System.out.println(s2==s22);//true,堆中同一个对象给了两个对象来保存(两个引用类型变量保存同一个地址,高效)
    //堆中第一次创建"abc"是在常量池新建,第二次常量池直接给。
    s22="qw";
    System.out.println(s2==s22);//false,都在堆中常量池,但是数据不同,指向两个地址

#####################################

    /*Object类中equals()的默认实现是通过==来比较的
    * 但是String类重写了Object中的equals()
    *  重写后,不再按照==比较,而是比较两个字符串的具体内容
    * 也就是说,不论创建方式,只要是串的内容一致,equals()就返回true

#####################################

s.charAt(1);//获取数组下标为1的字符(获取指定下标处的字符)

s.concat(“cxy”);//拼接字符串

System.out.println(s);//拼接字符串不会改变原串,只在打印时生效
String s2 = s.concat(“ahhhahaha”);//将拼接的效果交给s2来保存

#####################################

多线程实现的方案一:继承
1.自定义一个类extends Thread
2.重写run()里面写业务
3.创建线程对象
4.调用start()
注意:可以通过调用父类Tread的含参构造Thread(String name)
给自定义线程对象起名字,调用方式:super(name)

多线程实现的方案二:实现
1.自定义一个类implements Runnable
2.实现接口中未实现的run()
3.打印线程名称:Thread.currentThread().getName()
4.创建目标业务对象----接口实现类的对象–包含的是我们的业务
5.创建线程对象—Thread t1 = new Thread(targert);
目的:为了把实现类与Thread建立关系,原因是想用Thread的start()

Runnable比继承 难 在于总是要绕一步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值