1、内部类:定义在类的内部的类,叫做内部类
内部类:在一个类的内部再定义一个完整的类。(注:内部类也会生成class文件)
//身体类(身体包括头部,其实我好像记得h5中好像头部和身体是各自的)
class Body{
class Header{
}
}
特点:内部类可以直接访问外部类的私有成员,而不破坏封装。
成员内部类:相当于成员变量或成员方法的,位置也与它们一致
- 成员内部类的实例化必须首先创建外部类的实例。
//创建外部对象
Body body=new Body();
//创建内部类对象
Header header=body.new Header();
//也可以直接一步进行创建
//Header header=new Body().new Header();
- 当外部类、内部类存在重名属性时,会优先访问内部类属性。(所以,当你需要外部类的重名的属性时,你要使用 “类名.this.属性名”)
- 成员内部类不能定义静态成员的(但是可以包含静态常量)
静态内部类:在成员内部类的基础上,定义类的时候,加上static(静态内部类相当于一个外部类,外部类可以有的内容,它都可以有)
- 不依赖外部类对象,可直接创建或通过类名进行访问,可声明静态成员。
//创建静态内部类对象
Inner in=new Outer.Inner();//切记这里不是创建Outer对象,而只是表明了一种包含关系,如果创建的话就应该是new Outer()了
- 在静态内部类中调用外部类的属性,需要先创建外部类的对象,再进行调用
//调用外部类的属性(首先需要创建外部类的对象)
Outer out=new Outer();
System.out.println(out.name);
注:只能内部类才可以用static修饰,普通类不可以。
局部内部类:定义在方法的内部(作用范围仅限于当前方法)
匿名内部类:顾名思义就是没有名字的类
2、Object类:是所有类的超级父类,基类
- getClass()方法(返回值类型 Class)
//判断stu1与stu2是不是同一个类型
Class class1 = stu1.getClass();
Class class2=stu2.getClass();
if(class1==class2) {
System.out.println("属于同一个类型");
}else {
System.out.println("不属于同一个类型");
}
- hashCode() (返回值类型 int)
//hashCode()
System.out.println(stu1.hashCode());
- toString() (返回值类型为String ) 可以重写(当父类的方法满足不了子类的时候,重写父类的方法即可)
//toString()
System.out.println(stu1.toString());
- equals() (返回值类型是布尔类型)
//equals() 比较两个对象的地址是否一样
System.out.println(stu1.equals(stu2));
重写Object类的equals()方法,让比较的是内容。
public boolean equals(Object obj) {
//1.判断两个对象是否为同一个引用
if(this==obj) {
return true;
}
//2.判断obj是否为null
if(obj==null) {
return false;
}
//3.是否是同一个类型
// if(this.getClass()==obj.getClass()) {
//
// }
if(obj instanceof Student) {
//4.强制类型转换
Student s=(Student)obj;
//5.比较属性
if(s.getAge()==this.getAge()&&s.getName()==this.getName()) {
return true;
}
}
return false;
}
//equals()
Student stu4=new Student("小明", 20);
Student stu5=new Student("小明", 20);
System.out.println(stu4.equals(stu5));//true
- finalize()方法 该方法在Object中是个空方法,所以必须自己重写,它的作用是当对象判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。那么什么是垃圾对象呢?垃圾对象:没有有效的引用指向此对象时,为垃圾对象。垃圾回收:由GC销毁垃圾对象,释放数据存储空间。自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象。
手动回收机制:使用System.gc()方法:通知JVM进行垃圾回收。
new Student("a",10);//这个会被回收,因为它是垃圾对象
Student s2=new Student("b",10);
Student s3=new Student("c",10);
System.gc();
System.out.println("回收");
3、包装类:(8种基本数据类的包装类)
包装类也就是对8种基本的数据类型进行包装,也就是基本数据类型所对应的引用数据类型。注:基本数据类型保存在栈中,引用数据类型保存在堆中。
4、String类
一、
- 字符串一旦创建,就不可改变。
String name="hello";
name="zhangsan";
//name修改,是在方法区中的字符串池中重新开辟一份空间。而并不是把"hello"改成“zhangsan”。name指向“zhangsan”的空间
String name2="zhangsan";//此时就会直接指向方法区中字符串常量池的"zhangsan".
/**
这样的话就实现了字符串的共享
*/
- 字符串字面值存储在字符串池中,可以共享。
- String s=“Hello”;产生一个对象,字符串池中存储
- String s=new String(“Hello”);//产生两个对象,堆、池中各存储一个
常用方法
- public int length():返回字符串的长度
- public char charAt(int index):根据下标获取字符
- public boolean contains(String str):判断当前字符串中是否包含str
String str="窗前明月光,疑是地上霜,举头望明月,低头思故乡.";
//1.length()返回字符串的长度
System.out.println(str.length());//24
//2.charAt(int index)返回某个位置的字符
System.out.println(str.charAt(2));//明
//3.contains(String str);判断是否包含某个字符串
String s="十年生死两茫茫,不思量,自难忘.";
System.out.println(str.contains(s));//false
- public char[] toCharArray()将字符串转换成数组
- public int indexOf(String str):查找str首次出现的下标,存在则返回该下标;不存在,则返回-1
- public inr lastIndexOf(String str):查找字符串在当前字符串中最后一次出现下标的索引。
String str1="人生就是一场旅行,旅行途中,你可以选择徒步,你可以选择骑车旅行,你可以选择绿皮火车,总之,这取决于你的选择";
//4.toCharArray() 返回字符串对应的数组
char[] chars=str1.toCharArray();
System.out.println(chars);
//5.indexOf()查找字符串首次出现的位置
int index=str1.indexOf("人");
System.out.println(index);//0
//6.lastIndexOf()查找字符串最后出现的位置
int index1=str1.lastIndexOf("你可以");
System.out.println(index1);//32
- public String trim():去掉字符串前后的空格
- public String toUpperCase():将小写转成大写
- public boolean endWith(String str):判断字符串是否以str结尾
String str2=" hello , I love my inner world ! ";
// 7.public String trim():去掉字符串前后的空格
String s1=str2.trim();//hello , I love my inner world !
System.out.println(s1);
// 8. public String toUpperCase():将小写转成大写 ; toLowerCase()把大写转换成小写
String s2=str2.toUpperCase();
System.out.println(s2);// HELLO , I LOVE MY INNER WORLD !
// 9. public boolean endWith(String str):判断字符串是否以str结尾
boolean b=str2.endsWith("! ");
System.out.println(b);//true
boolean b1=str2.endsWith("!");
System.out.println(b1);//false
- public String replace(char oldChar,char new Char):将旧字符串替换成新的字符串
- public String[] split(String str):根据str做拆分
String str3="java 是 世界上 最好的 编程语言";
// 10. public String replace(char oldChar,char new Char):将旧字符串替换成新的字符串
String s3=str3.replace("java","php");
System.out.println(s3);//php 是 世界上 最好的 编程语言
// 11. public String[] split(String str):根据str做拆分
String [] s4=str3.split(" ");
System.out.println(s4);//[Ljava.lang.String;@15db9742
//遍历数组
for(String s_1:s4) {
System.out.println(s_1);
// java
// 是
// 世界上
// 最好的
// 编程语言
}
小案例:
/**
* 已知String str="this is a text";
* 1.将str中的text的单词单独获取出来
* 2.将str中的text替换成practice
* 3.在text前面插入一个easy
* 4.将每个单词的首字母改为大写
*/
String str="this is a text";
// 1.将str中的text的单词单独获取出来
String [] strs=str.split(" ");
//遍历数组
for(String s:strs) {
System.out.println(s);
/**
* this
is
a
text
*/
}
//2.将str中的text替换成practice
String str_1=str.replace("text", "practice");
System.out.println(str_1);//this is a practice
//3.在text前面插入一个easy
String str_2=str.replace("text", "easy text");
System.out.println(str_2);//this is a easy text
//4.将每个单词的首字母改为大写
for(int i=0;i<strs.length;i++) {
char firstName=strs[i].charAt(0);
char upFirstName=Character.toUpperCase(firstName);
String news=upFirstName+strs[i].substring(1);//subString()拼接
System.out.print(news+" ");//This Is A Text
}
二、可变字符串 StringBuffer和StringBulider
StringBuffer和StringBulider都比String的效率要高,而且还比较节省内存。不同的是StringBuffer运行效率要比StringBulider慢,但是StringBuffer的线程更加安全。
- 常用方法
StringBuffer sb=new StringBuffer();
//StringBulider sb=new StringBulider();//与StringBuffer功能一样
//1.append()追加字符
sb.append("生活如一盏茶");
System.out.println(sb);//生活如一盏茶
System.out.println(sb.toString());//生活如一盏茶
sb.append("越品越香");
System.out.println(sb);//生活如一盏茶越品越香
//2.insert()插入
sb.insert(0, "生活点评:");
System.out.println(sb);//生活点评:生活如一盏茶越品越香
//3.replace()替换
sb.replace(0, 5, "hello");
System.out.println(sb);//hello生活如一盏茶越品越香
//4.delete()删除
sb.delete(0, 5);
System.out.println(sb);//生活如一盏茶越品越香
//5.delete()清空
sb.delete(0, sb.length());
System.out.println(sb);//无字符串
System.out.println(sb.length());//0
- 验证StringBuffer与String之间的效率差异
long start=System.currentTimeMillis();
String str="";
for(int i=0;i<99999;i++) {
str+=i;
}
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));//耗时:22438
long start=System.currentTimeMillis();
StringBuffer sb=new StringBuffer();
for(int i=0;i<99999;i++) {
sb.append(i);
}
long end=System.currentTimeMillis();
System.out.println("耗时:"+(end-start));//耗时:14
5、BigDecimal类
double d1=1.0;
double d2=0.9;
System.out.println(d1-d2);//0.09999999999999998
很多实际应用中需要精确运算,而double是以近似值进行存储,不符合要求,所以需要借助BigDecimal
BigDecimal:位置在java.math包中,作用:精确计算浮点数。
创建方式:BigDecimal bd=new BigDecimal(“1.0”);
//BigDecimal
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//substract()减法
System.out.println(bd1.subtract(bd2));//0.1
方法:
- BigDecimal add(BigDecimal bd) 加
- BigDecimal substract(BigDecimal bd) 减
- BigDecimal divide(BigDecimal bd) 除
- BigDecimal multiply(BigDecimal bd) 乘
6.Date类
//1.创建Date对象
//今天
Date date=new Date();
System.out.println(date);//Sun Sep 27 09:09:17 CST 2020
//昨天
Date date1=new Date(date.getTime()-24*60*60*1000);
System.out.println(date1.toLocaleString());//2020-9-26 9:13:15
//2.after before
System.out.println(date.after(date1));//true
System.out.println(date1.before(date));//true
System.out.println(date.before(date1));//false
7.Calendar
Calendar类提供了获取或设置各种日历字段的方法
构造方法:
protected Calendar():由于修饰符是protected,所以无法直接创建该对象,但是 该类提供了一个静态方法getInstance()
//创建Calendar对象
Calendar calendar=Calendar.getInstance();
//1.打印时间
System.out.println(calendar.getTime().toLocaleString());//2020-9-27 9:42:18
//2.获取时间信息
//获取年
int year=calendar.get(Calendar.YEAR);
System.out.println(year);//2020
//月
int month=calendar.get(Calendar.MONTH)+1;
System.out.println(month);//9
//日
int day=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(day);//27
//小时
int hour=calendar.get(Calendar.HOUR_OF_DAY);
System.out.println(hour);//9
//分钟
int minutes=calendar.get(Calendar.MINUTE);
System.out.println(minutes);//42
//秒
int seconds=calendar.get(Calendar.SECOND);
System.out.println(seconds);//18
System.out.println("当前时间为:"+year+"年"+month+"月"+day+"日"+hour+"时"+minutes+"分"+seconds+"秒");//当前时间为:2020年9月27日9时42分18秒
//3.设置修改时间
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH, 10);
System.out.println(calendar2.getTime().toLocaleString());//2020-9-10 9:54:10
//4.add方法修改时间
calendar2.add(Calendar.HOUR, 1);
System.out.println(calendar2.getTime().toLocaleString());//2020-9-10 10:54:10
//5.获取当前月天数最多和最少
int days=calendar2.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println("当前月最大一天:"+days+"号");//30号
int days2=calendar2.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println("当前月最小一天:"+days2+"号");//1号
8.SimpleDateFormat类
//1.创建SimpleDateFormat对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//2.创建Date
Date date=new Date();
//格式化date
String str=sdf.format(date);
System.out.println(str);//2020年09月27日 10:08:11
9.System类
System系统类,主要用于获取系统的属性数据和其他操作,构造方法是私有的。
- static void arraycopy() 复制数组
- static long currentTimeMillis(); 获取当前系统时间,返回的是毫秒值(主要用于计算某段代码的用时)
- static void gc(); 建议JVM赶快启动垃圾回收期回收垃圾
- static void exit(int status); 退出JVM,如果参数是0代表正常退出JVM,非0代表异常退出JVM
//1.arraycopy()实现数组的复制
// System.arraycopy(src, srcPos, dest, destPos, length);
//src 源数组
//srcPos :从哪个位置开始复制
//dest:目标数组
//destPos:目标数组的位置
//length:复制的长度
int [] arr= {20,322,23,24,7,8,4,2,23,675,645};
int [] dest=new int[11];
System.arraycopy(arr, 0, dest, 0, arr.length);
for(int i:dest) {
System.out.print(i+" ");//20 322 23 24 7 8 4 2 23 675 645
}
//其他的方法在上面都有用过,在这里不再赘述。