java内部类
内部类
分类:(都生成class文件,生成独立的字节码文件)
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类
都生成class文件,生成独立的字节码文件
内部类可以直接访问外部类的私有成员,而不破坏封装
可以为外部类提供必要的内部功能组件
成员内部类
与实例属性、实例方法同级别的类
先创建外部类对象 ,再创建内部类对象
Outer outer = new Outer()
Inner inner = outer.new Inner();
inner.show();
//一步到位
Inner inner = new Outer().new Inner();
- 在内部类和外部类存在同名的属性值的时候,优先访问内部类同名属性
- 要想访问外部类同名属性:Outer.this.name
- 成员内部类内不能定义静态成员(但可以包含静态常量)
静态内部类
在内部类中加上static
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
- 级别和外部类相同
//创建静态内部类对象
Outer.Inner inner = new Outer.Inner();
局部内部类
-
定义在外部方法中,作用范围和创建对象范围仅限于当前方法
-
不能加任何访问修饰符
-
能直接访问外部类的属性
-
在局部内部类中访问局部变量,局部变量必须是常量为final
匿名内部类
- 没有类名的局部内部类
- 必须继承一个父类或者实现一个接口
- 定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
- 优点:减少代码量
- 缺点:可读性差
//使用匿名内部类(相当于创建了一个局部内部类)
Usb usb = new Usb{//Usb是一个接口名,本来不能new一个接口
//写抽象类也行,父类
@Override
public void service(){
System.out.println("连接电脑成功,风扇开始工作了...");
}
};
Usb.service();
Object类
- 所有类的直接或者间接父类,位于继承树的最顶层
- 任何类都默认间接继承Object或者间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Object类型可以存储任何对象
- 作为参数,可接受任何对象
- 作为返回值,可返回任何对象
getClass()方法
- 返回引用中存储的实际对象类型
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
Student s1 = new Student("name",20);
Student s2 = new Student("name2",30);
Class class1 = s1.getClass();
Class class2 = s2.getClass();
System.out.println(class1);
if(class1==class2){
System.out.println("s1和s2属于同一个类型");
}else{
System.out.println("s1和s2不属于同一个类型");
}
hashCode()
- public int hashCode(){} 返回值为整数,对象的地址
- 返回该对象的哈希吗值
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值
- 一般情况相对对象返回相同的哈希值
//hashCOde()
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
Student s3 = s1;
System.out.println(s3.hashCode());
toString()方法
System.out.println(s1.toString());
//打印出类的具体路径和哈希值,哈希值用十六进制表示
public String toString(){
return name+":"+age;
}//方法可以被重写
equals()方法
- public boolean equals (Object obj){}
public boolean equals(Object obj) {
return (this == obj);
}
//判断两个对象是否相等
System.out.println(s1.equals(s2));
- 可进行覆盖,比较两个对象的内容是否相同
- 比较两个引用是否指向同一个对象
- 判断obj是否为null
- 判断两个引用指向的实际对象类型是否一致
- 强制类型转换
- 依次比较各个属性值是否相同
Student s4 = new Student("小明",20);
Student s5 = new Student("小明",20);
System.out.println(s4.equals(s5));
public boolean equals(Object obj) {
if(this==obj){
return true;
}
if(obj==null){
return false;
}
if(obj instanceof Student){
Student s = (Student) obj;
if(this.name==s.getName()&&this.age==s.getAge()){
return true;
}
}
return false;
}
finalize()方法//方法体为空
- 在对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:由GC销毁垃圾对象,释放数据存储空间
- 字哦东回收机制:JVM的内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收
new Student("aaa",20);
System.gc();
System.out.println("进行了垃圾回收");
--------------------------------------------------
protected void finalize() throws Throwable {
System.out.println(this.name + "进行了垃圾回收");
}
包装类
byte short int long float double boolean char
- 基本数据类型所对应的引用数据类型
- Object可统一所有数据,包装类的默认值是null
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
把放在栈里面的数据放在了堆里
类型转换与装箱、拆箱
装箱:将基本类型数据从栈里放入堆中作为一个对象
拆箱:将堆里的对象放入栈中转化为基本数据类型,使用Number类
XJad可以将字节码文件反编译为源文件
int num = 10;
int number = 100;
//装箱,基本类型转换为引用类型
Integer integer = new Integer(num);
Integer integer1 = Integer.valueOf(number);
System.out.println("integer1 = "+integer1);
System.out.println(integer);
int num1 = integer.intValue();
System.out.println(num1);
//自动装箱
int age = 99;
Integer integer2 = age;
System.out.println(integer2);
int new_age = integer2;
System.out.println(new_age);
基本类型和字符串之间转换
将基本类型变成字符串:toString
字符串变基本类型parseXXX
int n = 15;
String str = Integer.toString(n);
String str1 = Integer.toString(n,14);
System.out.println(str);
System.out.println(str1);
//将字符串转换为基本类型
String str2 = "2019";
int num2 = Integer.parseInt(str2);
System.out.println(num2);
//把boolean字符串转换为基本类型,"true"-->true,||其他都转换为false
String str3 = "treue";
boolean bo = Boolean.parseBoolean(str3);
System.out.println(bo);
整数缓冲区
自动装箱:调用的是Integ.valueOf(),不是new
- Java预先创建了256个常用的整数包装类型对象
- 在实际应用中,对已创建的对象进行复用
Integer integer = 100;//自动装箱,使用的是Integer.valueOf()
Integer integer1 = 100;
System.out.println(integer==integer1);
Integer integer2 = 128;
Integer integer3 = 128;
System.out.println(integer2==integer3);
//整数缓冲区包括-128~127,这256个常用的整数类对象(预先定义好的)
String类
-
字符串是常量,创建之后不可改变
- 赋给字符串新的值,原数据没有变化,只是在方法区开辟了新的值
-
字符串字面值存储在字符串池中,可以共享
- 同值不同名的字符常量,指向字符串池中的统同一数据
-
String s = new String (“Hello”);//产生两个对象,堆、池各存储一个
String str = "java";
String str1 = "java";
//指向的是字符串池中的统一对象
System.out.println(str==str1);
//在堆和方法区中各自创建一个对象
String s = new String("java_");
String s1 = new String("java_");
System.out.println(s==s1);
常用方法
- length();返回字符串的长度
- charAt(int index);返回某个位置的字符
- contains(String str);判断是否包含某个子字符串
String str = "java是很好的语言";
System.out.println(str.length());
System.out.println(str.charAt(0));
System.out.println(str.contains("java"));
System.out.println(str.contains("php"));
- toCharArray():将字符串转换为数组
- indexOf():返回子字符串首次出现的位置
- lastIndexOf():返回字符串最后一次出现的位置
System.out.println(Arrays.toString(str.toCharArray()));
//Arrays.toString()打印数组中的每个元素
System.out.println(str.indexOf("java"));
System.out.println(str.lastIndexOf('a'));
-
trim();去掉字符串前后的空格
-
toUpperCase();将小写转化为大写;toLowerCase();把大写转换为小写
-
endWith(str);判断是否以str结尾,startWith(str);判断是否以str开头
String demo = " hello WORLD "; System.out.println(demo.trim()); System.out.println(demo.toUpperCase()); System.out.println(demo.toLowerCase()); String demo01 = "hello.java"; System.out.println(demo01.startsWith("he")); System.out.println(demo01.endsWith(".java"));
-
replace(char old,char new);用新的字符串替换旧的字符或字符串
-
对字符串进行拆分split("[ ,]")//用中括号可以表示选择
System.out.println(str.replace("java","php"));
String[] strings = str.split("[ ,]+");//使用[]表示选择,空格或者",",+表示可以为多个
System.out.println(strings.length);
System.out.println(Arrays.toString(strings));
for (String string:strings) {
System.out.println(string);
}
-
equalsIgnoreCase():忽略大小写进行比较
-
compareTo():比较在字母表中的大小
String s1 = "hello"; String s2 = "HELLO"; System.out.println(s1.equalsIgnoreCase(s2)); String s3 = "zbc"; String s4 = "ab"; System.out.println(s3.compareTo(s4));
-
sbutring():截取新的字符串
可变字符串
-
StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
-
StringBuilder:可变长字符串,由JDK5.0提供,运行效率快、线程不安全(单线程用的多)
-
效率比String高
-
比String节省内存
append();追加
insert(0,“追加内容”)
replace()替换
delete()删除
清空 delete(0,sb.length())
-
StringBuffer str = new StringBuffer();
str.append("java是世界上最好的语言");
System.out.println(str.toString());
str.insert(0,"有可能");
System.out.println(str.toString());
str.delete(0,3);
System.out.println(str.toString());
str.delete(0,str.length());
System.out.println(str.length());
查看程序开始以及结束需要多长时间:
long start = System.currentTimeMillis();
long end = System.currentTimeMillis();
System.out.println("用时:"+(end-start));
BigDecimal
-
double() 近似值存储类型
-
位于:java.math中
-
除法时注意保留的位数以及舍入模式
- 指定小数部分的舍取模式,通常采用四舍五入的模式
- 取值为BigDecimal.ROUND_HALF_UP
BigDecimal d1 = new BigDecimal("1.0");
BigDecimal d2 = new BigDecimal("0.9");
BigDecimal r1= d1.add(d2);
BigDecimal r2 =d1.subtract(d2);
BigDecimal r3 = d1.multiply(d2);
BigDecimal r4 = d1.divide(d2,2,BigDecimal.ROUND_HALF_UP);
System.out.println(r1 );
System.out.println(r2);
System.out.println(r3);
System.out.println(r4);
BigDecimal r5 = d1.add(d2).divide(new BigDecimal("0.3"),2,BigDecimal.ROUND_HALF_UP );
System.out.println(r5);
Date
- 表示特定的瞬间,精确到毫秒
Date date = new Date();
System.out.println(date.toLocaleString());
Date date1 =new Date(date.getTime()-60*60*24*1000);
System.out.println(date1.toLocaleString());
Boolean b1 = date.before(date1);
System.out.println(b1);
int t1 = date.compareTo(date1);//毫秒值多就返回1,少就返回-1,一样就0
System.out.println(t1);
Boolean b2 = date.equals(date1);
System.out.println(b2);
Calendar
-
Calendar提供了获取或设置各种日历字段的方法
-
构造方法
- proteed Calendar():由于修饰符是protected,所以无法直接创建该对象
Calendar calendar = Calendar.getInstance(); System.out.println(calendar); System.out.println(calendar.getTime().toLocaleString()); System.out.println(calendar.getTimeInMillis());//获取秒数 //获取时间 int year = calendar.get(Calendar.YEAR); int day = calendar.get(Calendar.DAY_OF_MONTH); int hour = calendar.get(Calendar.HOUR_OF_DAY);//HOUR 12小时制 //修改时间 Calendar calendar1 = Calendar.getInstance(); calendar1.set(Calendar.MONTH,0);//月份为0-11 System.out.println(calendar1.getTime().toLocaleString()); //用add方法修改时间 calendar1.add(Calendar.MONTH,1); System.out.println(calendar1.getTime().toLocaleString()); //补充获取每个月最大天数 int max = calendar1.getActualMaximum(Calendar.DAY_OF_MONTH); int min = calendar1.getActualMinimum(Calendar.DAY_OF_MONTH); System.out.println("min = "+min+" max = "+max);
SimpleDateForma类
SimpleDateFormat sdt = new SimpleDateFormat("yyyy年MM月dd日 HH-mm-ss");
Date date = new Date();
//格式化date,将日期转换为字符串
String str = sdt.format(date);
System.out.println(str);
//解析:将字符串转换为日期;如果格式错误会抛出异常
Date date1 = sdt.parse("2000年10月1日 20-30-30");
System.out.println(date1.toLocaleString());
System类
- System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有
方法名 | 说明 |
---|---|
static void arraycopy(...) | 复制数组 |
static long currentTimeMills(); | 获取当前系统时间,返回的是毫秒值 |
static void gc(); | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int sta | 退出JVM,如果参数是0表示正常退出,非0表示异常退出 |
//src:源数组
//srcPos:从哪个位置开始复制
//dest:目标数组的位置
//destPos:目标数组的位置
//length:复制的长度
int[] arr ={20,18,30,58,80,64};
int[] arr1 = new int[6];
System.arraycopy(arr,0,arr1,0,2);
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
System.out.println(Arrays.toString(arr1));
System.gc();
System.exit(0);
System.out.println("程序结束");
千锋教育-新版 Java常用类最新教程