学习Java的第八天 | 单例模式 | 多态 | 解耦合 | Java中的常用类 | 练习题 |

这篇博客介绍了Java编程中的重要概念,包括单例模式的实现(懒汉和饿汉模式)、多态的原理与应用、如何实现解耦合,以及Java中常用的字符串类。此外,还提供了相关的编程练习题,如字符串统计和转换操作。
摘要由CSDN通过智能技术生成

1 单例模式

static + private
单例就是一个类只有一个实例(一个对象)——节省内存
也就是不能随便的new出对象
实现思路过程:
1、可以将构造方法用privata修饰
2、可以不通过创建对象 进行方法的使用 类进行static方法的调用
3、用全局的static变量 保证我们的对象只有一个
创建单例模式的两种:
懒汉模式——调用了方法 才会创建对象

public class Cat(){
	//使用static修饰的全局变量
	private static Cat cat;
	//用private修饰构造方法
	//不通过创建对象来调用方法,使用static修饰
	public static Cat getInstance(){
		if (cat == null){
			return new Cat();
		}
		return cat;
	}
}

饿汉模式——不调用方法 ,对象早就创建好了

public class Cat(){
	private static Cat cat = new Cat();
	private static Cat getInstance(){
		return cat;
	}
}

2 多态

面向对象的语言 三大特性 1 封装 2 继承 3 多态
1 封装类
2 继承----------implements
3 向上转型
4 方法重写
5 动态绑定
多态建立在以上几个条件中 一个类的多种形态 一个父类 通过多个子类进行表示
父类通过多个子类形态表示的 多个子类 ------------父类的多个形态 多态
父类接受子类方式:
1 直接赋值 赋值多态
2 参数传递 传参多态

3 解耦合

利用主板和cpu举例
一开始,我们的电脑主板装的cpu是i3的

public class Mainboard {
    private String name;
    private I3 i3;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public I3 getI3() {
        return i3;
    }

    public void setI3(I3 i3) {
        this.i3 = i3;
    }

}
public class I3 {
    public void Computer(){
        System.out.println("i3cpu的计算方式");
    }
}
public class Test02 {
    public static void main(String[] args) {
        Mainboard mainboard = new Mainboard();
        mainboard.setName("宏碁");
        mainboard.setI3(new I3());
        System.out.println(mainboard);
    }
}

当市面上出现了i5的cpu的时候,我们想要更换时,我们发现以上的代码全部要进行更换

public class Mainboard {
    private String name;
    private I5 i5;

    public I5 getI5() {
        return i5;
    }

    public void setI5(I5 i5) {
        this.i5 = i5;
    }

    /*private I3 i3;
    
        public I3 getI3() {
            return i3;
        }
    
        public void setI3(I3 i3) {
            this.i3 = i3;
        }
    */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class I5 {
    public void Computer(){
        System.out.println("i5cpu的计算方式");
    }
}

按这样下去,每次更换cpu的时候,就需要所有的代码跟着一起变化
这就是耦合
解耦合就是,只需要修改一处,其他位置不需要修改

public class Mainboard {
    private String name;
    private Cpu cpu;

    public Cpu getCpu() {
        return cpu;
    }

