Java基础--面向对象(下)

1、接口

接口是一组行为的规范,接口不关系对个具体实现类之间是否是一种关系,关注他们的行为是否达到统一。

一旦实现(子)类 实现了 接口,那么必须要实现该接口中的所有行为。所以往往在设计时候,接口一般只放一个功能。(定义小而精的接口)

① 接口是一种数据类型

② 用interface进行定义,代表接口。

③ 接口中只能放常量和抽象方法。接口中不管是常量还是抽象方法 默认权限都是公开的

④ 接口是不能被创建对象的

⑤ 接口是需要被实现类/子类 实现的。一旦实现(子)类 实现了接口,那么必须实现该接口的所有行为。

⑥ 一个类是可以实现多个接口的!实现时需要通过implements来实现,在后面写上接口名即可

若一个子类继承了一个父类 又想实现接口,子类extends 父类名 implements 接口名

⑦ 接口和接口之间是可以继承的,例如:B接口比继承了A接口,但是C类若实现了B接口,那么C勇士还要实现A接口中的抽象内容。

class Aoo{ //定义一个 Aoo这个类
    
}
​
interface Boo{ //定一个 Boo 接口
    
}
package oo.d;
​
/**
 * 接口的测试类:
 */
public class InterfaceDemo {
    public static void main(String[] args) {
//        Inter1 i1 = new Inter1(); 接口不能被创建对象
    }
}
​
interface Inter1{ //接口 中默认是常量
    //接口中不管是常量还是抽象方法  默认访问权限都是公开的!
    //    int NUM = 10; 默认是常量
    static final int NUM = 1;//标准常量写法
​
    // void test(); 默认是抽象方法
    abstract void test();
}
​
class  Aoo{ //父类
}
class Boo extends Aoo implements Inter1{// 先继承父类  再实现接口
    @Override
    public void test() {
​
    }
}

 接口和抽象类的区别:

抽象类可以放构造方法;接口没有构造方法。

抽象类可以放普通成员变量;接口不可以。

抽象类可以放普通方法也放抽象方法;JDK1.8以前接口只能放抽象方法,现在其实可以加载静态方法、

抽象类中的成员(变量或方法)可以访问修饰符;接口中修饰符默认都是public

接口不可以实现接口,但是可以继承接口。

 一个类只可以继承一个类,但是可以实现多个接口。

总设计规则:

①将所有(概念统一的)类的共性属性和行为提取到父中(泛化)

②在父类中 若所有子类的行为具体实现逻辑都一样,设计为普通方法

③接口:(不同的类别或同样的类别)部分尊在行为相同,我们可以使用接口来进行优化和复用

2、多态、内存管理、面向对象总结

3、API文档

API(Application Programing Interface)应用程序接口(功能)

API表示的就是功能,通过学习API快速的开发

API实现初衷:设计速录就是将复杂的业务逻辑 封装成功能,供调用者更好的使用。对于使用者而言,不需要关注功能内部的实现细节,只需要知道如何使用即可

使用API(功能),有的功能需要导包,做常用的包

①java.long 包:Java语言的核心语法,内部封装了Java最核心的API,所以一站在使用long包下的内容的时候不需要导包。

例如:String、Object、System、Interface....

 ②java.io包:可以实现文件操作,输入输出等功能

③java.net:网络相关的功能

④java.util:工具包

3.1 String(字符串)

①java.long.String 这个类用final修饰不能被继承

②String类中维护了一个不可变(用final修饰)的char数组

③ 字符串一旦创建,对象的内容是不可变的,若重新为字符串的变量赋值,则表示一个新的对象

④String是一种数据类型,是引用类型

String name = "陈晓东";//声明一个String类型的变量 name里面存 了"陈晓东"字符串对象 //推荐的形式
String name1 = new String("陈晓东");//但是这种方式Java不推荐
char[] chs ={'陈','晓','东'};
上述代码 name 和 chs 在内存引用的内容是同一个。
​

 String可以复用的条件,String创建对象的形式分为两种

静态字符串创建方式可以实现复用:

① 以字符串字面量的形式创建:例如:"ABC"、"hello world"

②字符串的常量

③字符串的字面量拼接成的字符串

   public static final String S3 = "ABC"; //字符串常量 可以进行常量池复用
    public static void main(String[] args) {
//        String s1 = "ABC";//使用字面量  创建了一个String 对象
//        String s2 = s1;
//        s1 = s1 + "DEF";
//        System.out.println(s1);
//        System.out.println(s2);
        //可以复用的情况测试:
        String s1 = "ABC";
        String s2 = "ABC";
        String s4 = "A" + "BC"; //字符串字面量拼接 可以复用
        System.out.println(s1 == s2);
        System.out.println(S3 == s1);
        System.out.println(s1 == s4);

动态字符串创建的方法不可复用:

① 使用new关键字创建的字符串:String s = new String("ABC");

②String变量 拼接字面量

//不可复用的情况测试:
        String s5 =new String("ABC");  //不推荐
        String s6 = new String(new char[]{'A','B','C'}); //不推荐
        System.out.println(s5 == s1);
        String s7 = "A";
        String s8 = s7 + "BC";
        System.out.println(s8 == s1);
    }

