Java常用类
内部类
内部类大体分为四种:
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类
//外部类
public class Outer{
private String name = "张三";
//...
public class Inner{
//成员内部类
private String name = "李四";
//private static int age = 18;//不被允许
private static final int age = 18;//静态常量,允许
public void show(){
System.out.println(Outer.this.name);
}
//...
}
}
成员内部类可以访问外部类的私有属性
如果成员内部类的属性和外部类的属性重名,但是想要使用外部类的属性的时候可以使用“外部类类名.this.属性名”。eg:Outer.this.name
成员内部类不能定义静态成员
可以包含静态常量
关于如何创建内部类对象:
Outer out = new Outer();
Inner in = out.new Inner();
内部类对象的创建必须依赖外部类对象
静态内部类
public class Outer{
private String name = "张三";
private int age = 20;
//静态内部类,和外部类相同
public static class Inner{
private String address = "地球";
private static int age = 18;//静态成员是允许的
public void show(){
//调用外部类属性
Outer outer = new Outer();
System.out,println(outer.name);
System.out,println(outer.age);
//调用内部类属性
System.out,println(address);
//调用静态属性
System.out,println(Inner.age);
}
}
}
关于静态内部类调用外部类属性:
先创建外部类对象
调用内部类对象的属性
直接创建静态内部类对象
Outer.Inner in = new Outer.Inner();
局部内部类
定义在外部类的方法中,作用范围和创建对象仅限于当前方法。
public class Outer {
private String name = "张三";
private int age = 18;
public void show(){
String address = "上海";
//局部内部类:不能加任何访问修饰符
class Inner{
private String phone = "121321-123";
private String email = "123@qq.com";
public void show1(){
//访问外部类属性
System.out.println(Outer.this.name);
System.out.println(age);
//访问内部类属性
System.out.println(this.phone);
System.out.println(email);
//访问局部变量,jdk1.7,变量必须加final,jdk1.8自动添加fianl
System.out.println(address);
}
}
//创建局部内部类对象
Inner in = new Inner();
in.show1();
}
}
创建局部内部类对象需要在方法体内创建,进而使用。
访问局部变量的时候,jdk1.7中变量必须加final,jdk1.8自动添加fianl
匿名内部类
类似于没有类名的局部内部类
必须继承一个父类或实现一个接口
//接口Usb
public interface Usb{
void service();
}
//Test类
public class Application {
public static void main(String[] args) {
//匿名内部类
Usb usb = new Usb(){
@Override
public void service(){
System.out.println("风扇开始工作...");
}
}
usb.service();
}
}
Object类
超类、基类,所有类的直接或者间接父类,继承树的最顶层
任何类如果没有extends某个类,都是直接继承Object类,否则就是间接继承Object类
Object类中所定义的方法,是所有对象都具备的方法
Object类型可以存储任何对象
getClass()方法
示例代码:
package com.huaji.demo3;
public class Person {
public int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
package com.huaji;
import com.huaji.demo3.Person;
public class Application {
public static void main(String[] args) {
Person p = new Person(1,"huaji");
System.out.println(p.getClass());
System.out.println(p.getClass().getName());
System.out.println(p.getClass().getSimpleName());
System.out.println(p.id);
}
}
运行结果:
class com.huaji.demo3.Person
com.huaji.demo3.Person
Person
1
getClass()方法是获得调用该方法的对象的类;getClass().getName()可以得到该类的路径;
通过getClass()方法得到该对象类Class后,可以通过Class获取这个类中的相关属性和方法;
hashCode()方法
public int hashCode(){}
返回该对象的哈希码值
哈希值是根据对象的地址或字符串或字符串使用hash算法计算出来的int类型的数值
一般情况下相同的对象返回相同哈希码
public class Application {
public static void main(String[] args) {
Person p = new Person(1,"huaji");
System.out.println(p.hashCode());
}
}
356573597
toString()方法
public String toString(){}
返回该对象的字符串表示
可以根据需求覆盖此方法
equals()方法
public boolean equals(Object obj){}
默认实现为(this==obj),比较两个对象地址是否相同
可进行覆盖,比较两对象内容是否相同
关于重写equals为比较俩对象内容是否相同:
public class Student{
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
@Override
public boolean equals(Object obj) {
//1.判断两对象是否是同一个引用
if (this==obj){
return true;
}
//2.判断obj是否null
if (obj==null){
return false;
}
//3.判断是否是同一类型
if (obj instanceof Student){
//4.强制类型转换
Student s = (Student)obj;
//5.判断属性是否相等
if (this.name.equals(s.getName()))
return true;
}
return false;
}
}
finalize()方法
protected void finalize() throws Throwable { }
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
垃圾对象:没有有效引用指向此对象时,为垃圾对象
垃圾回收:由GC销毁垃圾对象,释放数据存储空间(Garbage Collection,垃圾收集,垃圾回收)
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
手动回收机制:使用System.gc();通知JVM执行垃圾回收
使用情况:
finalize()方法中一般用于释放非Java 资源(如打开的文件资源、数据库连接等),或是调用非Java方法(native方法)时分配的内存(比如C语言的malloc()系列函数)。
为什么避免使用:
首先,由于finalize()方法的调用时机具有不确定性,从一个对象变得不可到达开始,到finalize()方法被执行,所花费的时间这段时间是任意长的。我们并不能依赖finalize()方法能及时的回收占用的资源,可能出现的情况是在我们耗尽资源之前,gc却仍未触发,因而通常的做法是提供显示的close()方法供客户端手动调用。
另外,重写finalize()方法意味着延长了回收对象时需要进行更多的操作,从而延长了对象回收的时间。
包装类
基本数据类型所对应的引用数据类型。eg:int->Integer,byte->Byte,float->Float.....
Object可统一所有数据,包装类的默认值是null
类型转换
装箱
基本类型转换成引用类型的过程
int num=10;
//使用Integer类创建对象
Integer integer=new Integer(num);//方法一
Integer integer1=Integer.valueOf(num);//方法二
拆箱
引用类型换成基本类型转的过程
Integer integer=new Integer(100);
int num=Integer.intValue();//jdk1.5之前的方式
jkd1.5以后,Java提供自动装箱拆箱
int age=10;
//自动装箱
Integer integer=age;
//自动拆箱
int age1=integer;
基本类型和字符串之间转换
基础类型转换成字符串的过程
int n=100;
//1.使用+
String s1=n+"";
//2.使用Integer的toString()方法
String s2=Integer.toString(n);
字符串转换成基础类型的过程
String str="150";
//使用Integer。parseXXX()
int n=Integer.parseInt(str);
String 类
String对象的值存储在字符串常量池中,常量池位于堆内存中
字符串的比较中,“==“表示的是对地址的比较,equals的话,先比较引用,如果引用相等,返回值为true,如果引用不相等,再比较值,如果值相等,返回值也是true,只有当引用和值都不相等的情况下,返回的才是false。
new的话会在堆中创建一个对象,一个new对应一个对象
String s1=new String("张三");
String s2=new String("张三");
System.out.println(s1==s2);//false,由于==比较的是地址,尽管内容都是“张三”,但是s1和s2在栈中对应不同的地址
String s3="张三";
String s4="张三";
System.out.println(s3==s4);//true,s1指向字符串常量池中的“张三”,s4也指向字符串常量池中的“张三”,所以它两地址相同
int length(); 语法:字符串变量名.length(); 返回值为 int 类型。得到一个字符串的字符个数(中、英、空格、转义字符皆为字符,计入长度)
char charAt(值); 语法 :字符串名.charAt(值); 返回值为 char 类型。从字符串中取出指定位置的字符
char toCharArray(); 语法 :字符串名.toCharArray(); 返回值为 char 数组类型。将字符串变成一个字符数组
int indexOf("字符") 语法 :字符串名.indexOf("字符");字符串名.indexOf("字符",值);查找一个指定的字符串是否存在,返回的是字符串的位置,如果不存在,则返回-1 。 in lastIndexOf("字符") 得到指定内容最后一次出现的下标
toUpperCase(); toLowerCase();字符串大小写的转换
String[] split("字符") 根据给定的正则表达式的匹配来拆分此字符串。形成一个新的String数组。
boolean equals(Object anObject) 语法 :字符串变量名.wquals(字符串变量名); 返回值为布尔类型。所以这里用 if 演示。比较两个字符串是否相等,返回布尔值
trim(); 去掉字符串左右空格 replace(char oldChar,char newChar);新字符替换旧字符,也可以达到去空格的效果一种。
String substring(int beginIndex,int endIndex) 截取字符串,beginIndex表示索引开始的位置,endIndex表示索引结束的位置
boolean equalsIgnoreCase(String) 忽略大小写的比较两个字符串的值是否一模一样,返回一个布尔值
boolean contains(String) 判断一个字符串里面是否包含指定的内容,返回一个布尔值
boolean startsWith(String) 测试此字符串是否以指定的前缀开始。返回一个布尔值
boolean endsWith(String) 测试此字符串是否以指定的后缀结束。返回一个布尔值
String replaceAll(String,String) 将某个内容全部替换成指定内容,String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
StringBuffer类和StringBuilder类
StringBuffer:可变长字符串,jkd1.0提供,运行效率慢、线程安全
StringBuilder:可变长字符串,jkd1.5提供,运行效率快、线程不安全
都比String效率高、节省内存
StringBuffer sb=new StringBuffer();
//StringBuild sb=new StringBuild();
//1.append();追加
sb.append("java世界第一");
System.out.println(sb.toString());
sb.append("java真香");
System.out.println(sb.toString());
sb.append("java太香啦");
System.out.println(sb.toString());
//2.insert();添加
sb.insert(0,"我在最前面");
System.out.println(sb.toString());
//3.replace();替换
sb.replace(0,5,"hello");
System.out.println(sb.toString());
//4.delete();删除
sb.delete(0,5);
System.out.println(sb.toString());
运行结果:
java世界第一
java世界第一java真香
java世界第一java真香java太香啦
我在最前面java世界第一java真香java太香啦
hellojava世界第一java真香java太香啦
java世界第一java真香java太香啦
BigDecimal类
由于float、double都是近似值存储,所有此类数据进行运算的话会产生误差,尽管误差不大,但在某些需求高精度的领域就会产生影响,所以引进使用BigDecimal类
java.math包内
一般想要精确计算的话,传进的值尽量使用字符串形式
BigDecimal bd1=new BigDecimal("1.0");
BigDecimal bd2=new BigDecimal("0.9");
//减法
BigDecimal r1=bd1.subtract(bd2);
System.out.println(r1);
//加法
BigDecimal r2=bd1.add(bd2);
System.out.println(r2);
//乘法
BigDecimal r3=bd1.multiply(bd2);
System.out.println(r3);
//除法
BigDecimal r4=new BigDecimal("1.4")
.subtract(new BigDecimal("0.5"))
.divide(new BigDecimal("0.9"));
System.out.println(r4);
运行结果:
0.1
1.9
0.90
1
除法:divide(BigDecimal bd,int scal,RoundingMode mode) 参数scal:制定精确到小数点后几位 参数mode:指定小数部分的取舍模式,通常使用四舍五入(BigDecimal.ROUND_HALF_UP)
Date类
Date表示特定的瞬间,精确到毫秒。Date中大部分方法都已经被Calendar类中的方法所取代
Calendar类
Calendar为抽象类,无法直接创建对象使用,里面有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象。static Calendar getInstance() 使用默认时区和语言环境获取一个日历
// 多态
Calendar c = Calendar.getInstance();
Syste.out.println(c);
get方法
public int get(int field):返回给定日历字段的值
参数:传递指定的日历字段(YEAR,MONTH...)
返回值:日历字段代表的具体的值
Copypublic static void main(String[] args) {
demo01();
}
public static void demo01(){
// 使用getInstance方法获取Calendar对象
Calendar c = Calendar.getInstance();
System.out.println(c);
int year = c.get(Calendar.YEAR);
System.out.println(year);
int mouth = c.get(Calendar.MONTH);
// 西方月份0-11 东方月份1-12
System.out.println(mouth);
int date = c.get(Calendar.DAY_OF_MONTH);
System.out.println(date);
int date2 = c.get(Calendar.DATE);
System.out.println(date2);
}
set方法
public void set(int field,int value):将给定的日历字段设置为给定值
参数:
int field:传递指定的日历字段(YEAR,MONTH...)
int value:给指定的字段设置值
Copypublic static void main(String[] args) {
demo02();
}
public static void demo02(){
// 使用getInstance方法获取calendar对象
Calendar c = Calendar.getInstance();
System.out.println(c);
c.set(999,6,6);
// 获取年
c.set(Calendar.YEAR,666);
int year = c.get(Calendar.YEAR);
System.out.println("系统时间:"+year);
System.out.println("重新设置年::"+year);
// 重新设置月
c.set(Calendar.MONTH,6);
int month = c.get(Calendar.MONTH);
System.out.println("月份:"+month);
// 重新设置日
c.set(Calendar.DATE,11);
// 获取日
int date = c.get(Calendar.DATE);
System.out.println(date);
c.set(999,6,6);
System.out.println(year+"年"+month+"月"+date+"日");
}
add方法
public abstract void add(int field,int amount):根据日历的规则,得指定的日历字段添加或者减去指定的时间量把指定的字段量增加/减少指定的值
参数:
int field:传递指定的日历字段(YEAR,MONTH...)
int amount:增加/减少指定的值
正数:增加
负数:减少
public static void main(String[] args) {
demo03();
}
public static void demo03(){
Calendar c = Calendar.getInstance();
// 增加两年
c.add(Calendar.YEAR,2);
int year = c.get(Calendar.YEAR);
System.out.println(year);
// 减少两个月
c.add(Calendar.MONTH,-1);
int month = c.get(Calendar.MONTH);
System.out.println(month);
}
getTime方法
Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。
格式:
public Date getTime():返回一个表示此calendar时间值(从历元到现在的毫秒值偏移量)的Date对象
把日历对象,转换为日期对象
public static void main(String[] args) {
demo04();
}
public static void demo04(){
// 使用getInstance方法获取calendar对象
Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date);
// Thu Mar 12 23:20:35 CST 2020
}
SimpleDateFormat类
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
进行格式化(日期->文本)
解析(文本->日期)
public static void main(String[] args) throws ParseException {
//1.创建SimpleDateFormat对象y年M月
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);
//解析
Date date1=sdf.parse("2008年08月08日08:08:08");
System.out.println(date1);
}
运行结果:
2020年09月15日21:49:28
Fri Aug 08 08:08:08 CST 2008
System类
主要用于获取系统的属性数据和其他操作,构造方法私有
static void arraycopy(...) 复制数组
static long currentTimeMillis() 获取当前系统时间,返回的是毫秒值
static void gc() 建议JVM赶快启动垃圾回收器回收垃圾
static void exit(int status) 退出JVM,如果参数是0表示正常退出JVM,非0表示异常退出JVM