    public void setCpu(Cpu cpu) {
        this.cpu = cpu;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}
public class I3 implements Cpu{
    public void Computer(){
        System.out.println("i3cpu的计算方式");
    }
}
public class I5 implements Cpu{
    public void Computer(){
        System.out.println("i5cpu的计算方式");
    }
}
public class Test02 {
    public static void main(String[] args) {
        Mainboard mainboard = new Mainboard();
        I3 i3 = new I3();
        I5 i5 = new I5();
        mainboard.setCpu(i3);
        mainboard.setCpu(i5);
        System.out.println(mainboard);
    }
}
public interface Cpu {
    void Computer();
}

另外,主板和cpu之间还得有关系,主板上预留cpu的接口,cpu放在接口上,还能再进行程序的运行

public class Test02 {
    public static void main(String[] args) {
        Mainboard mainboard = new Mainboard();
        I3 i3 = new I3();
        I5 i5 = new I5();
        mainboard.setCpu(i3);
        mainboard.setCpu(i5);
        System.out.println(mainboard);
        mainboard.getCpu().Computer();
    }
}

4 Java中的常用类

字符串常用类 String
1 创建对象常用方法

String()
//初始化新创建的String对象,他代表一个空字符序列
String string = new String("haohaoxuexi");
System.out.println(string);
String(byte[] bytes, int offset,int length)
//构建了一种新的String通过解码制定的字节数组使用平台的默认字符集
byte[] bytes = {48,49,50,51,52};
System.out.println(new String(bytes,0,5));
String(Char[] value)
//分配一个新的String,它代表了目前包含在字符数组参数字符序列

String(Char[] value,int offset,int count)
//分配一个包含字符与字符数组参数的新String

char[] chars = {'a','b','e'};
System.out.println(new String(chars));
System.out.println(new String(chars,0,2));
String s = "";//直接复制的方式
length()//返回字符串长度
//从字符串头找:
indexOf(String str)//找某个字符或字符串在指定字符串中的位置,默认从左到右
indexOf(int ch)//返回在制定字符的 第一个  发生的字符串中的索引
indexOf(int ch , int fromIndex)//在指定的索引出开始搜索,返回在指定字符的 第一个 发生的字符串中的索引

//从字符串末尾找:
lastIndexOf(String str)//找某个字符或字符串在指定字符串中的 最后发生的位置 ,默认从左到右
lastIndexOf(int ch)//返回在制定字符的最后一个发生的字符串的索引
lastIndexOf(int ch , int fromIndex)//在指定的索引出开始搜索,返回在指定字符的 最后 发生的字符串,其索引从指定的那个开始算

charAt()//返回指定索引的字符
toCharArray()//将字符串转为char数组
getBytes()//将字符串转为byte数组==转为ASCII码的数字
isEmpty()//判空
substring(int beginIndex)//返回一个字符串,从哪开始
substring(int beginIndex,int endIndex)//返回一个字符串 比上面多了一个结束条件,结束条件不包含
endWith(String suffix)//判断是不是以什么后缀结束
starWith(String prefix)//判断是不是以什么前缀开始
toLowerCase()//转小写
toUpperCase()//转大写
replace(char oldChar,char newChar)//指定字符替换
split(String regex)//指定字符切割字符串
split(String regex , int limit)//指定字符切割字符串,切割成几个串
replaceAll(String regex , String replacement)//指定的字符串,替换前面数据
replaceFirst(String regex , String replacement)//只替换第一个的数据
trim()//去除字符串前后空格
public class Test01 {
    public static void main(String[] args) {
        String s = "haohaoxuexi";
        System.out.println(s.indexOf("e"));
        System.out.println(s.indexOf(101));
        System.out.println(s.indexOf("o",3));
        System.out.println(s.indexOf(111,3));

        System.out.println("===================================");

        System.out.println(s.lastIndexOf("o"));
        System.out.println(s.lastIndexOf(111));
        System.out.println(s.lastIndexOf("o",3));
        System.out.println(s.lastIndexOf(111,3));

        System.out.println("===================================");

        System.out.println(s.charAt(5));


        for (int i = 0; i < s.length(); i++) {
            System.out.println(s.charAt(i)+" ");
        }

        System.out.println("===================================");

        for (char c:s.toCharArray()) {
            System.out.println(c+" ");
        }

        System.out.println("===================================");

        for (byte b:s.getBytes()) {
            System.out.println(b +" ");
        }

        System.out.println("===================================");


        System.out.println(s.isEmpty());

        System.out.println(s.substring(6));
        System.out.println(s.substring(6,9));
        System.out.println(s.endsWith("xi"));
        System.out.println(s.startsWith("hao"));
        System.out.println(s.toUpperCase());
        System.out.println(s.toLowerCase());
        System.out.println(s.replace("h","H"));

        System.out.println("===================================");

        String str = "hao,hao,xue,xi";
        String[] strings = str.split(",",3);
        for (String strs: strings) {
            System.out.println(strs);
        }

        System.out.println("===================================");

        System.out.println(str.replaceAll(","," "));
        System.out.println(str.replaceFirst(","," "));

        System.out.println("===================================");

        String s1 = "        hao     haoxuexi      ";
        System.out.println(s1.trim());
    }
}

5 练习题

统计一个字符串中字母、数字和其他字符的个数

public class Work01 {
    public static void main(String[] args) {
        String str = "12345678qwertyuiASDFGHJ!@#$%^&*";
        int countNum = 0;
        int countAlphabet = 0;
        int countChars = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)>='0'&& str.charAt(i)<='9'){
                countNum++;
            }else if (str.charAt(i) >= 'a' && str.charAt(i)<='z' || str.charAt(i)>='A'&&str.charAt(i) <='Z'){
                countAlphabet++;
            }else{
                countChars++;
            }
        }
        System.out.println("字母个数" + countAlphabet);
        System.out.println("数字个数" + countNum);
        System.out.println("字符个数" + countChars);
    }
}
//也可以这样
for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)>=48&& str.charAt(i)<=57){
                countNum++;
            }else if (str.charAt(i) >= 97 && str.charAt(i)<=122 || str.charAt(i)>=65&&str.charAt(i) <=90){
                countAlphabet++;
            }else{
                countChars++;
            }
}

通用版本:

public class Work01 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你想查询的字符串:  ");
        String str = sc.nextLine();
        int countNum = 0;
        int countAlphabet = 0;
        int countChars = 0;
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i)>=48&& str.charAt(i)<=57){
                countNum++;
            }else if (str.charAt(i) >= 97 && str.charAt(i)<=122 || str.charAt(i)>=65&&str.charAt(i) <=90){
                countAlphabet++;
            }else{
                countChars++;
            }
        }
        System.out.println("字母个数" + countAlphabet);
        System.out.println("数字个数" + countNum);
        System.out.println("字符个数" + countChars);
    }
}

编写程序将“jdk”全部变为大写,并截取子串“DK”输出到屏幕

public class Work02 {
    public static void main(String[] args) {
        String str = "jdk".toUpperCase();
        System.out.println(str.substring(1));
    }
}

给定字符串aaabbaabaaabb,将字符串进行计数aaa输出值为1+2+3 b代表0
则字符串输出值为1+2+3+1+2+1+2+3=12

public class Work03 {
    public static void main(String[] args) {
        String str = "aaabbaabaaabb";
        String[] string = str.split("b");
        int sum=0;
        for (String s:string) {
            if (s.length()>0){
                for (int i = 0; i < s.length(); i++) {
                    sum+=(i+1);
                }
            }
        }
        System.out.println(sum);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值