多态
* 子类对象可以存到父类的变量中
* 前提条件
* 子父类关系
* 方法重写
* 父类引用指向子类对象
* 好处
* 提高代码的复用性和扩展性
* 缺点
* 不能使用子类对象的特有方法
2. 多态成员访问的特点
* 编译看左边,运行看左边
* 成员变量
* 静态方法
* 编译看左边, 运行看右边 ,只要子类中重写了,一定执行子类的方法
* 非静态成员方法 (全遮挡)
3. 多态转型
* 向上转型 (子类转父类)
* 线下转型 (父类转子类,有危险), 转之前,要使用 instanceof关键字判断一下
4. final
* 最终的, 无法被改变 , 只能赋值一次
* 修饰的特性
* 修饰类, 类不能被继承
* 修饰方法, 方法不能被重写
* 修饰变量, 变量只能赋值一次
* 修饰成员变量时
* 在初始化完毕之前必须要赋值
* 静态是类初始化完毕前
* 非静态是对象初始化完毕前
5. 抽象类
* abstract关键字
* 制定规则
* 一个类中如果有抽象方法,这个类也必须是抽象类
* 抽象类中可以没有抽象方法
* 抽象不能实例化(创建对象) , 不安全, 抽象方法用不了
* 抽象类的子类可以是抽象类, 不用重写抽象方法
* 抽象类的子类可以是非抽象类, 必须重写抽象方法
6. java传递值得方式
* 基本数据类型传递的是值, 引用数据类型传递的是址, String稍微特殊
7. 接口
* interface implements
* 接口中全部都是抽象方法
* 接口中的成员变量
* 都是公开的, 静态的, 最终的 public static final
* 作用
* 指定规则
* 思考的过程
* 代码的框架
* 我们在思考过程中, 用来记录业务逻辑.
8. 类和接口之间的关系
* 类和类: 继承 单继承, 多层继承
* 类和接口: 实现, 可以多实现
* 接口和接口: 继承, 可以多继承
模板模型
* 实现类和接口中的内容保持一致
* 好处: 提高了代码的扩展性
2. 成员内部类
类中方法外
* 当类中的成员过多时, 使用成员内部类再次分组
* 成员内部类一般来说是为外部类服务的
* 特性
* 内部类可以直接调用外部类的成员
* 外部类需要先创建对象才能调用内部类的成员
* 内外部类都可以调用对方的私有化成员
* 创建内部类对象前必须先创建外部类对象
3. 静态内部类
* 基本用法和成员内部类相似
* 就是给内部类加上static关键字, 唯一的作用是可以让用户跳过外部类直接访问到内部类
* 内部类是静态的,绝不能认为内部类中的成员也是静态的,这些成员还是原先的调用方式
* 如果内部类中有静态成员,那么这个内部类也必须是静态的
4. 局部内部类
* 当一个类只能在当前方法中被用到时,我们没有必要将他写道外部去, 可能会干扰其他类的使用
* 局部内部类中如果使用局部变量, 那么,这个变量要变成常量
5. 匿名内部类
* 创建某个类或接口的子类对象, 类只被使用一次
* new 父类 () { } ;
6. 异常
* 异常在Java中普遍存在, 并且有存在的意义
* 可能发生异常的地方 ?
* 运行时
* 代码警告
* 语法错误(自己改)
* 解决异常的办法
* 抛出
* try...catch处理
* 代码可以继续运行 ,手动书写处理过程
7. 自定义异常
* 异常最终要的是类名
* 继承Exception就是编译时异常
* 继承RuntimException就是运行时异常
二维数组
* 数组中存放的还是数组
2. 权限修饰符
* public protected 默认 private
3. java中的包
* jvm识别类,要知道全名(包名+类名)
* 编译器有自动补全功能, 从类本上开始找 -- > import -- > package
4. Object
* toString
* hashCode
* equals
* getClass
* == 和 equals的区别
* equals相等的两个对象 hashCode一定相等, equals不等的两个对象, hashCode也有可能相等 (两个方法同步重写)
String 类
1. **定义**
* String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。我们可以将字符串看作是String, 但是严格严格意义上来说, String还是一个类,只是比较特殊罢了
2. **特殊性**
* String 类型的变量可以引用地址
* String 类型的变量可以直接指向常量
* String 对象的长度是不可变的,如果两个字符串拼接成一个字符串,其实是创建了一个新的字符串对象
```java
public static void main(String[] args) {
String str = new String();// 指向地址值
String str2 = "abc"; //指向常量
}
```
3. **常用的构造方法**
- public String():空构造
- public String(byte[] bytes):把字节数组转成字符串
- public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
- public String(char[] value):把字符数组转成字符串
- public String(char[] value,int index,int count):把字符数组的一部分转成字符串
- public String(String original):把字符串常量值转成字符串
- **测试题**
- 判断定义为String类型的s1和s2是否相等?
- String s1 = "abc";
- String s2 = "abc";
- System.out.println(s1 == s2);
- System.out.println(s1.equals(s2));
- 下面这句话在内存中创建了几个对象?
- String s1 = new String("abc");
- 答案: 创建了两个看对象,一个在常量池,一个在堆内存
- 判断定义为String类型的s1和s2是否相等
- String s1 = new String("abc");
- String s2 = "abc";
- System.out.println(s1 == s2);
- System.out.println(s1.equals(s2));
- 判断定义为String类型的s1和s2是否相等?
- String s1 = "a" + "b" + "c";
- String s2 = "abc";
- System.out.println(s1 == s2);
- System.out.println(s1.equals(s2));
- 判断定义为String类型的s1和s2是否相等?
- String s1 = "ab";
- String s2 = "abc";
- String s3 = s1 + "c";
- System.out.println(s3 == s2);
- System.out.println(s3.equals(s2));
4. **常用的判断方法**
* boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
* boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
* boolean contains(String str): 判断大字符串中是否包含小字符串
* boolean startsWith(String str): 判断字符串是否以某个指定的字符串开头
* boolean endsWith(String str): 判断字符串是否以某个指定的字符串结尾
* boolean isEmpty(): 判断字符串是否为空
* **案例**
- 需求:模拟登录,给三次机会,并提示还有几次。
- 用户名和密码都是admin
```java
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = 1;
while(i<=3){
System.out.println("请输入用户名");
String name = scanner.nextLine();
System.out.println("请输入密码");
String password = scanner.nextLine();
if("admin".equals(name)&&"admin".equals(password)){
System.out.println("恭喜您,登录成功");
break;
}
System.out.println("用户名或密码错误,请您重新输入,您还有"+(3-i)+"次机会机会");
i++;
}
scanner.close();
}
```
* 测试题
* 查询一个某个班级中所有姓张的学生
* String[] strs = {"李张蛋","张三","张飞","李伟","刘明"};
5. **常用的获取方法**
* int length(): 获取字符串的长度
* char charAt(int index): 获取指定索引位置的字符
* int indexOf(int ch): 返回指定字符在此字符串中第一次出现处的索引, ch是字符的码表值
* int indexOf(String str): 返回指定字符串在此字符串中第一次出现处的索引
* int indexOf(int ch,int fromIndex): 返回指定字符在此字符串中从指定位置后第一次出现处的索引
* int indexOf(String str,int fromIndex): 返回指定字符串在此字符串中从指定位置后第一次出现处的索引
* int lastIndexOf 同上
* String substring(int start):从指定位置开始复制字符串,默认到末尾
* String substring(int start,int end):从指定位置开始到指定位置结束复制字符串
* **案例**
* 需求:遍历字符串
```java
public static void main(String[] args) {
String str = "abcdkekdkgallsd";
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
```
* 测试题
* 需求:不准使用charAt(),遍历字符串
6. **常用的转换方法**
* byte[] getBytes(): 把字符串转换为字节数组
* char[] toCharArray():把字符串转换为字符数组
* static String valueOf(char[] chs):把字符数组转成字符串
* static String valueOf(int i):把int类型的数据转成字符串
* 注意:String类的valueOf方法可以把任意类型的数据转成字符串
* String toLowerCase():把字符串转成小写(了解)
* String toUpperCase():把字符串转成大写
* String concat(String str):把字符串拼接
* **案例**
* 需求:把一个字符串的首字母转成大写,其余为小写
```java
public static void main(String[] args) {
String str = "abCdkeHgDlsd";
String str2 = str.substring(0,1).toUpperCase().concat(str.substring(1).toLowerCase());
System.out.println(str2);
}
```
7. **替换方法**
* String replace(char old,char new) : 将字符串中的一部分字符用新的代替
* String replace(String old,String new) : 将字符串中的一部分字符串用新的代替
8. **切割方法**
* String[] split(String regex) : 按照规则来切割字符串
* String[] split(String regex, int limit) : 按照规则来切割字符串 limit 表示总共切成几段(也就是数组的长度)
9. **其他常用方法** abc
* trim() : 去除字符串前后的空格
* int compareTo(String anotherString) : 按字典顺序比较两个字符串(大小写)
* int compareToIgnoreCase(String str) : 按字典顺序比较两个字符串(忽略大小)
总结:这三天的内容主要介绍了java中多态的使用以及注意事项,final关键字的作用,抽象类的使用,接口的作用以及使用时机,内部类和异常的作用,二维数组的使用,权限修饰符的作用范围以及object类和string类的使用,string类作为一个特殊类,java中所有的字符串字面值都是该类的实例实现