<3>第三期到java异常

2.14Object类:Object类是所有类的父类,可使用官网api查询工具查询具体需要

1,public String toString() 返回该对象的字符串表示。

2,public boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”

package com.java1234.pro_27;

public class People {
	private String name;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	//生成构造方法,使用字段, 
	public People(String name) {
		super();
		this.name = name;
	}

	@Override
	//若需要在打印对象的时候直接打印出名字,可以子类重写父类的toString方法
	public String toString() {
		return this.getName();
	}
	@Override
	//们需求,在name相同时候,就相等,重写子类的equals方法

 - List item

	public boolean equals(Object obj) {
		String name=((People)obj).getName();
		return this.name==name;
	}
	public static void main(String[] args) {
		People p1=new People("张三");
		People p2=new People("张三");
		People p3=new People("李四");
		// equals 是比较对象的引用,是否指向同一个堆内存;
		System.out.println("p1和p2:"+p1.equals(p2));
		System.out.println("p1和p3:"+p1.equals(p3));
		System.out.println("p2和p3:"+p2.equals(p3));
		
        //默认调用的是toString()方法;
		System.out.println(p1);  //本质与调用toString一样的,都是指向堆内存地址
		System.out.println(p1.toString());
	}
}

2.15、instanceof关键字:断一个对象是否属于一个类
public class Test {
	// static静态方法直接调用外部方法,需要加上static,否则需要通过对象来实现。
	//传入一个父类引用
	//判断一个对象是否属于一个类
	public static void dosomeThing(Animal animal){
		animal.say();
		if(animal instanceof Dog){
			((Dog) animal).f2();
		}else if(animal instanceof Cat){
			((Cat) animal).f1();
		}
	}
	public static void main(String[] args) {
		Animal dog=new Dog();
		System.out.println("dog类是否属于Animal类:"+(dog instanceof Animal));
        
		// 进行向下转型,会报错,在dosomeThing里面写好逻辑,防止转型错误
		dosomeThing(new Dog());
		dosomeThing(new Cat());
	}

}

2.16匿名内部类:实例化内部对象 就是没有名字的内部类

1.作用:假如某个类只使用一次,则可以使用匿名内部类;

// 定义一个接口
public interface A {

    public void a();
}
// 一个实现类

public class B implements A{
 
    @Override
    public void a() {
        System.out.println("a方法");
    }
 
}
// 具体测试类
public class Test {
    
  public void test(A a){
        a.a();
    }  
    public static void main(String[] args) {
        Test t=new Test();
        t.test(new B());
    }
}
/*在开发时候,看看接口是否有实现的类,若没有则采用匿名内部类开发,使用匿名内部类的时候,
要在匿名内部类汇总添加实现方法
*/

public interface C {
	public void name();
}

public class test {
	//多态
	public  void test(A a){
		a.a();
	}
	public void test(C name){
		name.name();
	}
	
	public static void main(String[] args) {
		test t=new test();
		t.test(new B());
	//此时若需要实现C接口,但是他没有具体的实现,则就可以使用匿名内部类,特性,一次使用
		t.test(new C(){

			@Override
			public void name() {
				System.out.println("我是C的匿名内部类");
			}
		});
	}
}

2.17包装类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KsbF4Xm-1655614870633)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220619005531915.png)]

  1. List item

1,装箱和拆箱

​ 基本类型和类类型可以相互转换;

​ 基本类型到类类型的转换叫做装箱;

​ 类类型到基本类型的转换叫做拆箱;

public class Demo1 {

    public static void main(String[] args) {
          //int的缓存范围值是-128到127
		   // a=时候 会把int转为包装类(Integer),此时底层会new Integer(),重新分配内存地址
        int a=1; //正常的定义变量
        Integer i=new Integer(a); // 装箱  放进去 
        int b=i.intValue(); // 拆箱 取出来
        System.out.println("a="+a);
        System.out.println("i="+i);
        System.out.println("b="+b);
    }
}
// 运行的结果都是1

2,自动装箱和拆箱

在类类型和基本类型的转换中,是自动转换的 无需强制类型转换;

public class Demo2 {
 
    public static void main(String[] args) {
        Integer i=1; // 自动装箱的过程 自动把基本类型转换成类类型
        int i2=i; // 自动拆箱的过程 自动把类类型转成基本类型
        System.out.println("i="+i);
        System.out.println("i2="+i2);
    }
}

3,包装类的作用

比如从用户界面来两个字符串数据a,b 然后我们程序里要进行相加运算。这时候包装类就派上用场了,

我们可以用包装类的方法类进行类型转换。我们看下示例代码:

public class Demo3 {
 
    public static void main(String[] args) {
        String a="3";
        String b="5";
        // 此时若直接相加两个字符串,行不通,可以采取转包装换
        int m=Integer.valueOf(a); // 调用Integer类的valuesOf方法 把字符串类型转换成int类型
        int n=Integer.valueOf(b);
        System.out.println("a+b="+(m+n));
    }
}
2.18Java设计模式-单例模式

计模式有很多 有单例,工厂,代理等等

单例对象能保证在一个JVM中,该对象只有一个实例存在;有两种实现,一种是饿汉式,一种是懒汉式;

1.饿汉式:

package com.java1234.chap03.sec18;
 
public class Singleton {
 
    /**
     * 构造方法私有
     */
    private Singleton(){
         
    }
     
    /**
     * 饿汉式单例实现
     */
    private static final Singleton single=new Singleton();
     
    /**
     * 获取实例
     */
    public static Singleton getInstance(){
        return single;
    }
}
/*
这里我们构造方法私有 这样就保证了在外部是无法来实例化对象;
然后我们先在内部定义一个静态常量对象,然后再写一个static方法 来返回这个对象,这样就保证是一个对象了;*/
// 测试类
package com.java1234.chap03.sec18;
 
