第三课

原创 2017年10月13日 10:38:29
//--------------------------Employee.java
package MyPackage;

import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Objects;

public class Employee 
{
    private String name;
    private double salary;
    private Date hireday;

    public Employee(String n,double s,int year,int month,int day)
    {
        name=n;
        salary=s;
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
        hireday=calendar.getTime();     
    }

    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireday()
    {
        return hireday;
    }
    public void raiseSalary(double byPercent)
    {
        double raise=salary*byPercent;
        salary+=raise;      
    }
    public boolean equals(Object otherObject)
    {
        if(this==otherObject)
            return true;
        if(otherObject==null)
            return false;
        if(getClass()!=otherObject.getClass())
            return false;
        Employee other=(Employee)otherObject;
        return Objects.equals(name, other.name)&&salary==other.salary&&
                Objects.equals(hireday, other.hireday);

    }
    //本来是只有toString()方法的,这里为了测试分为两个,看看效果
    public String toString1()
    {       
        //栗子1
        return "Employee"+"[name="+name+",salary="+salary+",hireDay="+hireday+"]";      
    }
    public String toString2()
    {       
        //栗子2
        return getClass()+"[name="+name+",salary="+salary+",hireDay="+hireday+"]";      
    }
    public String toString3()
    {       
        //栗子3
        return getClass().getName()+"[name="+name+",salary="+salary+",hireDay="+hireday+"]";        
    }
    public String toString()
    {       
        //重写超类函数
        return "Employee"+"[name="+name+",salary="+salary+",hireDay="+hireday+"]";      
    }
}
//-----------------------Manager.java
package MyPackage;

public class Manager extends Employee
{
    private double bonus;
    public Manager(String n, double s, int year, int month, int day) 
    {
        super(n, s, year, month, day);
        bonus=0;
    }
    public void SetBonus(double b)
    {
        bonus=b;
    }
    public double getSalary()
    {
        return super.getSalary()+bonus;     
    }
    public boolean equals(Object otherObject)
    {
        if(!super.equals(otherObject))
            return false;
        Manager other=(Manager)otherObject;
        return bonus==other.bonus;

    }
    //测试的两个继承自超类的toString,还有一个本身的,给比较一下
    public String toString1()
    {       
        //栗子11
        return super.toString1()+"[bonus="+bonus+"]";   
    }
    public String toString2()
    {       
        //栗子12
        return super.toString2()+"[bonus="+bonus+"]";       
    }
    public String toString()
    {       
        //栗子3
        return super.toString()+"[bonus="+bonus+"]";        
    }
}
//-----------------------------------EmployeeTest.java
package MyPackage;

public class EmployeeTest 
{
    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        Employee a=new Employee("Alice",7500,1988,12,15);
        Employee b=a;
        Employee c=new Employee("Alice",7500,1988,12,15);       
        Employee d=new Employee("Didi",7500,1988,12,15);

        System.out.println("------测试超类------");
        System.out.println("------测试==------");
        System.out.println("a==b? "+(a==b));
        System.out.println("a==c? "+(a==c));

        System.out.println("------测试equals()------");
        System.out.println("a.equals(c)? "+(a.equals(c)));
        System.out.println("a.equals(d)? "+(a.equals(d)));

        System.out.println("------测试toString------");
        System.out.println("Didi.toString():"+d);
        System.out.println("Didi.toString():"+d.toString());
        System.out.println("Didi.toString1():"+d.toString1());
        System.out.println("Didi.toString2():"+d.toString2());
        System.out.println("Didi.toString3():"+d.toString3());

        Manager e=new Manager("Eastly",8000,1986,12,13);
        Manager f=new Manager("Fred",9000,1985,12,10);
        f.SetBonus(2000);

        System.out.println("------测试子类------");
        System.out.println("f.toString():"+f);
        System.out.println("f.toString1():"+f.toString1());
        System.out.println("f.toString():"+f.toString2());
        System.out.println("e.equals(f)?"+e.equals(f));
    }

}


解释一:
观察可知:第18行可以理解,浅复制引用的是同一块内存(对象),但第19行跟第22行输出完全不一样
摘自:http://www.cnblogs.com/dolphin0520/p/3592500.html
  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是指向对象所存储的内容是否相等。


解释二:
如果x是任一对象,则

System.out.println(x);
/*这里会直接调用x.toString(),并打印输出得到的字符串。
 *但是,如果在子类中没有重写,则仍然调用Object类定义的toString(),
 *打印输出对象所属的类名和散列码。*/

解释三:

//关于getClass()方法
Employee e;
Class c1=e.getClass();//Object类中的getClass()会返回一个Class类型的实例。
//这里用一个Class对象表示一个Employee类的属性。
String name=c1.getName();//getName()将返回类的名字。
//如果类放在一个包里,则包的名字也作为类的一部分
/*另外,通常这样用来实现两个类对象比较的操作
if(e.getClass()==Employee.class)

*/

更多摘自:http://www.cnblogs.com/lianghui66/archive/2012/12/03/2799134.html

这里写图片描述


关于深拷贝和浅拷贝
首先摘自:http://www.cnblogs.com/Qian123/p/5710533.html

//-------------------------Employee.java
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Objects;

public class Employee implements Cloneable
{
    private String name;
    private double salary;
    private Date hireday;

