内部类与常用类
内部类
内部类分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yf3Qb0pw-1648535440981)(D:\笔记\JAVA内部类与常用类\photo\IMG_1286(20220327-085701)].PNG)
- 内部类概念:在一个类的内部再定义一个完整的类
- 特点:编译之后生成独立的字节码文件
- 内部类可以直接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
成员内部类
-
在类的内部定义,与实例变量、实例方法同级别的类
-
外部类的一个实力部分,创建内部类对象时,必须依赖外部类对象
-
成员内部类不能包含静态成员,但可以包含静态常量
-
package com.wly.Dome; //外部类 public class Outer { //实例变量 private String name="张三"; private int age=21; //创建内部类 class Inter{ private String address="北京"; private String phone="7265438"; private String name="李四";//name被内部类覆盖 //方法 public void show(){//可以访问成员内部类final常量 //打印外部类的属性 System.out.println(Outer.this.name);//被覆盖下访问外部类属性name System.out.println(this.name); System.out.println(age); System.out.println(address); System.out.println(phone); } } }
-
package com.wly.Dome; public class TestOut { public static void main(String[] args) { // //创建外部类对象 // Outer outer=new Outer(); // //创建内部类对象 // Outer.Inter inter=outer.new Inter(); //一步到位 Outer.Inter inter=new Outer().new Inter(); inter.show(); } }
静态内部类
-
static
-
不依赖外部类对象,可以直接创建或通过类名访问,可声明静态成员
-
package com.wly.Dome; //外部类 public class Outer { //实例变量 private String name="张三"; private int age=21; //创建静态内部类和外部类级别一样 static class Inter{ private String address="北京"; private String phone="7265438"; //静态成员 private static int nameId=12; //方法 public void show(){ //访问外部类属性需先创建外部类对象 Outer outer=new Outer(); System.out.println(outer.name); System.out.println(outer.age); //内部类可以直接调用 System.out.println(address); System.out.println(phone); //调用静态成员 System.out.println(Inter.nameId); } } }
-
package com.wly.Dome; public class TestOut { public static void main(String[] args) { Outer.Inter inter=new Outer.Inter();//.包含关系 inter.show(); } }
局部内部类
-
定义在外部类方法中,作用范围和创建对象仅限于当前方法
-
局部变量不能加任何访问修饰符
-
局部内部类方法访问外部类方法的局部变量时,无法保证变量的生命周期与自身相同,变量必须修饰final
-
package com.wly.Dome; //外部类 public class Outer { //实例变量 private String name="张三"; private int age=21; public void show(){ String address="北京"; //局部内部类 class Inner{ private String phone="7265438"; private int nameId=23; public void show2(){ //访问外部类属性 System.out.println(Outer.this.name); System.out.println(age); //访问内部类属性 System.out.println(this.phone); System.out.println(nameId); //局部内部类方法中访问局部变量,1.7之前必须是常量final,1.8自动添加final System.out.println(address); } } //创建局部类对象 Inner inner=new Inner(); inner.show2(); } }
-
package com.wly.Dome; public class TestOut { public static void main(String[] args) { Outer outer=new Outer(); //直接调用外部类方法没有结果 //需在外部方法创建局部类对象才能调用局部内部类方法 outer.show(); } }
匿名内部类
-
没有类名的局部内部类
-
必须继承一个父类或实现一个接口
-
定义类、实现类、创建对像的语法合并,只能创建一个该类的对象
-
package com.wly.Dome; public interface Usb { void service(); }
-
package com.wly.Dome; public class Mouse implements Usb{ @Override public void service() { System.out.println("========"); } }
-
package com.wly.Dome; public class TestUsb { public static void main(String[] args) { // Usb usb=new Mouse(); // usb.service(); //局部内部类 // class Fan implements Usb{ // // @Override // public void service() { // System.out.println("+++++++++++++"); // } // } // //使用局部内部类创建对象 // Usb usb=new Fan(); // usb.service(); //匿名内部类 Usb usb=new Usb() { @Override public void service() { System.out.println("+++++++++++++"); } }; usb.service(); } }
Object类
- 超类、基类、所有类直接或间接继承父类,位于继承树最顶层
- 任何类,没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承
- Object类中所定义的方法,是所有对象都具备的方法
- Object对象可以存储任何对像(作为参数,可接受任何对像;作为返回值,可返回任何对象)
Object类常用方法
getClass方法
- 返回引用中存储的实际对象
- 应用:用于判断两个引用中实际存储对象类型是否一致
hashCode方法
- 返回该对象的哈希码值
- 哈希值根据对象的地址或字符串或数字使用hash算法计算出的int类型数值。
- 一般情况,相同对象返回相同哈希码
toString方法
- 返回该对象的字符串表示(表示形式)
- 可以根据程序需求覆盖该方法,如:展示对象各个属性值
equlas方法
- 默认实现为(this==obj){}
- 可进行覆盖,比较两个对象内容是否相同
- 可进行覆盖,比较两个对象的内容是否相同
- equlas()方法覆盖步骤
- 比较两个引用是否指向同一对象
- 判断obj是否为null
- 判断两个引用指向的实际类型是否一致
- 强制类型转换
- 依次比较个属性值是否相同
finalize方法
- 当对象被判定为垃圾对象时,由JVM调用此方法,用以标记垃圾对象
- 垃圾对象:没有有效引用指向此对象时,为垃圾对象
- 垃圾回收:JVM的内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用System。gc();通知JVM执行垃圾回收
示例
-
package com.wly.Dome; import java.util.Objects; public class Student { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Student() { super(); } public Student(String name, int age) { this.name = name; this.age = age; } @Override public String toString() {//重写toString方法 return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o;//强制类型转换 return age == student.age && Objects.equals(name, student.name); } }
-
package com.wly.Dome; public class TestStudent { public static void main(String[] args) { Student s1=new Student("张三",10); Student s2=new Student("李四",20); Student s3=new Student("李四",20); //getClass()方法 //判断s1和s2是否是一个类型 Class class1=s1.getClass(); Class class2=s2.getClass(); if (class1==class2){ System.out.println("属于同一个类型"); } //hashCode方法 System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); Student s4=s1; System.out.println(s4.hashCode()); //toString方法 System.out.println(s1.toString()); System.out.println(s2.toString());//包名、类、哈希值 //equals方法,判断两个对象是否相等 System.out.println(s1.equals(s2)); System.out.println(s2.equals(s3));//返回false,对象不同 //equals方法重写, } }
包装类
-
基本类型所对应的引用类型
-
Object可统一所有数据,包装类的默认值为null
-
基本数据类型 byte short int long float double boolean char 包装类型 Byte Short Integer Long Float Double Boolean Character
类型转换与装箱、拆箱
-
装箱:把基本类型转为引用类
-
Number父类中提供的6个共性方法
-
parseXXX()静态方法
-
valueOf()方法
-
package com.wly.Dome; public class TestDome { public static void main(String[] args) { //装箱:基本类型转换为引用类型 int num1=10; //使用Integer类创建对象 Integer integer1=new Integer(num1); Integer integer2=Integer.valueOf(num1); //拆箱:引用类型转换为基本类型 Integer integer3=new Integer(100); int num2=integer3.intValue(); //1.5之后提供了自动装箱,拆箱 int age=28; //自动装箱 Integer integer4=age; //自动拆箱 int age2=integer4; //基本类型与字符串之间的转换 int n1=78; String s1=n1+""; //使用Integer中的toString方法 String s2=Integer.toString(n1);//(X,Y)Y可以代表几进制 //字符串转为基本类型 String str="150"; //parseInt方法 Integer.parseInt(str); //boolean字符串形式转为基本类型,true----->true 非true----->false String str2="true"; boolean b1=Boolean.getBoolean(str2); } }
-
Integer缓冲区
-
package com.wly.Dome; public class TestDome { public static void main(String[] args) { Integer integer1=new Integer(100); Integer integer2=new Integer(100); System.out.println(integer1==integer2);//false Integer integer3=100; Integer integer4=100; System.out.println(integer3==integer4); Integer integer5=200; Integer integer6=200; System.out.println(integer5==integer6);//true 缓冲区-128——127之间对象存储 } }
String类
- 字符串是常量,创建后不可改变(赋值时,重新开辟空间,让变量指向地址发生改变)
- 字符串字面值存储在字符串池中,可以共享
- 使用new对象进行赋值,字符串会存在在堆和栈中(两个对象),变量会指向堆
- 比较字符串时,用equals方法比较数据
常用方法
方法 | 说明 |
---|---|
public int length(): | 返回字符串长度(变量.length()) |
public boolean contains(String str): | 判断当前字符串中是否包含str(变量.contains()) |
public char [] toCharArray(): | 将字符串转换为数组( 无法正常显示,显示地址,需转换为字符串输出) |
public int indexOf(String str): | 查找首次出现的下标,存在,则返回该下标;不存在则返回-1(可以定位角标,从第几个开始找) |
public int lastIndexOf(String str): | 查找字符串在当前字符串中最后一次出现的下标索引 |
public String trim(): | 去掉字符串前后空格 |
public String toUpperCase(): | 将小写转换为大写(toLowerCase():大写转小写) |
public boolean endWith(String str): | 判断字符串是否以str结尾(startWith(str):是否以str开头); |
public String replace(char oldChar,char newChar); | 将旧字符串替换成新字符串 |
public String[] split(String str): | 根据str做拆分(两个字符拆分用中括号括起来,加号表示字符可以出现一个或多个----->变量名.split("[ ]+")) |
equlas(): | 对字符串进行比较,区分大小写(不区分大小写:equlasIgnoreCase()) |
compareTo(): | 比较编码表位置,前一个减后一个,前几位一样输出结果为减去一样部分剩余位数 |
可变字符串(缓冲区上操作)
StringBuffer:可变长字符串,运行效率慢,线程安全,JDK1.0提供
StringBuilder:可变长字符串,运行效率快,线程不安全,JDK5.0提供
- 效率比String高,比String节省空间
方法
方法 | 说明 |
---|---|
append(): | 追加 |
insert(): | 添加(可以在任何位置添加任何类型) |
replace(): | 替换(可以指定位置) |
delete(): | 删除(可以指定位置) |
BigDecimal类
- (float与double都为近似值)精确计算浮点数
- 字符串计算精确
- 调用该类里的subtract()方法实现减法
- 调用该类里的add()方法实现加法
- 调用该类里的multiply()方法实现乘法
- 调用该类里的divide()方法实现除法(除不尽的情况下需添加保留数目与保留方法(ROUND_HALF_UP)四舍五入)
- 对象1.方法名(对象2)
Date类
- 表示特定的瞬间,精确到毫秒
Calendar类
-
提供了获取或设置各种字段的方法
-
构造方法:
- protected Calendar():由于修饰符是protected,所以无法直接创建该对象。用getInstance()创建对象
-
其他方法:
方法 说明 static Calendar getlnstance(): 默认时区和区域获取日历 void set(int year,int mouth,int date,int hourofday,int minute,int second): 设置日历的年龄年、月、日、时、分、秒 int get(int field): 返回给定日历字段的值。字段比如年、月、日 void setTime(Date date): 用给定的day设置此日历的时间。Date-Calendar Date getTime: 返回一个Date表示此日历的时间。Calendar-Date void add(int field,int amount): 按照日历的规则,给指定字段添加(正值)或减少(负值)时间量。 long getTimeInMillies(): 毫秒为单位返回该日历的时间 getActualMaximum()和getActualMinmum(): 返回当前月的最大值和最小值
SimpleDateFormat类
-
以与语言环境有关的方式来格式化和解析日期的具体类
-
进行格式化(日期—>文本)(文本------>日期)
模式字母 y M d H m s S 日期或时间 年 年中月份 月中天数 一天中小时数 分钟 秒 毫秒 -
实例化时设置带参
-
package com.wly.Dome; import javax.xml.crypto.Data; import java.text.SimpleDateFormat; import java.util.Date; public class TestDome { public static void main(String[] args) throws Exception{ SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd"); //创建Date Date date=new Date(); //格式化date String str=sdf.format(date); System.out.println(str); //解析 Date date2=sdf.parse("2001/03/03"); System.out.println(date2); } }
System类
- 系统类,主要用于获取系统的属性数据和其他操作,构造方法私有的。
方法
方法名 | 说明 |
---|---|
static viod arraycopy(…) | 复制数组 arraycopy(原数组,位置起点,目标数组,目标位置,复制个数) |
static long currentTimeMillis() | 获取当前系统时间,返回的是毫秒值 |
static void gc() | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int status) | 退出jvm,如果参数为0表示正常退出jvm,非0表示异常退出jvm |
System类
- 系统类,主要用于获取系统的属性数据和其他操作,构造方法私有的。
方法
方法名 | 说明 |
---|---|
static viod arraycopy(…) | 复制数组 arraycopy(原数组,位置起点,目标数组,目标位置,复制个数) |
static long currentTimeMillis() | 获取当前系统时间,返回的是毫秒值 |
static void gc() | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int status) | 退出jvm,如果参数为0表示正常退出jvm,非0表示异常退出jvm |