【原】Java学习笔记021 - Object
package cn.temptation;
public class Sample01 {
public static void main(String[] args) {
// 类 Object:是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
Person person = new Person();
System.out.println(person); // cn.temptation.Person@15db9742
// Object类的成员方法:
// int hashCode() :返回该对象的哈希码值。
// hashCode 和 对象在内存中的地址值有关,可以理解为对象在内存中的地址值
System.out.println(person.hashCode()); // 366712642(十进制值)-----> 15db9742(十六进制值)
System.out.println(Integer.toHexString(person.hashCode())); // 15db9742
}
}
// 显式的描述该类继承自Object类(平时写代码时都省略了这个继承)
class Person extends Object {
}
package cn.temptation;
public class Sample02 {
public static void main(String[] args) {
// Objec类的常用成员方法:
// Class<?> getClass() :返回此 Object 的运行时类。
// Class类:Class类的实例表示正在运行的 Java 应用程序中的类和接口。
// Class类的常用成员方法:
// String getName() :以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
Human human = new Human();
Class clazz = human.getClass();
System.out.println(clazz); // class cn.temptation.Human
System.out.println(clazz.getName()); // cn.temptation.Human
// 链式编程
System.out.println(human.getClass().getName()); // cn.temptation.Human
}
}
class Human {
}
package cn.temptation;
public class Sample03 {
public static void main(String[] args) {
// Object类的常用成员方法:
// String toString() :返回该对象的字符串表示。
// Animal animal = new Animal();
// System.out.println(animal); // cn.temptation.Animal@15db9742
// System.out.println(animal.toString()); // cn.temptation.Animal@15db9742
// 通过观察,发现直接打印对象 和 使用对象从Object类继承而来的toString()方法打印出的结果是一致
// 对比JDK中Object类的源码,其实toString方法就是这样的实现
// System.out.println(animal.getClass().getName() + "@" + Integer.toHexString(animal.hashCode())); // cn.temptation.Animal@15db9742
// 既然做了重写,那么就不再使用Object中的toString方法,使用子类重写的toString方法
Animal animal = new Animal("张三", 20);
System.out.println(animal);
System.out.println(animal.toString());
}
}
class Animal extends Object {
// 成员变量
private String name;
private int age;
// 构造函数
public Animal() {
super();
}
public Animal(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类中继承而来的toString方法
// @Override
// public String toString() {
// return "Animal [name=" + this.name + ", age=" + this.age + "]";
// }
// 使用alt+shift+s,alt+shift+s可以自动生成toString方法
@Override
public String toString() {
return "Animal [name=" + name + ", age=" + age + "]";
}
}
// Object类中的toString()方法源码
//public String toString() {
// return getClass().getName() + "@" + Integer.toHexString(hashCode());
//}
package cn.temptation;
public class Sample04 {
public static void main(String[] args) {
// 基本数据类型 使用 == 判断值是否相等
// int i = 2;
// int j = 3;
// System.out.println(i == j); // false
// 引用数据类型,使用 == 判断地址值是否相同
Man man1 = new Man("张三", 20);
Man man2 = new Man("张三", 20);
System.out.println(man1); // cn.temptation.Man@15db9742
System.out.println(man2); // cn.temptation.Man@6d06d69c
System.out.println(man1 == man2); // false
Man man3 = man1;
System.out.println(man3); // cn.temptation.Man@15db9742
System.out.println(man1 == man3); // true
System.out.println(man2 == man3); // false
System.out.println("--------------------------------------------");
// Object类的常用成员方法:
// boolean equals(Object obj) :指示其他某个对象是否与此对象“相等”。
// System.out.println(man1.equals(man2)); // false
// System.out.println(man1.equals(man3)); // true
// System.out.println(man2.equals(man3)); // false
// 首先直接使用Object类的equals方法,其实还是使用 == 进行比较,不符合要求(我们希望比较对象们的特征是否相同)
// 所以,考虑重写继承过来的equals方法
System.out.println(man1.equals(man2)); // true
System.out.println(man1.equals(man3)); // true
System.out.println(man2.equals(man3)); // true
// 注意:== 就可以判断基本数据类型的值是否相等;需要重写equals方法来判断引用数据类型的内容是否相等
}
}
class Man extends Object {
// 成员变量
private String name;
private int age;
// 构造函数
public Man() {
super();
}
public Man(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;
}
// 从equals方法的说明,看到要重写equals方法,需要先重写hashCode方法
// @Override
// public int hashCode() {
// int temp = 123;
// int result = 1;
//
// result = temp * result + age;
// result = temp * result + ((name == null) ? 0 : name.hashCode());
//
// return result;
// }
// 重写从Object类中继承而来的equals方法
// @Override
// public boolean equals(Object obj) {
// // 情况1、如果传入的对象是自身,不用比较了,空间是同一块空间,返回true
// if (this == obj) {
// return true;
// }
//
// // 情况2、如果传入的对象是null值,那也不用比较了,直接返回false
// if (obj == null) {
// return false;
// }
//
// // 情况3、比较当前对象 和 传入对象的运行时类是否相同,如果类类型都不相同,那也不用比较了,直接返回false
// if (this.getClass() != obj.getClass()) {
// return false;
// }
//
// // 情况4、equals方法传入的参数类型是Object类型,但是拿来比较的对象本质是Man类型的,是有name属性和age属性的,所以需要进行向下转型
// Man temp = (Man) obj;
//
// // 对基本数据类型的age属性进行比较
// if (this.age != temp.age) {
// return false;
// }
//
// // 对引用数据类型的name属性进行比较
// // String 类代表字符串。
// // String类的常用成员方法:
// // boolean equals(Object anObject) :将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
// if (this.name == null || temp.name == null) {
// return false;
// } else if (!this.name.equals(temp.name)) {
// return false;
// }
//
// return true;
// }
// 使用alt+shift+s,alt+shift+h进行hashCode方法和equals方法的重写
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Man other = (Man) 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;
}
}
// Object类中的equals方法源码
//public boolean equals(Object obj) {
// return (this == obj);
//}
package cn.temptation;
import java.util.Scanner;
public class Sample05 {
public static void main(String[] args) {
// 类 Scanner:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
// Scanner类的构造函数:
// Scanner(InputStream source) :构造一个新的 Scanner,它生成的值是从指定的输入流扫描的。
// Scanner类的常用成员方法:
// void close() :关闭此扫描器。
// 类 InputStream:此抽象类是表示字节输入流的所有类的超类。
// 类 System:System 类包含一些有用的类字段和方法。它不能被实例化。
// System类的字段:
// static InputStream in :“标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
System.out.println("输入数字:");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
scanner.close();
System.out.println("i:" + i);
}
}
package cn.temptation;
import java.util.Scanner;
public class Sample06 {
public static void main(String[] args) {
// Scanner类的常用成员方法:
// 1、void close() :关闭此扫描器。
// 2、next()方法和nextXXX()方法:获取扫描器扫描的内容
// 3、hasNext()和hasNextXXX()方法:在获取扫描器扫描的内容之前,先判断一下扫描的内容是否是指定的数据类型
System.out.println("输入数字:");
Scanner scanner = new Scanner(System.in);
// 虽然要求用户输入数字,但是用户的输入是具有未知性的,输入的不是数字时,可能会产生异常:java.util.InputMismatchException
// int i = scanner.nextInt();
// 改进方案:先使用hasNext()方法 和 hasNextXXX()方法进行操作前的检查工作
if (scanner.hasNextInt()) {
int i = scanner.nextInt();
System.out.println("i:" + i);
} else {
System.out.println("输入的不是int类型的数据");
}
scanner.close();
}
}
【原】Java学习笔记021 - Object的更多相关文章
- 1.9(java学习笔记)object类及toString()与equals()方法
object类 java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类. 例如 class Person {......};和class Person e ...
- Java学习笔记之——Object类
所有类的祖先 如果一个类没有显式继承,则继承Object 每一个类都直接或间接的是Object的子类 相关API: protected Objectclone() 创建并返回此对象的副本. boole ...
- Java学习笔记之Object常用方法
Object:万类之祖 == : 比较的是是否是同一个对象,比较的是地址 equals: 是Object里面的方法,默认的是==,比较的是地址,但在String类型里重写为比较内容 一般我们在 ...
- java学习笔记之基础篇
java选择语句之switch //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...
- java学习笔记6--类的继承、Object类
接着前面的学习: java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记16--I/O流和文件
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input Output)流 IO流用来处理 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
随机推荐
- Visual Studio 2010软件安装教程
链接:https://pan.baidu.com/s/10FeLlKpzFcb9yUjm3ZECsg 提取码:pup1 复制这段内容后打开百度网盘手机App,操作更方便哦 1.右击软件压缩包,选择解压 ...
- 微信小程序day01-JSON配置
微信小程序 小程序代码构成 JSON配置WXML模板WXSS样式JS逻辑 1.JSON配置 小程序配置 app.json app.json: 是当前小程序的全局配置,包括了小程序的所有页面路径.界面表 ...
- HBase之CF持久化系列(续1)
这一节本来打算讲解HRegion的初始化过程中一些比较复杂的流程.不过,考虑前面的博文做的铺垫并不够,因此,在这一节,我还是特意来介绍HBase的CF持久化.关于这个话题的整体流程性分析在博文< ...
- 你还在 Select * 吗?
应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...
- How does the vuejs add the query and walk the object?
让这个老实返回的页面添加特殊路由,这个页面常常都是登录注册.这次我们根据登录举例. 省略 { path:'/login?url=:url', name:'loginfirst', component: ...
- 浅谈新的布局方式-flex
引言: 网页布局在flex出来之前,是由盒模型为底子,float,position,table,百分比来进行布局的,重绘的比较多,影响性能,复杂又不好维护.flex布局,可以简便.完整.响应式地实现各 ...
- UPC:ABS
问题 G: ABS 时间限制: 1 Sec 内存限制: 128 MB提交: 537 解决: 186[提交] [状态] [讨论版] [命题人:admin] 题目描述 We have a deck c ...
- python:数据库连接操作入门
模块 import pymssql,pyodbc 模块说明 pymssql和pyodbc模块都是常用的用于SQL Server.MySQL等数据库的连接及操作的模块,当然一些其他的模块也可以进行相应的 ...
- PE知识复习之PE的重定位表
PE知识复习之PE的重定位表 一丶何为重定位 重定位的意思就是修正偏移的意思. 如一个地址位 0x401234 ,Imagebase = 0x400000 . 那么RVA就是 1234. 如果Im ...
- Java8之Optional类
写在前头 今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议. [推荐]防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:1 ) 返回类型为基本数据类型,return 包 ...