第四天总结

多态

    * 子类对象可以存到父类的变量中

    * 前提条件

      * 子父类关系

      * 方法重写

      * 父类引用指向子类对象

    * 好处

      * 提高代码的复用性和扩展性

    * 缺点

      * 不能使用子类对象的特有方法

    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中所有的字符串字面值都是该类的实例实现

你可能感兴趣的:(第四天总结)