目录
常量池
API文档如何阅读
String类常用的方法
示例
内部类
特点
成员内部类
非静态内部类
成员变量访问要点
内部类的访问
示例
在别的类中调用
静态内部类
定义方式
使用要点
示例
匿名内部类
示例
局部内部类
面向对象知识总结思维导图:
String是最常用的类
-  String类又称作不可变字符序列 
-  String类位于java.lang包中,Java程序默认导入java.lang包下的所有类 
-  Java字符串就是Unicode字符序列,例如"Java"就是4个Unicode字符"J"、"a"、"v"、"a"组成的 
-  Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例 
public class TestString {public static void main(String[] args) {
//      String s0 = null;String s = "";String s1 = "Java";String s2 = new String("Java");
//      System.out.println(s0.length()); // 报NullPointerException(空指针异常)的错System.out.println(s.length());  // 0System.out.println(s1.length()); // 4System.out.println(s2.length()); // 4}
} 
常量池
-  全局字符串常量池 
-  class文件常量池 
-  运行时常量池(Runtime Constant Pool) 
每个class运行时都有一个运行时常量池
System.out.println("--------------字符串相等问题---------------");
String s3 = "张三";
String s4 = "张三";
String s5 = new String("张三");
System.out.println(s3 == s4);   // true
System.out.println(s3 == s5);   // false
System.out.println(s5.equals(s3)); // true 
API文档如何阅读
-  下载API文档地址: 
Java Development Kit 8 Documentation (oracle.com)
String类常用的方法
| 方法 | 解释说明 | 
|---|---|
| char charAt(int index) | 返回字符串中方第index个字符 | 
| boolean equals(String other) | 如果字符串与other相等,返回ture;否则,返回false | 
| boolean equalsIgnoreCase(String other) | 如果字符串与other相等(忽略大小写),则返回true;否则返回false | 
| int indexOf(String str) | 返回从头开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,返回-1 | 
| lastIndex(Of) | 返回从末尾开始查找第一个子字符串str在字符串中的索引位置。如果未找到子字符串str,返回-1 | 
| int length() | 返回字符串的长度 | 
| String replace(char oldChar,char newChar) | 返回一个新串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的 | 
| boolean startWith(String prefix) | 如果字符串以prefix开始,则返回true | 
| boolean endsWith(String prefix) | 如果字符串以prefix结尾,则返回true | 
| String subString(int beginIndex) | 返回一个新字符串,该串包含从原始字符串beginIndex到串尾 | 
| String subString(int beginIndex,int endIndex) | 返回一个新字符串,该串包含从原始字符串beginIndex到串尾或endIndex - 1的所有字符 | 
| String toLowerCase() | 返回一个新字符串,该串将原始字符串中的所有大写字母改成小写字母 | 
| String toUpperCase() | 返回一个新字符串,该串将原始字符串中的所有小写字母改成大写字母 | 
| String trim() | 返回一个新字符串,该串删除了原始字符串头部和尾部的空格 | 
示例
public class TestString02 {public static void main(String[] args) {String s = "HELLO EVERYONE!";String s1 = "hello everyone!";
System.out.println(s.charAt(4));            // 提取下标为4的字符             OSystem.out.println(s.length());             // 返回字符串s的长度             15System.out.println(s.equals(s1));           // 判断s与s1是否相等             falseSystem.out.println(s.equalsIgnoreCase(s1)); // 同上,但忽略大小写             trueSystem.out.println(s.indexOf("HELLO"));     // 查找s中是否有Hello并返回位置    0System.out.println(s1.indexOf("Pink"));     // 查找s1中是否有Pink            -1
String s2 = s.replace("E","A");  // 将s1中的E换成ASystem.out.println(s2);                     // 打印s2,一个全新的字符串: HALLO AVARYONA!System.out.println(s);                      // HELLO EVERYONE! String是不可变序列
String s3 = "Hi,beautiful girl~ do you love me? girl ?";System.out.println(s3.lastIndexOf("girl")); // 从后往前找girl,找到了从前往后数位置并返回   35System.out.println(s3.indexOf("girl"));       // 从前往后找girl并返回位置               13}
} 
public class TestString03 {public static void main(String[] args) {String s = "";String s1 = "Hi Zhangsan Hello~";System.out.println(s1.startsWith("Hi"));      // 判断是否以Hi开头             trueSystem.out.println(s1.startsWith("Hello"));   // 判断是否以hello开头          falseSystem.out.println(s1.endsWith("~"));         // 判断是否以~结尾              trues = s1.substring(5);                // 提取字符串从5开始到字符串结尾System.out.println(s);                        // 打印s                      angsan Hello~s = s1.substring(3,8);                        // 提取3-8的字符串,不包括8System.out.println(s);                        //                           Zhangs = s1.toLowerCase();                         // 转小写System.out.println(s);                        //                           hi zhangsan hello~s = s1.toUpperCase();                         // 转大写                     HI ZHANGSAN HELLO~System.out.println(s);                        //String s2 = "  How  are  you ~~~   ";s = s2.trim();                                // 去除首尾字符串,但不能去掉中间的System.out.println(s);                        //                           How  are  you ~~~System.out.println(s2.toLowerCase());                       // String是不可变字符,s2不变     How  are  you ~~~}
} 
内部类
把一个类放在另一个类的内部定义,称为内部类(inner class)
特点
-  内部类提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问 
-  内部类可以直接访问外部类的私有属性,内部类被当成其他外部类放入成员,但外部类不能访问内部类的内部属性 
-  接口只是解决了多重继承的部分问题,而内部类使得多重继承的解决方案变得更加完整 
-  它只是一个编译时的概念,一旦编译成功,就会变成完全不同的两个类。是相对独立的一种存在,其成员变量/方法名可以和外部类相同 
成员内部类
非静态内部类
-  对象必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在对应的外部内对象 
-  可以直接访问外部类的成员,但不能直接访问非静态类内部类成员 
-  不能有静态方法,静态属性和静态初始化块 
-  外部类的静态方法,静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量,创建实例 
成员变量访问要点
-  内部类属性:this.变量名 
-  外部类属性:外部类名.this.变量名 
内部类的访问
-  外部类中定义内部类:new Inner() 
-  外部类以外的地方使用非静态内部类 -  Outer.Inner varname = new Outer().new Inner() 
 
-  
示例
package InnerClassTest;
public class Outer {public static void main(String[] args) {Outer o = new Outer();o.show();Outer.Inter i = new Outer().new Inter();i.show();}private int age = 18;private String name = "张三";
public void show(){System.out.println("Outer.show");System.out.println(age);System.out.println(name);}
public class Inter {int age = 19;String name = "李四";public void show(){System.out.println("Inter.show");System.out.println(age);System.out.println(Outer.this.age);Outer.this.show();}}
} 
在别的类中调用
package InnerClassTest;
public class TestInner {public static void main(String[] args) {Outer o = new Outer();
//      Inner i = new Inner();   错误的调用Outer.Inter i = new Outer().new Inter(); /*正确调用*/o.show();i.show();}
} 
静态内部类
定义方式
static class ClassName{
// 类体
}
使用要点
-  看作外部类的一个静态成员 
-  当一个静态内部类对象存在,并不一定存在对应得外部类对象。因此,静态内部类得实例方法不能直接访问外部类的实例方法 
示例
package InnerClassTest;
class Outer2 {private int a = 56;static private int b = 33;
static class Inner2{public void test(){
//         System.out.println(a);  // 静态内部类不能访问外部类的普通属性System.out.println(b);  // 静态内部类可以访问外部类的静态属性}}
}
public class TestStaticInnerClass{public static void main(String[] args) {// 通过 new 外部类名.内部类名()  来创建内部类对象Outer2.Inner2 i2 = new Outer2.Inner2();i2.test();                 // 33}
} 
匿名内部类
-  适合只需要使用一次的类,eg:键盘监听操作等等,在安卓开发、awt、swing开发中常见 
-  里面没有访问修饰符 
-  没有构造方法 
语法:
new 父类构造器(实参列表) \ 实现接口(){
// 匿名内部类类体
}
示例
package InnerClassTest;
import javax.swing.plaf.synth.SynthOptionPaneUI;
public class TestAnonymousInnerClass {public void test(A a){a.run();}public static void main(String[] args) {TestAnonymousInnerClass t = new TestAnonymousInnerClass();
//      t.test(new AImpl());  // 之前的做法
// 匿名类的做法--只用这一次t.test(new A() {   // new的不是接口,是一个没有名字的A的实现类@Overridepublic void run() {System.out.println("run");}});t.test(new A(){   // 完全可以与上面的共存@Overridepublic void run(){System.out.println("run2");}});}
}
// 之前的做法
//class AImpl implements A{
//    @Override
//    public void run(){
//      System.out.println("run");
//    }
//}
interface A{void run();
} 
局部内部类
开发中用的极少
-  定义在方法内部,作用域只限于本方法,称为局部内部类 
-  作用域仅限于所在方法 
package InnerClassTest;
public class TestLocalInnerClass {public void show(){class Inner3{public void fun(){System.out.println("hahaha");}}new Inner3().fun();}
public static void main(String[] args) {new TestLocalInnerClass().show();}
} 
面向对象知识总结思维导图:
链接:知犀思维导图 - 免费思维导图 - 知犀 密码:3797