常见对象中的问题1
目录
1.Eclipse的概述使用
2.API的概述
(1)应用程序编程接口
(2)就是JDK提供给我们的一些提高编程效率的Java类
3.Object类
(1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类
(2)Object类的构造方法有一个,并且是无参构造
者其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
(3)要掌握的方法
A:toString()
返回对象的字符串表示,默认是由类全路径+’@’+哈希值的十六进制表示。
这个表示其实是没有意义的,一般子类都会重写该方法
B:equals()
比较两个对象是否相同,默认情况下,比较的是地址值是否相同
而比较地址值是没有意义的,所有一般子类也会重写该方法
可以自动生成
(4)要了解的方法
A:hashCode() 返回对象的哈希值。不是实际地址,可以理解为地址值
B:getClass() 返回对象的字节码文件对象,反射中我们会详讲
C:finalize() 用于垃圾回收,在不确定的时间
D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是他和两个引用指向是有区别的
(5)两个注意问题
A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。如果输出对象名,打印
出来的是a+@+…说明没重写方法,要是输出,字符串说明重写了
B:== 和equals()的区别
==:
基本类型:比较的是值是否相等
引用类型:比较的是地址值是否相等
equals:
引用类型:默认比较的是地址值,但是也可以根据自己的要求重写该方法
常见开发工具的介绍
集成开发环境IDE
(integrated Development Environment)
debug的基本使用
debug的作用:
调试程序
查看程序执行流程
如何查看程序执行流程:
要想看程序流程,就必须设置断点。
什么是断点
就是一个标记,从哪里开始
如何设置断点
你想看哪里的程序,你就在那个有效程序的左边双击即可。
在哪里设置断点
哪里不会点哪里
目前:我们就在每个方法的第一天有效语句上都加
如何运行设置断点后的程序
右键–Debug as --Java Application
看哪些地方
Debug:断点测试的地方
在这个地方,记住F6,或者点击也可以。一次看一行的执行过程。
Variables:查看程序的变量变化
ForDemo:被查看的源文件
Console:控制台
如何去除断点
a:再次双击即可
b:找到Debug视图,variables界面,找到Breakpoints,并点击,然后看到所有的断点,最后点击那个双叉
常见对象API概述
API(Application Programming Interface)
应用程序编程接口
编写一个机器人程序去控制一个机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等
各种命令,没有编过程序的人很难想象这样的程序该如何编写。但是对于有经验的开发人员来说,知道机器人厂商
一定会提供一些用于控制机器人的Java类,这些类中第一好了操作机器人各种动作的方法。其实,这些Java类
就是机器人厂商提供给应用程序编程的接口
大家把这些类称为Xxx Robot API.本章涉及的JavaAPI指的就是JDK中提供的各种功能的Java类
学习汉语和编程语言的异同点
相同点
基本语法
大量成语
写文章的手法和技巧
不同点
学习汉语,必须先学后用
学习编程 ,可以现用现学
Object类的概述
Object类的概述
类层次结构的根类
所有类都直接或者间接的继承自该类
构造方法
public Object()
回想面向对象中为什么说:
子类的构造方法默认访问的是父类的无参构造方法
Object类的hashCode
public int hashCode();返回该对象的哈希码值。
注意:哈希值是根据哈希算法算出来的一个值,这个值和地址值有关,
但是不是实际地址值,你可以理解为地址值。
Student s1 = new Student();
System.out.println(s1.hashCode());
Object类的getclass()方法
Student s = new Student();
Class c = s.getClass();
String str = c.getName();
System.out.println(str);//打出当前类的包名及其类名
链式编程
String str2 = s.getClass().getName();
System.out.println(str2);
Object类的toString()方法
toString()方法的值等价于它:
this.getClass().getName()+’@’+Integer.toHexString(this.hashCode());//this是对象名
如果没有重写那么打印的还是地址值
Object类的equals()方法
public boolean equals(Object obj):在父类方法
指示其他某个对象是否与此对象“相等”
这个方法,默认情况下比较的是地址值.比较地址值一般来说意义不大,所以我们要重写方法
怎么重写呢?
一般都是用来比较对象的成员变量是否相同
基本类型:比较的就是值是否相同
引用类型:比较的是地址值是否相同
看源码:public
Stduent s1 = new Student("null",0);
Stduent s2 = new Student("null",0);
System.out.println(s1==s2);//false
Studnet s3 =s1;
System.out.println(s1==s3);//true
public boolean equals(Object obj):
//return ture;
//这里要改进,根据这里比较的成员变量来决定返回true还是false
//这里其实要比较的就是name和age
//但是,name是String类型的,而String是引用类型的,所以,在这里我们不能直接用==比较,应该用equlas()比较
//String的equlas()方法是重写自Object类的,比较的是字符串的内容是否相同
Student s = (Student)obj;//s--obj--s2
if(this.name.equlas(s.name)&& this.age == s.age){
return true;
}else{
return false;
}
Object类的equals()方法代码优化
equals:
引用类型:默认情况下,比较的是地址值
不够,我们可以根据情况自己重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同
obj是对象
public boolean equlas (Object obj){
Student s = (Student)obj;
if(this.name.equals(s.name) && this.age ==s.age){
return ture;
}else{
return false;
}
}
用三元改进:
public boolean equlas (Object obj){
//为了提高效率,当两个对象地址值一样时,不需要向下转型比较
if(this == obj){
return turn;
}
//为了提高程序的健壮性
//我先判断一下,obj是不是学生的一个对象,如果是,在做向下转型,如果不是,直接返回false
//这个时候,我们要判断的是对象是否是某个类的对象?
//记住一个格式:对象名instanceof类名
//表示:判断该对象名是否是一个对象
if(!(obj instanceof Studnet)){
return false;
}
Student s = (Student)obj;
return this.name.equlas(s.name) && this.age == s.age;
}
Object类的finalize()方法和clone()方法
protected void finalize():当垃圾回收期确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,用于回收
垃圾,但是什么时候回收,是不确定的。
protected Objiect clone():创建并返回此对象的一个副本
A:重写该方法
Cloneable:此类实现了Cloneable接口,以指示Object.clone()方法可以合法地对该类实例进行按字段复制
这个接口是标记接口,告诉我i们实现该接口的类就可以实现对象的复制了。
public static void main(String[] args) thow ClpneNotSupportedException{
//创建学生对象
Student s = new Student();
//克隆学生对象
Object obj = s.clone();
Student s2 = (Student)obj;;
}
在父类
public class Studnet implements Cloneable才可以克隆