[2017.10.28]Object&Scanner

来源:互联网 发布:公司招人用什么软件 编辑:程序博客网 时间:2024/06/06 01:05

Object类

1.概念:
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类(父类)。所有对象(包括数组)都实现这个类的方法。

2.类型:
public int hashCode()返回该对象的哈希码值
hashCode()—–>通过哈希算法(哈希表:hashtable)—->地址值(不是实际意义上的地址值!)
public final Class getClass()返回此 Object 的运行时类 (Java反射机制中讲!)

3.Class类中有一个方法:
public String getName()以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

4.演示:

public class ObjectDemo {    public static void main(String[] args) {        //创建学生对象        Student s1 = new Student() ;        System.out.println(s1.hashCode());//1460821906        Student s2 = new Student()  ;        System.out.println(s2.hashCode());//2045891656        Student s3 = new Student() ;        System.out.println(s3.hashCode());//      System.out.println("hello".hashCode()) ;//      public final Class getClass()返回此 Object 的运行时类        Class c1 = s1.getClass() ;//      System.out.println("c1:"+c1);//class org.westos.object_01.Student        //public String getName():获取当前正在运行的这类的全路径名称!        String name = c1.getName() ;        System.out.println("name:"+name);//org.westos.object_01.Student :全路径名称                                        //org.westos.object_01.Student    }}

5.Object的另一个方法:
public String toString();返回该对象的字符串表示(建议所有子类都重写此方法)

6.Integer类中有一个方法:
public static String toHexString(int i):将一个int类型的数据转换成一个十六进制的字符串表现形式

7.如果直接输出对象名称,想要显示当前对象的成员变量的值,那么必须重写Object类中的toString()方法

8.演示:

public class ObjectDemo {    public static void main(String[] args) {        //创建一个学生对象        Student s1 = new Student("高圆圆",27) ;        //直接输出对象名称        /*System.out.println("s1:"+s1);//org.westos.object_02.Student@7439aca7        //public String toString()        System.out.println("toString():"+s1.toString());//org.westos.object_02.Student@7439aca7        System.out.println("--------------------------");*/        /**         * 通过查看toString()源码:         *  public String toString() {                return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());            }            toString()<==> 对象名.getClass().getName() +"@" +Integer.toHexString(对象名.hashCode())         */        System.out.println(s1.getClass().getName()+"@"+Integer.toHexString(s1.hashCode()));//      System.out.println(s1.toString());        //org.westos.object_02.Student@28169674        //org.westos.object_02.Student@28169674        //直接对象名称,想要显示成员变量的值,怎么办?//      System.out.println(s1);        Student s2 = new Student("高圆圆", 27) ;        System.out.println("s2:"+s2);        System.out.println(s1==s2);    }}
//学生类public class Student extends Object {    //成员变量    private String name;    private int age ;    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    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;    }    //当前toString()是自己去写的/*  @Override    public String toString() {        return name+"---"+age;    }*/    //alt+shift+s->s    //自动生成即可!    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }}

9.Object中的另一个方法:
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”.

