一、内部类
1.1 概述
-
定义在类的内部的完整的类称为内部类
-
能容纳更多的数据
-
分类:
-
局部内部类
-
成员内部类
-
静态内部类
-
匿名内部类
-
1.2 成员内部类
-
类的成员之一
-
定义位置同实例变量和实例方法:类中方法外
-
能访问外部类中所有的数据
-
不能定义静态数据
-
创建对象需要依赖外部类对象
package com.shine.inner; import com.shine.inner.Computer.CPU; public class Demo01 {public static void main(String[] args) {// 创建外部类对象Computer c = new Computer();c.show();// 创建成员内部类对象:需要依赖外部类CPU cpu = c.new CPU();cpu.show();} } class Computer {String brand;String model;double price;private String info = "Computer.info";static String str = "";/*** 内部类* 能承载更多的信息* 这个属性和所在的类关联性极强*/class CPU {String brand;String model;double price;private String info = "CPU.info";// 成员内部类中不能定义静态属性和方法// static String str = "";public void show() {// 访问外部类中的属性/方法System.out.println("Computer.info:" + Computer.this.info);System.out.println("CPU.info:" + this.info);System.out.println("CPU.show");System.out.println(str);}}public void show() {System.out.println("Computer.show");} }
1.3 局部内部类
-
在方法中创建的类成为局部内部类
-
如果在局部内部类中使用方法中的局部变量,这个局部变量需要使用final修饰
-
因为:
-
package com.shine.inner; public class Demo02 {public static void main(String[] args) {/*** 局部内部类*/System.out.println("Hello001");System.out.println("Hello002");System.out.println("Hello003");// 创建变量final int num = 100;class Inner{public void show() {// 如果在局部内部类中使用方法中的局部变量,这个局部变量需要使用final修饰System.out.println(num);}}Inner inner = new Inner();// 修改变量// num = 200;System.out.println(num);System.out.println("Hello004");System.out.println("Hello005");} }
1.4 静态内部类
-
使用static修饰的成员内部类
-
只能访问外部类的静态数据
-
创建对象不依赖外部类对象,可以直接使用类名调用静态属性和方法
package com.shine.inner; public class Demo03 {public static void main(String[] args) {// Outer outer = new Outer();// 静态内部类中的静态数据可以直接使用类名调用//System.out.println(Outer.Inner.info);//Outer.Inner.show();// 静态内部类可以直接创建对象Outer.Inner inner = new Outer.Inner();//System.out.println(inner.info);} } class Outer{static {System.out.println("外部类的静态代码块");}String name = "name";static class Inner {static {System.out.println("内部类的静态代码块");}// String name = "name";static String info = "静态数据";public static void show() {}public void he() {// 静态内部类中只能访问外部类的静态数据// System.out.println(name);}} }
1.5 匿名内部类【掌握】
-
没有名字的内部类?
-
定义类、实现类、创建对象的语法合并
-
-
需要实现接口或者继承一个类
-
接口一般只有一个方法
-
类一般是抽象类
-
实现接口
package com.shine.inner; public class Demo06 {public static void main(String[] args) {Power battery = new Power() {@Overridepublic void power() {System.out.println("电池供电...");}};battery.power();} } interface Power{void power(); }
继承抽象类
package com.shine.inner; public class Demo07 {public static void main(String[] args) {Animal a = new Animal() {@Overridepublic void eat() {System.out.println("动物需要吃饭");}};a.eat();Animal dog = new Animal() {@Overridepublic void eat() {System.out.println("狗子喜欢吃骨头");}};dog.eat();} } abstract class Animal{public abstract void eat(); }
二、Object
2.1 概述
-
类
Object
是类层次结构的根类。 -
所有对象(包括数组)都实现这个类的方法。
2.2 创建对象
package com.shine.object; public class Demo01 {public static void main(String[] args) {/*** 构造方法* Object()*/Object obj01 = new Object();Object obj02 = 100;Object obj03 = "Hello";Object obj04 = true;Object obj05 = 3.1415926;Object obj06 = new int[] {11,22,33,44,55};} }
2.3 常用方法
getClass
-
获取对象的运行时【真实】类型
package com.shine.object; public class Demo01 {public static void main(String[] args) {/*** 构造方法* Object()*/Object obj01 = new Object();Object obj02 = 100;Object obj03 = "Hello";Object obj04 = true;Object obj05 = 3.1415926;Object obj06 = new int[] {11,22,33,44,55};// 获取对象的运行时【真实】类型System.out.println(obj01.getClass());System.out.println(obj02.getClass());System.out.println(obj03.getClass());System.out.println(obj04.getClass());System.out.println(obj05.getClass());System.out.println(obj06.getClass());} }
toString
-
返回该对象的字符串表示。
-
默认返回
getClass().getName() + '@' + Integer.toHexString(hashCode())
-
结果应是一个简明但易于读懂的信息表达式。
-
建议所有子类都重写此方法。
@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", address=" + address + ", info=" + info + "]";}
hashCode
-
返回对象的哈希值
-
默认的计算方式和地址相关,不同的对象尽量获取不同的哈希值
-
我们希望两个属性完全相同的对象得到相同的哈希值,重写hashcode方法,使用属性计算哈希值
equals
@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((address == null) ? 0 : address.hashCode());result = prime * result + age;result = prime * result + ((info == null) ? 0 : info.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());return result;} /*** 抄写3遍*/@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Student other = (Student) obj;if (address == null) {if (other.address != null)return false;} else if (!address.equals(other.address))return false;if (age != other.age)return false;if (info == null) {if (other.info != null)return false;} else if (!info.equals(other.info))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}
finalize
@Override protected void finalize() throws Throwable {System.out.println(name + "即将被当做垃圾回收"); }
== 和 equals
-
==
-
关系运算符,比较两个对象是否相等
-
基本类型的数据比较数值
-
引用类型的对象比较地址值
-
-
equals
-
Object中的一个方法,只能用于引用类型的比较,默认比较的是地址值
-
一般认为两个对象如果具有完全相同的属性,比较应该返回true
-
一般重写equals方法,比较对象的属性
-
三、String
3.1 概述
-
String
类代表字符串。就是一串字符。 -
Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
-
字符串是常量;它们的值在创建之后不能更改。
3.2 创建对象
package com.shine.str; public class Demo01 {public static void main(String[] args) {/**构造方法摘要 String() 初始化一个新创建的 String 对象,使其表示一个空字符序列。String(byte[] bytes, int offset, int length, String charsetName) 通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 String。 String(char[] value, int offset, int count) 分配一个新的 String,它包含取自字符数组参数一个子数组的字符。 String(int[] codePoints, int offset, int count) 分配一个新的 String,它包含 Unicode 代码点数组参数一个子数组的字符。 String(String original) 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。 */// 创建一个空的字符串String s01 = new String();// 使用字符串创建对象String s02 = new String("Hello");// 使用byte数组创建,规则参考ASCII表byte[] bytes = new byte[] {65,66,67,68,69,70,71};String s03 = new String(bytes,2,3);System.out.println(s03);// 使用字符创建对象char[] chars = new char[] {'床','前','明','月','光'};String s04 = new String(chars,1,3);System.out.println(s04);// 参考Unicode创建字符int[] arr = new int[] {30000,32500,32550,32365,40000};String s05 = new String(arr, 0, arr.length);System.out.println(s05);} }
3.3 常用方法
package com.shine.str; import java.util.Arrays; public class Demo02 {public static void main(String[] args) {/**常用方法增String concat(String str) 将指定字符串连接到此字符串的结尾。 删改String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 String toLowerCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 String toUpperCase() 使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 String trim() 返回字符串的副本,忽略前导空白和尾部空白。 查char charAt(int index) 返回指定索引处的 char 值。 boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true。 boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 boolean equals(Object anObject) 将此字符串与指定的对象比较。 boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 int hashCode() 返回此字符串的哈希码。 int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引。 int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。 int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引。 int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 int length() 返回此字符串的长度。 String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。 String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 static String valueOf(Object obj) 返回 Object 参数的字符串表示形式。 其他int compareTo(String anotherString) 按字典顺序比较两个字符串。 int compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。 char[] toCharArray() 将此字符串转换为一个新的字符数组。 void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 将字符从此字符串复制到目标字符数组。 String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。 String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 */// 拼接字符串System.out.println("Hello".concat("World"));// 替换System.out.println("Hello".replace('l', 'L'));System.out.println("Hello".replaceAll("l", "L"));// 转换成大写System.out.println("Hello".toUpperCase());// 去除两头的空格System.out.println(" He llo ".trim());// 查询指定索引位置的字符System.out.println("Hello".charAt(0));System.out.println("Hello".charAt(1));System.out.println("Hello".charAt(2));String str = "Hello";for (int i = 0; i < str.length(); i++) {System.out.println(str.charAt(i));}// fghjkljklDFGHJK%^&*(6789:大写、小写、数字、其他字符出现的次数// 截取字符串str = "abcdefghijklmnopqrstuvwxyz";System.out.println(str.substring(7));System.out.println(str.substring(7,7+7));// 把字符串转换成byte数组byte[] bytes = str.getBytes();System.out.println(Arrays.toString(bytes));// 把字符串转换成字符数组char[] chars = str.toCharArray();System.out.println(Arrays.toString(chars));} }
后续讲解
四、StringBuffer
4.1 概述
4.2 创建对象
4.3 常用方法
-
扩容原理
五、System
六、Math
七、Random
八、BigDecimal
九、时间相关
-
Date
-
Calendar
-
SimpleDateFormat