public class Test {
 
    public static void main(String[] args) {
        Singleton singleton1=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println(singleton1==singleton2);
    }
}

//这里获取里两个对象 我们前面讲过 用“==”来判断对象是否指向同一个内存区域,这里返回true,说明是同一个对象;


2.懒汉式;

package com.java1234.chap03.sec18;
 
public class Singleton2 {
 
    /**
     * 构造方法私有
     */
    private Singleton2(){
         
    }
     
    /**
     * 懒汉式单例实现 在第一次调用的时候实例化
     */
    private static Singleton2 single;
     
    /**
     * 获取实例
     */
    public synchronized static Singleton2 getInstance(){
        if(single==null){
            System.out.println("第一次调用的实例化");
            single=new Singleton2();
        }
        return single;
    }
}
/*
我们可以看到 区别  饿汉式是先定义实例的 而懒汉式是先定义引用,当第一次调用getInstance的时候 进行对象实例化操作;
当然这里我们考虑到多并发的情况 多个线程同时调用这个方法的时候,会出现问题,所以我们加了同步锁 synchronized 来保证
同一时刻只有一个线程进入方法;*/

// 测试类
package com.java1234.chap03.sec18;
 
public class Test {
 
    public static void main(String[] args) {
        Singleton singleton1=Singleton.getInstance();
        Singleton singleton2=Singleton.getInstance();
        System.out.println("饿汉式:"+(singleton1==singleton2));
         
        Singleton2 singleton3=Singleton2.getInstance();
        Singleton2 singleton4=Singleton2.getInstance();
        System.out.println("懒汉式:"+(singleton3==singleton4));
         
    }
}
四、Java异常处理
1.异常概念
package com.java1234_4;

public class Demo1 {
	// 异常的概念 程序在执行过程中,出现意外,我们专业属于叫做出现了异常;类似开车路上出了交通事故;
	//正常程序
    public static void main(String[] args) {
		String a="123";
		int b=Integer.parseInt(a);
		System.out.println(a);
		
		
		
		 //不正常程序  ,这就是异常,在处理数值时候,编译报错
	    String c="12a";
	    int d=Integer.parseInt(c);
		System.out.println(c);
	}
    

2.Java异常处理-捕获和处理异常

在java中,我们用try-catch来捕获异常

public class Demo2 {
	public static void main(String[] args) {
		String a="1231e";
		try{
			int b =Integer.parseInt(a);
		}catch(Exception e){
		e.printStackTrace();
		}
		System.out.println("end");
	}
}

假如我们不确定会抛出什么异常,我们可以写多个异常捕获:

注意 由上往下的异常 必须范围同级别或者更高 详情科查api文档,Exception是异常的祖先

public class Demo1 {
 
    public static void main(String[] args) {
        String str="123a";
        try{
            int a=Integer.parseInt(str);          
        }catch(NullPointerException e){
            e.printStackTrace();
        }catch(NumberFormatException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("继续执行");
    }
}

try…cacth…finally 在finally里面的代码都会执行,在这个环境中,try…catch中的代码不一定会执行

但是在finally中的代码一定会执行

package com.java1234_4;

public class Demo2 {
	public static void main(String[] args) {
		String a="eee";
		try{
			int b =Integer.parseInt(a);
		}catch(NumberFormatException e){
		e.printStackTrace();
		} catch(InternalError e){
			e.printStackTrace();
		}catch(NullPointerException e){
			e.printStackTrace();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			System.out.println("无论什么异常,都会执行");
		}
		System.out.println("end");
		
	}

}

3.Java异常处理-throws和throw关键字

throws表示当前方法不处理异常,而是交给方法的调用出去处理;

throw表示直接抛出一个异常;不处理

//throws表示当前方法不处理异常,而是交给方法的调用出去处理;
public class Demo3 {
	//这是一个方法,在方法上抛出异常,在调用的地方去解决异常
	public static void  testThrows() throws NumberFormatException{
		String a="asd123";
		int b=Integer.parseInt(a);
		System.out.println(a);
	}
	public static void main(String[] args) {
	// 	此处调用放方法,则说明该处需要去解决异常  try  catch解决
		try{
			testThrows();
			System.out.println("here");
		}catch(Exception e){
			e.printStackTrace();
			System.out.println("我们在这处理异常");
		}
		System.out.println("I 'm here");
	}

}

//throw表示直接抛出一个异常;不处理 
public class Demo2 {
 
    public static void testThrow(int a) throws Exception{
        if(a==1){
            // 直接抛出一个异常类
            throw new Exception("有异常");
        }
        System.out.println(a);
    }
    public static void main(String[] args) {
        try {
            testThrow(1);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
4.Java异常处理-Exception 和 RuntimeException 区别

Exception是检查型异常,在程序中必须使用try…catch进行处理;

RuntimeException是非检查型异常,例如NumberFormatException,可以不使用try…catch进行处理,

但是如果产生异常,则异常将由JVM进行处理;

RuntimeException最好也用try…catch捕获;

public class Demo1 {
 
    /**
     * 运行时异常,编译时不检查,可以不使用try...catch捕获
     * @throws RuntimeException
     */
    public static void testRuntimeException()throws RuntimeException{
        throw new RuntimeException("运行时异常");
    }
     
    /**
     * Exception异常,编译时会检查,必须使用try...catch捕获
     * @throws Exception
     */
    public static void testException()throws Exception{
        throw new Exception("Exception异常");
    }
     
    public static void main(String[] args) {// 
       //  testException();   // testException()报错,我们对testException()加下try...catch即可;
         try {
            testException();
        } catch (Exception e) {
            e.printStackTrace();
        }
        testRuntimeException();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沁颖呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值