内部类和常用类
内部类
成员内部类
package study;
public class Example {
int age = 1;
class Inner {
//成员内部类不能定义静态成员 可以用final
static int age1=1;//编译报错
static final int age2=2;
int age = 15;
public void show() {
//外部类和内部类存在重名属性时,会优先访问内部类属性
System.out.println(age);//age=15
//如若要访问外部类 外部类名.this.name
System.out.println(Example.this.age);
}
}
}
package study;
//要导入内部类
import study.Example.Inner;
public class Test {
public static void main(String[] args) {
//内部类名 对象名=new 外部类名().new 内部类名();
Inner person = new Example().new Inner();
person.show();
}
}
静态内部类
package study;
public class Example {
int age = 1;
static class Inner {
int age = 15;
public void show() {
System.out.println(age);
//通过类名直接调用外部类静态成员,调用外部类对象要先创建外部对象
Example person = new Example();
System.out.println(person.age);
}
}
}
package study;
//要导入内部类
import study.Example.Inner;
public class Test {
public static void main(String[] args) {
//直接创建内部类对象
Inner person = new Example.Inner();
person.show();
}
}
局部内部类
package study;
//定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
//访问局部变量,变量必须是常量final
public class Example {
String str = "外部类";
void show() {
class Inner {//创建在方法中的类
String str = "内部类";
void show2() {
//输出外部类
System.out.println(Example.this.str);
System.out.println(str);
}
}
Inner inner = new Inner();//创建外部对象
inner.show2();//调用局部内部类方法
}
}
package study;
public class Test {
public static void main(String[] args) {
Example example = new Example();
example.show();
}
}
匿名内部类
//没有类名的局部内部类(一切特征都与局部内部类相同)
//必须继承一个父类或者实现一个借口
//定义类丶实现类丶创建对象的语法合并,只能创建一个该类的对象
//优点:减少代码量 缺点:可读性较差
package study;
public interface Usb {
void lianJie();
}
package study;
public class Mouse implements Usb {//实现接口
@Override
public void lianJie() {
System.out.println("鼠标连接成功...");
Usb usb = new Usb() {//匿名内部类
@Override
public void lianJie() {
System.out.println("风扇连接成功...");
}
};
usb.lianJie();
}
}
package study;
public class Test {
public static void main(String[] args) {
Usb usb=new Mouse();
usb.lianJie();
}
}
常用类
Object类
//getClass();
//判断两个引用中实际存储对象类型是否一致,返回引用中存储的实际对象类型
package study;
public class Student {
int age;
String name;
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//toString();
//默认返回对象类型和十六进制哈希值
@Override
public String toString() {
return age + ", " +name;
}
//equals();
//默认实现为(this==obj),比较两个地址是否相同
//可进行覆盖,比较两个对象的内容是否相同
@Override
public boolean equals(Object obj) {
if (this == obj)//比较地址
return true;
if (obj == null)//判断obj是否为空
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;//强制转换
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//finalize();
//垃圾对象:没有有效引用指向此对象时,为垃圾对象
//自动回收机制:jvm的内存耗尽,一次性回收所有垃圾对象
//手动回收机制:使用System.gc(); 通知jvm执行垃圾回收
@Override
protected void finalize() throws Throwable {
System.out.println(this+"对象被回收了");
}
}
package study;
public class Test {
public static void main(String[] args) {
Student person1 = new Student(16,"张三");
Student person2 = new Student(18,"张三");
Class class1=person1.getClass();//返回参数类型
Class class2=person2.getClass();
if (class1==class1) {
System.out.println("类型相同");
}
//hashCode();
//返回对象的哈希码值
//赋予相同地址
Student person3=person1;
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
//一般情况下相同对象返回相同哈希码,
System.out.println(person3.hashCode());
//运行结果:17, 李四对象被回收了
// 16, 张三对象被回收了
new Student(16,"张三");
new Student(17,"李四");
System.gc();//通知jvm执行垃圾回收
}
}
包装类
package study;
public class Demo {
public static void main(String[] args) {
//装箱和拆箱
int age=15;
//装箱:基本类型转换为引用类型的过程
Integer integer = new Integer(age);
System.out.println(integer);
//拆箱:引用类型转换为基本类型的过程
int num=integer.intValue();
//自动装箱
int age1=30;
Integer integer1=age1;
//系统自动调用Integer.valueOf();
//将int或String转换为Integer
Integer integer3=Integer.valueOf(a1);
//自动拆箱
int num1=integer1;
//基本类型和字符串类型的转换
//int转换String
int a=15;
String a1=Integer.toString(a, 16);
System.out.println(a1);
//String转换int
String str="150";
int a2=Integer.parseInt(str);
System.out.println(a2);
//String转换Boolean
String str2="true1";//非”true“为false
boolean b=Boolean.parseBoolean(str2);
System.out.println(b);
}
}
Integer缓冲区
package study;
public class Demo {
public static void main(String[] args) {
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
//结果为false,两者地址不同
System.out.println(integer1==integer2);
Integer integer3=Integer.valueOf(100);
Integer integer4=Integer.valueOf(100);
//结果为true
//Integer.valueOf()缓冲范围为-128~127,传入数值在此范 围内且数值相同则地址相同
System.out.println(integer3==integer4);
Integer integer5=200;
Integer integer6=200;
//结果为false,超出范围,方法创建新的地址
System.out.println(integer5==integer6);
}
}
String类
package study;
public class Demo {
public static void main(String[] args) {
//在字符串池创建一个对象,地址指向方法区
String str1="a";
String str2="a";
//结果为true
System.out.println(str1==str2);
//在堆和方法区各创建一个对象,地址指向堆
String str3 = new String("a");
String str4 = new String("a");
//false
System.out.println(str3==str4);
//true
//equals() 比较内容
System.out.println(str3.equals(str4));
//false
System.out.println(str1==str4);
//true
System.out.println(str1.equals(str4));
}
}
String常用方法
package study;
public class Demo {
public static void main(String[] args) {
String str="java,java,java";
//length() 返回字符串长度
System.out.println(str.length());
//charAt() 返回指定位置字符,注意从0开始
System.out.println(str.charAt(0));
//contains() 判断是否包含某个字符
//true
System.out.println(str.contains("j"));
//false
System.out.println(str.contains("2"));
//toCharArray() 返回字符串对应的数组
char a[]=str.toCharArray();
//访问返回数组a[4] ,
System.out.println(a[4]);
//indexOf() 返回字符串首次出现的位置
//结果为4
System.out.println(str.indexOf(","));
//结果为5
//从第5个位置开始寻找
System.out.println(str.indexOf(",",5));
//lastIndexOf() 返回字符串最后一次出现的位置
System.out.println(str.lastIndexOf("a"));
String str1=" jAva ";
//trim() 去掉字符串前后的空格
//结果java
System.out.println(str1.trim());
//toUpperCase() 把小写改成大写
//结果JAVA
System.out.println(str1.toUpperCase());
//toLowerCase() 大写改小写
//java
System.out.println(str1.toLowerCase());
String str2="hello.java";
//startsWith(str) 判断是否以str开头
//true
System.out.println(str2.startsWith("hello"));
//endsWith(str) 判断是否以str结尾
//true
System.out.println(str2.endsWith("java"));
//replace() 将新字符串替换原来的字符串
String str2="hello.java";
//输出 hello.php
System.out.println(str2.replace("java","php"));
//split() 将字符串进行拆分
String str3="java is the best ,programing language";
//[]表示选择里面内容进行拆分
//+表示可以选个多个[]里的内容进行拆分
String arr []=str3.split("[ ,]+");
for (String string : arr) {
//换行输出每个单词
System.out.println(string);
}
String str4="hello";
String str5="HELLO";
//结果为false
System.out.println(str4.equals(str5));
//equalsIgnoreCase() 忽略大小写进行比较
//结果为true
System.out.println(str4.equalsIgnoreCase(str5));
//compareTo() 根据编码表位置相减
String s1="abc";//97
String s2="xyz";//120
//从第一个字母开始比较,如果相同则后延
//结果为-23
System.out.println(s1.compareTo(s2));
String s3="abc";
String s4="abcaa";
//如字母相同则比较长度
//-2
System.out.println(s3.compareTo(s4));
//StringBuffer和StringBuilder的使用
//StringBuffer:可变长字符串,JDk1.0提供,运行效率慢丶线程安全 //StringBuilder:可变长字符串,JDk5.0提供,运行效率快丶线程不安全
//和String区别:1.效率比String高 2.比String节省内存
StringBuffer str6 = new StringBuffer();
//StringBuilder str6 = new StringBuffer();
//append() 追加字符串
str6.append("java");
//结果 java
System.out.println(str6.toString());
str6.append("是最好的编程语言");
//结果 java是最好的编程语言
System.out.println(str6.toString());
//insert() 在指定位置添加字符串,注意从0开始 含头不含尾
str6.insert(0,"我在最前面");
//结果 我在最前面java是最好的编程语言
System.out.println(str6.toString());
//replace() 在指点位置替换字符串
str6.replace(0,5,"hello,");
//结果 hello,java是最好的编程语言
System.out.println(str6.toString());
//delete() 删除指定位置字符串
str6.delete(0,6);
//结果 java是最好的编程语言
System.out.println(str6.toString());
//效率快慢体现
// System.out.println(str6.toString());
//System.currentTimeMillis() 获取当前时间
long start=System.currentTimeMillis();
String str=" ";//用时17秒
// StringBuilder str = new StringBuilder();//用时9毫秒
for (int i = 0; i < 99999; i++) {
str+=i;
// str.append(i);
}
System.out.println(str.toString());
long end=System.currentTimeMillis();
System.out.println("用时"+(end-start));
}
}
BigDecimal的使用
package study;
import java.math.BigDecimal; //精确计算浮点数
public class Demo {
public static void main(String[] args) {
//double数据为近似值
double q=1.0-0.9;
//结果 0.09999999999999998
System.out.println(q);
//字符串数值最精准
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
//add() 加法
//因为不是所有的浮点数都能够被精确的表示成一个double 类型 值,有些浮点数值不能够被精确的表示成 double 类型值,因此 它会被表示成与它最接近的 double 类型的值。必须改用传入 String的构造方法。这一点在BigDecimal类的构造方法注释 中有说明。
BigDecimal c1=a.add(b);
System.out.println(c1);
//subtract() 减法
BigDecimal c2=a.subtract(b);
System.out.println(c2);
//multply() 乘法
BigDecimal c3=a.multiply(b);
System.out.println(c3);
//当结果小数位无穷时,要设置保留小数位
//divide(除数,保留几位小数,保留形式) 除法
//ROUND_HALF_UP 四舍五入
BigDecimal c4=new BigDecimal("10").divide(new BigDecimal(3),2,BigDecimal.ROUND_HALF_UP);
System.out.println(c4);
}
}
Date类
//表示特定的瞬间,精确都毫秒。大部分方法已经被Calendar类中的方法取代
package study;
import java.util.Date;//导入类
public class Demo {
public static void main(String[] args) {
Date date1 = new Date();
//输出当前时间
//结果 Wed Apr 14 17:00:32 CST 2021
System.out.println(date1.toString());
//结果 2021-4-14 17:00:32
System.out.println(date1.toLocaleString());
//返回昨天时间
Date date2 = new Date(date1.getTime()-(60*60*24*1000));
//结果2021-4-13 17:00:32
System.out.println(date2.toLocaleString());
//after() 判断date2是否在date1之后
boolean b1=date1.after(date2);
//true
System.out.println(b1);
beforer() 判断date2是否在date1之前
boolean b2=date1.before(date2);
//false
System.out.println(b2);
//compareTO() 比较date1和date2 相等返回0,大于返回1,小于返回-1
int d=date1.compareTo(date2);
// 1
System.out.println(d);
//比较时间是否相同
boolean b3=date2.equals(date1);
//false
System.out.println(b3);
}
}
Calendar类
//提供获取或设置各种字段的方法
package study;
import java.util.Calendar;
public class Demo {
public static void main(String[] args) {
//构造方法:protected Calendar() 修饰符是protected,无法直接创建 该对象
//getinstance() 使用默认时区和区域获取日历
Calendar calendar=Calendar.getInstance();
//getTime() 返回一个Date表示此日历的时间
//toLocaleString() 输出日历格式
System.out.println(calendar.getTime()
.toLocaleString());
//getTimeInMillis() 以毫秒为单位返回该日历的时间值
System.out.println(calendar.getTimeInMillis());
//get(int field) 返回给定字段(如年丶月丶日)的值
int year=calendar.get(Calendar.YEAR);
//月份从0开始
int mouth=calendar.get(Calendar.MONTH);
int day=calendar.get(Calendar.DAY_OF_MONTH);
int hour=calendar.get(Calendar.HOUR_OF_DAY);
//分
int minute=calendar.get(Calendar.MINUTE);
//秒
int second=calendar.get(Calendar.SECOND);
System.out.println(year+"年"+(mouth+1)+"月"+day+"日"+hour+":"+minute+":"+second);
//set() 修改指定字段的值
calendar.set(Calendar.YEAR,2022);
//输出年份为2022
System.out.println(calendar.getTime().toLocaleString());
//add() 指定字段的增加
calendar.add(Calendar.YEAR,-5);
//结果 2017 (2022-5)
System.out.println(calendar.getTime(). toLocaleString());
//getActualMaximum(); 指定字段最大值
int max = calendar.getActualMaximum(Calendar.MONTH);
//11 月份是0~11
//getActualminimum(); 指定字段最小值
//结果 1
int min = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
System.out.println(max + " " + min);
}
}
SimpleDateFormat类
//SimpleDateFormat是一个以与语言环境有关的方式老格式化和解析日期的具体类
//进行格式化(日期转文本)丶解析(文本转日期)
package study;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo {
public static void main(String[] args) throws Exception{//抛出异常
//y年 M月 d天 H小时 m分 s秒 S毫秒 小大小大小小大
//设置日历格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
//sdf.format(date) 格式化date(把日期转成字符串)
String str=sdf.format(date);
System.out.println(str);
//sdf.parse() 解析(把字符串转成日期)
Date date2=sdf.parse("1990-05-22");
System.out.println(date2);
}
}
System类
//System类内方法是私有属性,可以直接调用
package study;
public class Demo {
public static void main(String[] args){
int arr[]= {1,2,3,4,5,6};
int dest[]=new int[6];
//arraycopy(源数组,从哪个位置开始复制,复制到哪个数组,目标数组位置,复制的长度);
System.arraycopy(arr,2,dest,1,3);
//结果 0 3 4 5 0 0
for (int i : dest) {
System.out.print(i+" ");
}
//.exit() 退出jvm,参数是0表示正常退出jvm,非0表示异常退出
System.exit(0);
System.out.println("程序结束了...");
}
}