3.2 StringAPI

String类中,提供了一些方法(API),可以获取字符串的长度,获取字符串中某个下标的字符,转换大小写,转换小写...

 ①获取字符串的长度,通过下边获取字符串中的某个字符


        String str = "Thinking in java是一本好书";
        int length = str.length();// 获取字符串长度
        System.out.println(length);
        char c = str.charAt(20);// 通过下标获取字符串中对应的字符
        System.out.println(c);
        /**
         *  面试题:请写一段程序,测试出 "Thinking in java是一本好书" 里面 字符i存在的次数
         * */
        int count = 0;
        for (int i = 0; i < str.length(); i++) {
             if(str.charAt(i) == 'i'){//判断当前字符是否 等于 字符 i
                count++;//计数
             }
        }
        System.out.println("i存在的次数:"+count);

② indexof()从头向后 检索字符或者字符串 在当前这个字符串中的位置

lastindexof()从后向前 检索字符或者字符串 在当前这个字符串中的位置

健硕到传入的字符或者字符串后,理解返回对应的下标

  String str = "Thinking in java是一本好书";
        int index = str.indexOf('i');//通过传入的字符 返回字符在字符串中存在的下标
        System.out.println(index);
        int index1 = str.indexOf('x');//如果找不到 则返回-1
        System.out.println(index1);
        int index2 = str.indexOf('i', 3);//可以指定起始检索位置向后检索字符
        System.out.println(index2);//5
        int index3 = str.indexOf("java");
        System.out.println(index3);
        //lastIndexOf 从后往前开始检索  无非检索的方向发生的变化 其它的功能使用与index是一致的。
        int index4 = str.lastIndexOf('i');
        System.out.println(index4);

 ③ 转换当前字符串的大小写方法

//3.转换大小写
        String str = "Thinking in java是一本好书";
        str = str.toUpperCase();//字符串字母内容转大写
        System.out.println(str);
        str = str.toLowerCase();//字符串字母内容转小写
        System.out.println(str);
        //4.去除两端空白
        String name = " Tom";
        System.out.println(name);
        name = name.trim();//去除字符串两端空白
        System.out.println(name);
        //5.是否是以什么开头 或 什么结尾的方法
        boolean r = name.startsWith("T");//判断是否是以xx开头的字符串内容
        System.out.println(r);
        boolean r1 = name.endsWith("m");//判断是否是以xx结尾的字符串内容
        System.out.println(r1);

 ④ subString();截取字符串

 String str = "bjzhangpeng@tedu.cn";
//        String user = str.substring(7);//截取字符串,填入截取起始下标位置,从此位置向后全部截取
        int endIndex = str.indexOf('@');
        String user = str.substring(0,endIndex);//截取字符串 不包括结束索引的位置(包头不包尾)
        System.out.println(user);
        //截取字符串的用法:
        //1.substring(开始索引,结束索引); 会截取出区域的字符串内容.
        //2.subString(开始索引,开始索引+要截取的长度);
        //为什么不包含结束位置,其实就是为了方便以后按照长度进行截取.
        String test = str.substring(0,0+5);
        System.out.println(test);

⑤ valueof(); String类提供的静态方法,主要作用就是可以将数值类型的字符变量转换为字符串

int a = 100;
String b = String.valueOf(a);
System.out.println(b);//"100"
System.out.println(100);//打印语句中放的任意的值类型数据 其实都是做了String.valueof的处理来显示的.

⑥contains();判断是否包含XX内容的方法使用

String c = "AOP";
boolean r = c.contains("A");//判断传入的字符串内容是否存在当前这个变量c中
System.out.println(r);

 String不适合频繁的修改,一旦发生修改,就是创建对象,若频繁的使用Sring修改,对内存的消耗非常大!容易出现异常,java.lang.OutOfMemoryError内存溢出

4、StringBuilder、正则表达式

解决当侵犯的对字符串进行修改时,可以使用Java提供的StringBuilder

因为StringBuilder内部维护了可变char数组,修改性能小,提供很多字符串修改相关的操作。

