• Java中的toString、equals方法覆写,懒汉式单例模式,及异常处理



    1).Person类有name,age,salary属性,要求实现至少两个构造方法,并且属性私有,提供对应的getter、setter。 
    2).覆写toString方法,要求在System.out.println()函数中传递Person对象能打印出三个属性值而不是对象地址。 

    3).覆写equals方法,要求两个Person类对象的值相同时返回true。 

    class Person{
    	private String name;
    	private int age;
    	private double salary;
    	
    	public Person() {
    	}
    	public Person(String name, int age, double salary) {
    		this.name = name;
    		this.age = age;
    		this.salary = salary;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getAge() {
    		return age;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	public double getSalary() {
    		return salary;
    	}
    	public void setSalary(double salary) {
    		this.salary = salary;
    	}
    
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", salary=" + salary + "]";
    	}
    	public boolean equals(Object obj) {
    		if(obj==null) {
    			return false;
    		}
    		if(obj==this) {
    			return true;
    		}
    		if(obj instanceof Person) {
    			Person tmp = (Person)obj;
    			if(tmp.getAge()!=this.age) {
    				return false;
    			}
    			if(tmp.getName()==null) {
    				if(this.name!=null) {
    					return false;
    				}
    			}else if(!tmp.getName().equals(this.name)) {
    				return false;
    			}
    			if(tmp.getSalary()==this.salary) {
    				return true;
    			}			
    		}
    		return false;		
    	}
    	
    }
    
    public class Test412 {
    	public static void main(String[] args) {
    		Person p1 = new Person();
    		Person p2 = new Person();
    		Person p3 = new Person("张三", 20, 2000.5);
    		Person p4 = new Person("张三", 20, 2000.5);
    		Person p5 = new Person("李四", 20, 2000.5);
    		System.out.println(p1.equals(p2));
    		System.out.println(p3.equals(p4));
    		System.out.println(p3.equals(p5));
    		System.out.println(p1);
    		System.out.println(p2);
    		System.out.println(p3);
    		System.out.println(p4);
    		System.out.println(p5);
    	}
    	
    }


    //3.说出下列程序的执行结果,并说明原因: 
     Integer a = 55; 
     Integer b = 55; 
     System.out.println(a==b); 
     System.out.println(a==new Integer(55)); 
     System.out.println(a.equals(new Integer(55))); 
     Integer c = 129; 
     Integer d = 129; 
     System.out.println(c==d); 

    结果:

        1. true    //直接赋值,数值在-128~127之间的数,对象会在IntegerCache.cache 产生,会复用已有对象,所以返回结果为true

        2. flase    //通过new在堆内存开辟新的空间,所指向的不是同一地址,地址值不同,结果为false

        3. true    //我们看一下Integer的equals的源码

        public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }

                显然,Integer的equals的方法经过覆写了,它比较的该对象的属性value,55==55所以返回true

        4. flase    //如1所说的,数值129不在范围内,故在堆内存上开辟新的空间,两对象引用固然不同

         

        懒汉单例模式和饿汉单例模式

    package com;
    
    //懒汉式单例模式 
    class Singleton {
    	private static Singleton instance;	
    	private Singleton() {		
    	}
    	public static Singleton getInstance() {
    		if(instance==null) {
    			Singleton.instance = new Singleton();
    		}
    		return instance;
    	}	
    	public void print() {
    		System.out.println("懒汉单例模式");
    	}
    }
    
    //饿汉式单例模式 
    class SingletonH{
    	private final static SingletonH INSTANCE = new SingletonH();
    	private SingletonH() {
    	}
    	public static SingletonH getInstance() {
    		return INSTANCE;
    	}
    	public void print() {
    		System.out.println("饿汉单例模式");
    	}
    }
    
    public class Trst413 {
    	public static void main(String[] args) {
    		Singleton s1 = Singleton.getInstance();
    		Singleton s2 = Singleton.getInstance();
    		s1.print();
    		SingletonH h1 = SingletonH.getInstance();
    		SingletonH h2 = SingletonH.getInstance();
    		s2.print();
    		System.out.println(s1);
    		System.out.println(s2);
    		System.out.println(h1);
    		System.out.println(h2);
    	}
    }

    从结果上来看,两者并没有什么不同,但是懒汉式存在多线程安全问题,而饿汉式不会。

    从结构上看,懒汉式的属性instance没有初始化,而饿汉式在属性上初始化,可以这样理解记忆,懒汉式懒得去初始化交给方法去做,饿汉式已经饿的不行了,急着要吃这个实例化对象。


    异常处理

     1).定义一个MulException类继承Exception类,要求两数相乘等于100报错,在主类中定义一个方法,在方法中抛出此异常,在主方法观察结果。

    class MulException extends Exception{
    	public MulException() {
    		super("两数的乘积不能等于100");
    	}
    }
    public class Trst413 {
    	public static void main(String[] args) {
    		try {
    			System.out.println(mul(20, 5));
    		}catch (MulException e) {
    			e.printStackTrace();
    		}	
    	}
    	
    	public static int mul(int a, int b) throws MulException{
    		if(a*b==100) {
    			throw new MulException();
    		}
    		return a*b;
    	}
    }

    2).定义一个DivException类继承RuntimeException类,要求两数相除等于2报错,在主类中定义一个方法,在方法中抛出此异常,在主方法观察结果。
    class DivException extends RuntimeException{
    	public DivException(String msg) {
    		super(msg);
    	}
    }
    public class Trst413 {
    	public static void main(String[] args) {
    		try {
    			System.out.println(div(4, 2));
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		
    	}
    	public static int div(int x, int y) throws DivException{
    		int res=0;
    		res = x/y;
    		if(res==2) {
    			throw new DivException("两数相除不能等于2");
    		}
    		return res;
    	}	
    }

    题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 

        拿一天来举例:昨天的数量/2-1=今天的数量,则,昨天的数量=(今天的数量+1)*2,猴子是从第一天开始吃的,到第十天共吃了9天,所以只要做9次循环即可

    	int n = 1;
    	for(int i=0;i<9;i++) {
    		n=(n+1)*2;
    	}
    	System.out.println(n);
    结果:1534




  • 相关阅读:
    csuOJ啊 1553
    Codeforces 111B【看看自己和别人在代码能力上的差距!】
    hdu1849
    hdu 1847
    校队训练赛,同时也是HDU4497(数论:素数分解+组合数学)
    POJ 2356 (抽屉原理)
    线段树总结一【转】
    训练赛(1---5)D
    训练赛(1---5)A
    HDU1556 【树状数组】(改段求点)
  • 原文地址:https://www.cnblogs.com/yongtaochang/p/13615352.html
Copyright © 2020-2023  润新知