    public Employee(String n,double s,int year,int month,int day)
    {
        name=n;
        salary=s;
        GregorianCalendar calendar=new GregorianCalendar(year,month-1,day);
        hireday=calendar.getTime();     
    }

    public String getName()
    {
        return name;
    }
    public void setName(String aname)
    {
        name=aname;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireday()
    {
        return hireday;
    }
    public void raiseSalary(double byPercent)
    {
        double raise=salary*byPercent;
        salary+=raise;      
    }
    public Employee clone() throws CloneNotSupportedException
    {
        Employee cloned=(Employee) super.clone();
        return cloned;
    }
    public String toString()
    {       
        //重写超类函数
        return "Employee"+"[name="+name+",salary="+salary+",hireDay="+hireday+"]";      
    }
}
//-----------------------EmployeeTest.java
public class EmployeeTest
{
    public static void main(String[] args) 
    {
        try
        {
            Employee original=new Employee("John",6000,1988,12,15);
            Employee copy=original.clone();
            copy.raiseSalary(0.3);  //改变值类型域
            copy.setName("Jack");   //改变String类型域
            System.out.println("original="+original);
            System.out.println("copy="+copy);

            System.out.println(original == copy);   //输出false           
        }
        catch(CloneNotSupportedException e)
        {
            e.printStackTrace();            
        }
    }
}

输出结果(这里是浅拷贝)可能看不出差别。
这里写图片描述
但当Employee类中还有内部类时(比如员工住址Address),复制情况就完全不同。构造Employee类对象时必然要构造相应的Address对象,浅拷贝只是对同一Address的引用,而深拷贝可以实现两个对象在内存空间内完全独立存在,从而不能影响整个Employee对象。所以在克隆方法内

    public Employee clone() throws CloneNotSupportedException
    {
        Employee cloned=(Employee) super.clone();
        //这里添加对内部类对象的克隆
        return cloned;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

Coursera 深度学习 deep learning.ai 吴恩达 第三课 结构化机器学习项目 第一周 测试题目 Bird recognition in the city of Peacetopia

Coursera 深度学习 deep learning.ai 吴恩达 第三课 结构化机器学习项目 Structuring Machine Learning Projects 第一周 测试题目 Bird...
  • justry24
  • justry24
  • 2017年10月10日 09:55
  • 2320

深度学习第三课 结构化机器学习项目 第二周机器学习策略(二) 笔记和作业

误差分析   观察错误标记的例子,统计数量,并归纳出产生误差的类型,针对不同类型的问题和优先级进行分别处理。   Incorrectly labeled examples. DL algorith...
  • qq_28031525
  • qq_28031525
  • 2018年01月08日 11:41
  • 77

斯坦福大学机器学习第三课“多变量线性回归“

斯坦福大学机器学习第三课“多变量线性回归(Linear Regression with Multiple Variables)” 斯坦福大学机器学习第四课”多变量线性回归“学习笔记,本次...
  • u011584941
  • u011584941
  • 2015年04月09日 19:36
  • 703

加州理工学院公开课:机器学习与数据挖掘_线性模型(第三课)

这一课时主要是讲述了线性模型的一些处理。 包括: 1、输入数据的表示(Input Representation) 2、线性分类(Linear Classification) 3、线性回归(Linear...
  • feitianhu213
  • feitianhu213
  • 2014年08月29日 22:16
  • 1655

【首尔大学韩国语】第三课 你好

http://bulo.hujiang.com/menu/5975/item/448526/ 【课文】  제3과 안녕하십니까? 你好  안녕하십니까?  你好  제 이름은 김영숙입니다.  ...
  • woshizoe
  • woshizoe
  • 2013年09月09日 15:18
  • 587

Andrew Ng's deeplearning Course 第1课、第2课、第3课、第4课课后练习题/编程题

吴恩达深度学习deeplearning第一课课后测验及编程作业(含答案): http://download.csdn.net/download/u012867545/10171710 吴恩达深度...
  • u012867545
  • u012867545
  • 2017年12月27日 10:20
  • 391

第三课 Tensorflow实现人工神经网络

Tesnroflow人工神经网络import numpy as np import tensorflow as tf from tensorflow.examples.tutorials import...
  • cjopengler
  • cjopengler
  • 2017年08月27日 17:12
  • 225

unity官方教程Space Shooter 学习笔记

我觉得这个教程对我最大的启发就是其中的一句话, 子物体是贴图,父物体是属性。所以我们在创建物体前最好先建立一个空的gameobject, 这样既可以保持hierarchy面板整洁便于管理,又能实现刚...
  • u013174702
  • u013174702
  • 2015年04月14日 08:43
  • 1091

Unity3D逆向基础教程第三课

课程名称:Unity3D逆向基础教程第三课课程类型:Unity3D课程内容: 1.对第二课作业的讲评 2.介绍爆破代码,引入demo,留下作业课程时长:36分钟课程作者:Sarkozy课程大小:【...
  • Sarkozy2014
  • Sarkozy2014
  • 2015年09月15日 00:14
  • 1060

第三课

压缩响应数据 1.ServletExampleThree.javaimport java.io.*;import javax.servlet.*;import javax.servlet.http.*...
  • dallasnash
  • dallasnash
  • 2007年03月28日 16:30
  • 533
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第三课
举报原因:
原因补充:

(最多只允许输入30个字)