增删改插

        //增
        String str = "好好学习Java!";
        StringBuilder builder = new StringBuilder(str);//创建对象并传入要处理的字符串对象
        //append 字符串追加
        builder.append("为了找份好工作");
        System.out.println(builder);
        //改
        //好好学习Java!为了找份好工作  修改为好好学习Java!为了改变世界
        //replace 替换   1. 替换开始索引  2.结束的索引(包头不包尾)  3.替换的内容
        builder.replace(9, 16, "为了改变世界");
        System.out.println(builder);
        //删
        //delete 1.从哪里开始索引删除   2.到哪里结束索引(包头不包尾)
        builder.delete(0,9);
        System.out.println(builder);
        //插
        //insert  1.从哪里开始插入(索引)  2.插入的内容
        builder.insert(0,"活着");
        System.out.println(builder);
        //字符串内容反转
        //reverse反转
        builder.reverse();
        System.out.println(builder);
        str = builder.toString();//将处理好的字符串对象 再赋值给 str
        System.out.println(str);

正则表达式

正则报表式可以用来检测格式是否正确的功能,例如:邮箱的格式,手机号,身份证号码格式...都可以用正则来进行约束用户输入的数据

基本正则表达式:

 []表示的是一个字符的意思

[a,b,c]表示可以写任意一个a或者b或者c其中一个字符

[^abc]表示的是除了a或者b或者c之外的任意的任意字符串

[a-z]表示的是可以任意写一个26个小写字母其中一个字符

[a-zA-Z0-9]表示的是可以写 任意一个26个小写字母或者26个大写字母或者0-9的数字

[a-z&&[^bc]] 表示的是 26个小写字母中,除了bc 不可以写,其它都可以写

 预定字符集

.表示任意一个字符

\d表示可以写任意一个数字字符

\w表示单个词的字符

\s表示空白字符

\d表示非数字字符

\W表示非字母或数字字符

\S表示废空白的字符

?   代表可以写 0 - 1次
    例如:[abc]? 表示可以写一个 a 或 b 或 c,不能写其它的字符内容。
+   代表至少出现1次以上 没有上限
     例如:[abc]+ 表示至少写一个a 或 b 或 c内容,可以出现多次,但不能写其它的字符内容。
*   代表任意次,一次不写也可以    
---------------------------
限制次数 
        [abc]{3} 代表写3个字符
        [abc]{3,5} 代表至少写3个 最多写5个 
        [abc]{3,}  代表至少写3次 没有上限

分组

(abc){3}  表示:可以视为abc为一组  至少出现3组的意思
(abc|def){3}    表示:可以视为abc 或 def 为一组 至少出现3组的意思

正则表达式判断是否是邮箱

 String email = "bjzhangpeng@tedu.com.cn";
        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
        boolean match = email.matches(regex);//判断传入的正则表达式的格式 是否与 当前字符串对象中的邮箱格式匹配
        if(match){
            System.out.println("是邮箱");
        }else {
            System.out.println("不是邮箱!");
       }

 正则表达式切割的使用方式

String str = "abc123def456ghi";
                                        //0-9的数字出现一个或多个的地方来进行切割
        String[] data = str.split("[0-9]+");//传入正则表达式 根据正则的格式来进行切割
        for (int i = 0; i < data.length; i++) {
           // System.out.println(date[i]);
        }
        String str1 = "a,b,c,d,e,f";
        String[] data1 = str1.split(",");//也可以传入字符串的内容  根据具体的内容来进行切割
        for (int i = 0; i < data1.length; i++) {
            System.out.println(data1[i]);
        }

 正则表达式替换的使用方式

 String regex = "(sb|tmd|nc|wr|qnmd|dsb)";
        String message= "qnmd!你个dsb,你怎么这么nc!";
                                 //1.传入需要匹配的正则格式
                                // 2.若匹配时所替换的内容
        message = message.replaceAll(regex,"小可爱");
        System.out.println(message);
//        message = message.replaceAll(regex, "小可爱");
//        System.out.println(message);
        String str2 = "abc12de3f456";
        str2 = str2.replaceAll("[0-9]+", "NUMBER");
      //  System.out.println(str2);
        //replaceAll 支持正则的替换功能 , 也支持第一个参数填入具体的内容,匹配则全部替换。
        //replace   不支持正则的替换功能, 只要被替换的内容存在,则全部替换。
​
        String str3 ="abc123def123";
               //replace  方法   1.需要被替换的内容
                              //2. 实际替换的内容
        str3 = str3.replace("123","456");
        System.out.println(str3);
​

5、Object、包装类

object是所有类的直接父类或间接父类

我们所创建的类,默认继承了object这个类

为什么需要object类,因为Object类承载了所有类的共性内容,为Java提供了一系列的基础结构支撑,是所有类的(父类/基类)

5.1 创建一个point类

package object;
/**
 * point 代表点的意思。
 *
 * */
public class Point {
​
    private int x;//属性x
    private int y;//属性y
​
    public int getX() {
        return x;
    }
​
    public void setX(int x) {
        this.x = x;
    }
​
    public int getY() {
        return y;
    }
​
    public void setY(int y) {
        this.y = y;
    }
​
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
​
    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值