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);
}
}