  1. 面试题:
    ==和equal()方法的区别
    ==:比较的是两个对象的地址值是否相同,
    equals()方法默认比较的是两个对象的地址值是否相同,如果重写了Object类中的equals()方法,那么默认比较就是两个对象的内容是否相同

11.使用工具自动生产equals()方法
javascript:Array对象,Number对象,String对象,valueOf():====>s1.valueOf(s2) ;
比较是内容是否相同

12.演示:

public class ObjectDemo {    public static void main(String[] args) {        //创建学生对象        Student s1 = new Student("高圆圆", 27) ;        Student s2 = new Student("高圆圆",27) ;        System.out.println(s1==s2);        System.out.println("------------------");        Student s3 = s1 ;        System.out.println(s1==s3);        System.out.println("-------------------");        System.out.println(s1.equals(s2));//由于重写Object中的equals()方法,所以比较的是对象的内容是否相同!        /**         * equals()方法的源码         *   public boolean equals(Object obj) {            return (this == obj);        }            由于Object类中的equals()方法底层是通过"=="来实现的,所以默认比较的是地址值,如果想比较内容是否相同,需要重写equals()方法         * */    }}
public class Student {    //成员变量    private String name;    private int age ;    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    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;    }    //toString()    @Override    public String toString() {        return "Student [name=" + name + ", age=" + age + "]";    }    //重写了Object类中的equals()方法    @Override    public boolean equals(Object obj) { //Studnet s2 = new Student() ;        if (this == obj)            return true;        if (obj == null)  //当前传入过来的对象是否为空            return false;        if (getClass() != obj.getClass())   //this.getClass() != s2.getClass()                  return false;        Student other = (Student) obj;        if (age != other.age)            return false;        if (name == null) {            if (other.name != null)                return false;        } else if (!name.equals(other.name))            return false;        return true;    }    /**     * 对象名  instanceof 类:判断该对象是否是该类的一个实例     * */}

13.Object类中的其他两个方法:
protected void finalize()throws Throwable:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,但是,什么时候调用垃圾回收器不确定;

14.System类中的一个方法:
public void gc():运行垃圾回收器,这个垃圾回收器最终调用的就是finalize()方法
protected Object clone():创建并返回此对象的一个副本
throws CloneNotSupportedException注意事项:
Object 类的 clone 方法执行特定的复制操作。首先,如果此对象的类不能实现接口 Cloneable,则会抛出 CloneNotSupportedException.

15.演示:

public class ObjectDemo {    public static void main(String[] args) throws CloneNotSupportedException {//该异常是编译时期异常        //创建s1这个学生对象        Student s1 = new Student() ;        s1.setName("高圆圆") ;        s1.setAge(27) ;        System.out.println(s1.getName()+"---"+s1.getAge());        //复制s1这个对象        Object obj = s1.clone() ;        //向下转型:        Student s2 = (Student) obj;        System.out.println(s2.getName()+"---"+s1.getAge());        System.out.println("----------------------");        //没有讲clone方法之前:        Student s3 = s1; //把s1地址值赋值s3对象,s3指向s1的堆内存中的地址值        System.out.println(s3.getName()+"---"+s3.getAge());    }}
//学生类//要去使用clone()方法,当前对象所在的类一定要实现cloneable接口,public class Student implements Cloneable{    private String name ;    private int age ;    public Student() {        super();    }    public Student(String name, int age) {        super();        this.name = name;        this.age = age;    }    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;    }    //重写Object类中clone()    @Override    protected Object clone() throws CloneNotSupportedException {        return super.clone();    }}

Scanner

1.
1)Scanner:用来创建一个文本扫描器(键盘录入)
2)java高级特性:IO流(后面讲)
BufferReder:字符缓冲流来键盘录入
java.util.Scanner;s
Scanner sc = new Scanenr(System.in);

2.System类中的静态字段:
public static final InputStream in: 标准输入流
InputStream :字节流 InputStream is = System.in ; 实质:抽象类多态
public static final OutputStream out: 标准输出流

  1. 开发步骤:
    1)创建键盘录入对象
    2)录入数据
    3)输出

4.演示:

public class ScannerDemo {    public static void main(String[] args) {        //创建键盘录入对象        Scanner sc = new Scanner(System.in) ;        //录入数据        int a = sc.nextInt() ;        System.out.println("a:"+a);    }}

5.Scanner类中常用的方法:
判断的功能:
细节:可以添加逻辑判断
hasNextXXX(); 在录入数据之前,加上判断功能,判断是否由下一个可以录入的XXX类型的数据
nextXXX();//通过录入获取这个int类型的数据
举例:
public boolean hasNextInt()
nextInt();
nextInt():录入int类型的数据
nextLine():录入一个字符串类型

  1. java.util.InputMismatchException:
    输入和想到的数据不匹配

7.演示:

public class ScannerDemo2 {    public static void main(String[] args) {        //创建键盘录入对象        Scanner sc = new Scanner(System.in) ;        if(sc.hasNextInt()){            //是否有下一个可以录入的int类型的数据            //录入数据            int a = sc.nextInt() ;            System.out.println("a:"+a);        }else{            //错误提示            System.out.println("录入的数据类型和想要的不匹配!");        }        //java.util.InputMismatchException:输入和想到的数据不匹配    }}

8.Scanner类中的注意事项:
先录入int类型的数据,在录入String类型数据,第二次录入的数据没有接收到,直接输出结果了,由于”回车”才能接收数据
回车换行符导致的!
解决方案:
在第二次录入String类型数据之前,需要重新创建键盘录入对象录入String类型

9.演示:

public class ScannerDemo3 {    public static void main(String[] args) {        //键盘录入对象        Scanner sc = new Scanner(System.in) ;        //先录入两个int类型的数据        /*int a = sc.nextInt() ;        int b = sc.nextInt() ;        System.out.println("a:"+a+",b:"+b);*/        //录入两个String类型的数据        //hasNextLine        /*String a = sc.nextLine() ;        String b = sc.nextLine() ;*/        //先录入String类型的数据,在录入int类型的数据        /*String a = sc.nextLine() ;        int b = sc.nextInt() ;*/        //先录入int类型,再录入String类型        int a = sc.nextInt() ;//      String b = sc.nextLine() ;        String b = sc.next() ;        /*        int a = sc.nextInt() ;        //创建键盘录入对象        Scanner sc2 = new Scanner(System.in) ;        String b = sc2.nextLine() ;        */        System.out.println("a:"+a+",b:"+b);    }}