1 内部类
定义:在一个类的内部再定义一个完整的类。
特点:
(1)编译之后可以生成独立的字节码文件。
(2)内部类可以直接访问外部类的私有成员。
(3)内部类可以为外部类提供功能组件。
1.1 成员内部类
把一个类定义在另一个类内部,作为实例成员。与实例变量、实例方法同级。创建内部类对象时,必须依赖外部类对象。
1 package javabasic.internalclass; 2 3 public class OuterClass01 { 4 private String name ="zs"; 5 private Integer age = 20; 6 7 //可以使用访问修饰符:public/private/protected 8 class Inner{ 9 private String address = "beijing"; 10 private String phone = "123"; 11 12 private String name = "lisi"; 13 14 //静态内部类不能包含静态变量 15 //private static String country = "zhongguo"; 16 17 //静态内部类里可以包含静态常量 18 private static final String country = "china"; 19 20 public void show() { 21 //内部类与外部类同名,优先访问内部属性 22 System.out.println(name); 23 24 //内部类与外部类同名,需要加前缀来访问外部类属性 25 System.out.println(OuterClass01.this.name); 26 //打印外部类的属性 27 System.out.println(age); 28 29 //打印内部类的属性 30 System.out.println(address); 31 } 32 } 33 34 public static void main(String[] args) { 35 // 1.调用内部类的方法 36 OuterClass01 d1 = new OuterClass01(); 37 d1.new Inner().show(); 38 } 39 }
1.2 静态内部类
把一个类定义在另一个类内部,作为静态成员。静态内部类创建时,不依赖外部类对象,可直接创建或通过类名访问,可以声明静态成员。
1 package javabasic.internalclass; 2 3 //2.静态内部类 4 public class OuterClass02 { 5 6 private String name ="zs"; 7 private Integer age = 20; 8 9 //静态内部类的级别,和外部类相同 10 static class Inner{ 11 12 private String address = "beijing"; 13 private String phone = "123"; 14 15 private String name = "lisi"; 16 17 private static Integer count = 100; 18 19 public void show() { 20 //内部类与外部类同名,优先访问内部属性 21 System.out.println(name); 22 23 //内部类与外部类同名,需要加前缀来访问外部类属性 24 System.out.println(new OuterClass02().name); 25 //打印外部类的属性 26 System.out.println(new OuterClass02().age); 27 28 //打印内部类的属性 29 System.out.println(address); 30 31 //打印静态内部类的静态属性 32 //类名.静态属性 或 直接用静态属性 33 System.out.println(Inner.count); 34 } 35 } 36 37 public static void main(String[] args) { 38 // 直接 39 OuterClass02.Inner inner2 = new OuterClass02.Inner(); 40 inner2.show(); 41 } 42 }
1.3 局部内部类
把一个类定义在另一个类的方法的内部,作为局部变量。作用范围和创建对象范围仅限于当前方法。
1 package javabasic.internalclass; 2 3 //3.局部内部类 4 public class OuterClass03 { 5 6 private String name ="zs"; 7 private Integer age = 20; 8 9 public void show() { 10 //在jdk 1.8 这个局部变量会自动变为final常量,后续不能再修改 11 String address = "abc"; 12 13 //局部内部类,不能加访问修饰符 14 class Inner{ 15 private String name = "ls"; 16 private String phone="1234567"; 17 private String email="1@1.com"; 18 19 //private static Integer newcount = 200;//不能定义静态变量 20 private final static int newcount = 200;//可以定义静态常量 21 22 public void show2() { 23 //访问外部类的方法中的局部"常量" 24 System.out.println(address); 25 26 //访问内部类的属性 27 System.out.println(name); 28 System.out.println(phone); 29 System.out.println(email); 30 31 //访问外部类属性 32 System.out.println(OuterClass03.this.name); 33 System.out.println(OuterClass03.this.age); 34 35 } 36 } 37 //在外部类的方法中,调用内部类的方法 38 Inner inner = new Inner(); 39 inner.show2(); 40 } 41 42 public static void main(String[] args) { 43 OuterClass03 oc3 = new OuterClass03(); 44 oc3.show(); 45 } 46 }
1.4 匿名内部类
没有名字的内部类,一般用在接口/抽象类中。没有定义名字的局部内部类。
1 package javabasic.internalclass; 2 3 public class OuterClass04 { 4 public static void main(String[] args) { 5 // 1.普通调用 6 // USB usb = new Mouse(); 7 // usb.service(); 8 9 // 2.使用局部内部类 10 // class Fan implements USB{ 11 // @Override 12 // public void service() { 13 // // TODO Auto-generated method stub 14 // System.out.println("风扇开始工作"); 15 // } 16 // } 17 // 18 // USB usb = new Fan(); 19 // usb.service(); 20 21 // 3.使用匿名内部类 22 USB usb = new USB() { 23 @Override 24 public void service() { 25 // TODO Auto-generated method stub 26 System.out.println("风扇开始工作"); 27 } 28 }; 29 usb.service(); 30 } 31 }
2 Object类
(1)超类、基类,所有类的直接或间接父类,位于继承树的最顶层。
(2)任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承。
(3)Object类中所定义的方法,是所有对象都具备的方法。
(4)Object类型可以存储任何对象
2.1 getClass()
返回此Object的运行时类。
2.2 hashCode()
返回该对象的hash值(内存地址)。
2.3 toString()
返回该对象的字符串表示。
2.4 equals(Object obj)
指示其他对象是否与此对象“相等”。
2.5 finalize()
当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法。
3 包装类
这些包装类定义在java.lang.*包里面。
数据的实际值存储在堆中,而在栈中存储的是这个对象的引用(堆的内存地址)。
装箱:从基本类型转换成包装类型。包装类名.valueOf()
拆箱:从包装类型转换成基本类型。实例对象.xxxValue()
jdk 1.5之后,可以自动装箱/拆箱,其内部调用了相应的方法。
基本数据类型 | 包装类型 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
1 package javabasic.internalclass; 2 3 public class demo01 { 4 public static void main(String[] args) { 5 // 1. 装箱与拆箱 6 //装箱 7 int a = 10; 8 Integer A = Integer.valueOf(a); 9 10 //拆箱 11 a = A.intValue(); 12 // 在jdk 1.5 以后可以自动装箱/拆箱 13 int b = 9; 14 Integer B = b;//装箱 15 b = B;//拆箱 16 17 //2. 数字与字符串 18 Integer C = 8; 19 String SC = Integer.toString(C,10);//按十进制转为字符串 20 System.out.println(SC);//"8" 21 22 String SC2 = Integer.toOctalString(C);//将数字转为字符串,并按八进制表示 23 System.out.println(SC2);//"10" 24 25 Integer D = Integer.parseInt(SC2, 8);//将八进制表示的字符串以转为数字 26 System.out.println(D);//8 27 28 //3. Integer的缓冲区 29 //Integer类型在调用valueOf()方法时,会判断数字是否在-128~127之间 30 //在这个区间的数字,不会额外生成,而是从缓存中取出 31 32 Integer X1 = Integer.valueOf(127); 33 Integer X2 = 127;//自动装箱,底层会调用valueOf()方法 34 System.out.println(X1==X2);//true 35 36 Integer Y1 = Integer.valueOf(128); 37 Integer Y2 = 128; 38 System.out.println(Y1==Y2);//false 39 } 40 }
4 String类
字符串是常量,创建之后不可改变。
字符串字面值存储在字符串池中,可以共享。
4.1 length()方法
返回字符串的长度
4.2 charAt(int index)
根据下标获取字符
4.3 contains(String str)
判断当前字符串中是否包含str
4.4 toCharArray()
将字符串转换成数组
4.5 indexOf(String str)
查找str首次出现的下标,存在则返回下标,不存在则返回-1
4.6lastIndexOf(String str)
查找str最后一次出现的下标
4.7 trim()
去掉字符串前后的空格
4.8 toUpperCase()/toLowerCase()
将字符串转换为全大写/小写
4.9 startWith(String str)/endWith(String str)
判断字符串是否以str开始/结尾
4.10 replace(char oldChar,char newChar)
将旧字符替换成新字符
4.11 split(String str)
根据str做拆分
4.12 intern()
返回字符串对象的规范化表示形式
1 String a = "a"; 2 String b = a + "b"; 3 String c = "ab"; 4 String d = new String(b); 5 6 System.out.println(b == c);//false 7 System.out.println(d == c);//false 8 System.out.println(c == d.intern());//true 9 System.out.println(b.intern() == d.intern());//true
5 可变字符串
5.1 StringBuilder
运行效率快,线程不安全
5.2 StringBuffer
运行效率慢,线程安全
6 BigDecimal
作用:精确计算浮点数,存储在java.math包中。
1 BigDecimal bd1 = new BigDecimal("1.0"); 2 BigDecimal bd2 = new BigDecimal("0.9"); 3 BigDecimal bd3 = bd1.subtract(bd2); 4 System.out.println(bd3);//0.1
7 日期时间
7.1 Date类
1 package javabasic.internalclass; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 public class DateDemo01 { 7 8 public static void main(String[] args) { 9 // 1. Date类 10 Date d1 = new Date(); 11 System.out.println(d1);//Wed Jan 27 15:00:52 CST 2021 12 System.out.println(d1.getTime());//1611731006864 13 System.out.println(d1.toLocaleString());//Jan 27, 2021 3:01:29 PM 14 15 Date d2 = new Date(1611731006864L); 16 } 17 }
7.2 Calendar类
1 public class Calendar01 { 2 3 public static void main(String[] args) { 4 // 1.创建Calendar对象 5 Calendar calendar = Calendar.getInstance(); 6 System.out.println(calendar.getTime().toLocaleString()); 7 System.out.println(calendar.getTimeInMillis()); 8 9 //2.获取时间信息 10 int year = calendar.get(calendar.YEAR); 11 System.out.println(year); 12 13 int month = calendar.get(calendar.MONTH); 14 System.out.println(month); 15 16 //3.修改时间 17 Calendar calendar2 = calendar.getInstance(); 18 calendar2.set(calendar.DAY_OF_MONTH, 1); 19 System.out.println(calendar2.getTime().toLocaleString()); 20 } 21 }
7.3 SimpleDateFormat类
1 package javabasic.internalclass; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 public class DateDemo03 { 7 8 public static void main(String[] args) { 9 // 3.SimpleDateFormat 10 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 11 Date d1 = new Date(); 12 String strDate = sdf.format(d1); 13 System.out.println(strDate);//2021-01-27 15:15:53.596 14 } 15 }
8 System类
主要用于获取系统的属性和其他操作,构造方法私有的。
8.1 System.arrayCopy()
复制数组
8.2 System.currentTimeMillis()
获取时间戳
8.3 System.gc()
简易JVM启动垃圾回收
8.4 System.exit(int status)
退出jvm,参数0表示正常退出,非0表示异常退出jvm