Java基础(五)

Java设计模式–单例模式

  • 单例模式,是一种常用的软件设计模式。
  • 在它的核心结构中只包含一个被称为单例的特殊类。
  • 通过单例模式可以保证系统中,应用该模式的类,
  • 一个类只有一个实例。即一个类无论如何创建都只有一个对象实例。
  • 单例模式的几个要点
    • 私有化构造函数
    • 提供一个静态的私有该对象的的属性
    • 提供被public修饰的静态方法
  • 单例模式下的线程安全
    • 懒汉模式(需有同步代码块)
      • 线程安全,调用效率不高,但是能延时加载
    • 饿汉模式
      • 线程安全,调用效率高,但是不能延时加载
    • Double CheckLock (双检锁模式–两判断1.null判断2.class判断 )
      • 由于JVM底层模型原因,偶尔会出问题,不建议使用
    • 静态内部类实现模式
      • 线程安全,调用效率高,可以延时加载
    • 枚举类
      • 线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用
  • 单例模式的两种方式
    • 懒汉模式
      • 单例模式之懒汉单例模式
      • 线程不安全—同步代码块来解决
      • 用时间换空间–效率低
public class Demo01{
	public static void main(String[] args){
		Bggl L01=Bggl.getIntence();
	}
}
class Bggl{
	//1、实例化构造函数
	private  Bggl(){};
	//2、提供一个本类的私有静态对象
	private  static Bggl L01=null;
	//3、提供一个公开的静态的可以创建对象的方法
	public  static Bggl getIntence(){
			if(L01==NULL)
				L01=new Bggl();
			return L01;
	}

}
  • 单例模式之二
    • 饿汉模式
      • 线程安全
      • 饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存
      • 但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。
public class Demo01{
	public static void main(String[] args){
		Bggl L02=Bggl.getIntence();
	}
}
class Bggl{
	//1、私有化构造方法
	private  Bggl(){}
	//2、私有化静态的本类对象
	private static Bggl L02=new Bggl();
	
	//3、创建一个公共的静态的可被实例化的方法
	public static Bggl getIntecne(){
		retrun L02;
	}

}

异常

Java 是采用面向对象的方式来处理异常,处理过程

  • 定义
    • 异常是指java程序在运行过程中出现的错误

异常类的父类–Throwable

  • Throwable子类类中有Error和Exception

编译异常与运行时异常的区别

  • 编译异常必须要try…catch/throws
  • 运行时异常则不需要try…catch/throws

异常的处理方案

  • throws

  • 把问题向上抛出,抛给它的调用者去处理

  • try{…} catch{…}

    • 可嵌套

    • 捕捉多个异常

      • 一行代码可能产生多个不同的异常,我们需要针对具体的错误进行补救
      • 所以需要捕捉不同的异常,添加补救的代码
      • 父类的异常放在下面
  • try{…}catch{…}finally{…}//不论是否抛出异常与否,finally内的代码最后都会执行。

try-catch-finally中,如果在catch中return了,finally中的代码还会执行么,原理是什么?

代码一:catch中有return,finally中无retrun

/*
 * java面试题20--如果catch里面有return语句,finally里面的代码还会执行吗?
 */
public class FinallyDemo2 {
    public static void main(String[] args) {
        System.out.println(getInt());
    }

    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
        } finally {
            a = 40;
        }
            /*
             * return a 在程序执行到这一步的时候,这里不是return a 而是 return 30;这个返回路径就形成了
             * 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
             * 再次回到以前的路径,继续走return 30,形成返回路径之后,这里的a就不是a变量了,而是常量30
             
             
             **归纳**  
             *异常->catch { a=30 ,准备return 30时,发现有finally} 故 
                            ->finally a=40;(但这里无return) 
             	            ->返回catch的return 位置。
             	  故a=30,输出结果30
             */
        return a;
    }
}

代码二:catch中有return,finally中有retrun

package com.java_02;
 
public class FinallyDemo2 {
    public static void main(String[] args) {
        System.out.println(getInt());
    }
 
    public static int getInt() {
        int a = 10;
        try {
            System.out.println(a / 0);
            a = 20;
        } catch (ArithmeticException e) {
            a = 30;
            return a;
  
        } finally {
            a = 40;
            return a; //如果这样,就又重新形成了一条返回路径,由于只能通过1个return返回,所以这里直接返回40
        }
 		**归纳**  
             *异常->catch { a=30 ,准备return 30时,发现有finally}->finally a=40;(但这里有return) 
             	            ->直接return 40。
             	  故a=40,输出结果40
             */
//      return a;
    }
}

自定义异常

  • 定义
    • 自己定义的异常
  • 自定义异常方法
    • 继承Exception 必须抛出,需要在编译前处理
    • 继承RuntimeException 不需要抛出,编译前不需要处理

常见异常

  • java.lang.ArithmeticException //数学类型异常
  • StringIndexOutOfBoundsException//字符串下标越界
    • [String s = “h”;s.charAt(10)]
  • ArrayIndexOutOfBoundsException//数组下标越界
  • classCastException//类强转异常
  • NullPointerException//空指针异常
    • String s = null;s.length()
  • java.text.ParseException// 解析异常

数组和二维数组的初始化

String[] a= new String[5];

String[] a={"b01","b02"};
//初始化时,“2”的位置必须确定
String[][] names = new String[2][];
//整行赋值
s[0]=new String[]{"1","2","3","4"};
下列数组的声明有哪些是对的?错的应该怎么修改?
A.int[]a;     T  int a[]    T
B.inta[]=newint[3];   T
C.int[]a;a={1,2,3,4,5}; F
D.int[]a=newint[3]{1,2,3}; F;

数组在内存中的分配图

  • 数组的引用在栈内存
  • 数组的对象在堆内存

在这里插入图片描述### 对象数组的概述和使用

Stu[] stus = new Stu[5];
stus[0] = new Stu("Lily", 22);
stus[1] = new Stu("Lucy", 25);
stus[2] = new Stu("Luck", 26);
stus[3] = new Stu("Lala", 28);
stus[4] = new Stu("Lida", 21);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值