API
不同包中可以定义同名的类,同包中不能存在同名的类
同包中的类可以直接使用
但是不同包且不属于java.lang包下的类都需要通过导包才可以使用
import 包名.类名;
import 包名.*;//当前包下包含的类
如果没有导包编译报错:
Cannot resolve symbol ‘Scanner’
一旦类中指定导入了具体的类,则程序中通过简单类名来使用都是导入的类;如果不想使用导入的类,可以通过单独指定全路径名称来使用
如果不导包可以通过使用类的全路径名称来编码
java.util.Scanner sc = new java.util.Scanner(System.in);
常见的包:
java:JDK本身提供
javax:扩展
org:第三方提供的 apache
java.io : 通过数据流、序列化和文件系统提供系统输入和输出
java.lang: 默认所有类都导入了该包 提供利用 Java 编程语言进行程序设计的基础类
java.math: 数学计算相关
java.net:为实现网络应用程序提供类
java.sql:数据库操作相关
java.util:工具类所属的包
Object
类 Object
是所有类的顶级父类
默认每个java类都会继承Object,如果没有显示指定父类,则父类就为Object;如果单独指定了父类,父类继承了Object,最终多重继承了Object类;
Object类中的方法会被所有类继承到;
所有的类的对象都可以赋值给Object类型的引用–向上造型
构造方法:–创建对象
Object() – 无参构造
通过无参构造来创建对象:
Object obj = new Object();
方法:
protected Object clone() --创建并返回此对象的一个副本。
权限修饰符 返回值类型 方法名
通过调用某个对象的clone的方法可以获取到一个新的对象,属性值和当前对象一样的
注意:
1、clone方法是protected 修饰,只能在本类 同胞类以及子类中访问
2、重写clone方法,将权限修饰符给为public,方法实现通过super调用父类的clone方法
3、clone方法有异常,子类重写时需要抛出异常 调用子类方法时也需要抛出异常
Unhandled exception: java.lang.CloneNotSupportedException
4、clone的返回值Object类型,修改重写的clone方法的返回值类型
例如:
@Override public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); }
5、如果对象需要调用clone方法来拷贝 则需要该对象的类实现Cloneable接口
Cloneable接口中没有任何的属性和方法,Cloneable接口作用为标记接口
java认为clone方法克隆对象存在安全问题,默认情况下不允许克隆对象;如果在开发过程某个类的对象需要克隆,则该类必须实现Cloneable接口
Exception in thread "main" java.lang.CloneNotSupportedException: cn.tedu.object.Person
at java.lang.Object.clone(Native Method)
at cn.tedu.object.Person.clone(ObjectDemo.java:36)
at cn.tedu.object.ObjectDemo.main(ObjectDemo.java:23)
6、Object clone 浅表克隆
如果克隆的对象中有属性是引用数据类型的对象,会将属性对象的地址赋值一份给到新克隆对象的属性;
深表克隆:
如果克隆的对象中有属性是引用数据类型的对象 在克隆时要新创建一个新的属性对象,且新的属性对象的值要和之前属性对象的值一致;
案例:
class Person implements Cloneable{
String name;
int age;
public void eat(){
System.out.println("吃饭~");
}
@Override
public Person clone() throws CloneNotSupportedException {
return (Person) super.clone();
}
}
```
```java
public class ObjectDemo {
public static void main(String[] args) 抛出异常{
Person p = new Person();
p.name = "张三";
p.age = 18;
p.eat();
System.out.println(p);
//调用重写之后的clone方法 克隆p的对象
Person p3 = p.clone();
System.out.println(p3.name+","+p3.age);
p3.eat();
}
}
protected void finalize()
当垃圾回收器确定不存在对该对象的更多引用时
由对象的垃圾回收器调用此方法。
自己调用finalize方法并不能立即释放对象的空间
堆空间
Class<?> getClass()
返回此 Object 的运行时类
向上造型时,如果调用对象的getClass方法则可以获取到该对象的实际类型
获取实际类型的全路径名称:
对象.getClass().getName()–返回类的全路径名称的字符串
String toString()
返回该对象的字符串表示
实现代码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
直接通过输出语句输出对象时底层默认就调用该对象的toString方法:
System.out.println(obj);
public void println(Object x) {//x=obj
String s = String.valueOf(x);
}
public static String valueOf(Object obj) {//obj=obj
return (obj == null) ? "null" : obj.toString();
}
所有子类都会继承Object的toString方法;
toString方法如果需要输出对象的属性值,则可以在子类中重写Object的toString方法;
public String toString(){
return “name:”+name+",age:"+age;
}
int hashCode()–哈希码值
返回该对象的哈希码值。
特点:
同一个对象返回的哈希值相同
不同的对象对应的哈希码值不同
hash值相同–碰撞–概率非常小 暂时不考虑
boolean equals(Object obj)
equals()–比较引用对象的内容是否相同
默认实现比较的是地址
指示其他某个对象是否与此对象“相等”。
Object中equals方法的实现如下:
public boolean equals(Object obj) {
return (this == obj);
}
equals方法的底层实现仍然时比较地址值;
重写equals方法:
1、判断当前对象和参数对象地址值是否相同
2、判断参数对象是否为null 参数的实际类型和当前对象的实际类型是否一致
3、对象每个属性一 一判断 如果所有属性都相同则表示当前两个对象相同 返回true 否则false
==、equals方法:
==比较基本数据类型就是比较数据值
比较引用数据类型就是比较地址值
equals:
比较引用数据类型
如果没有重写equals方法 则比较的是两个对象的地址值
如果重写了equals方法 则比较的是两个对象内容
空指针异常:
当对null调用属性或者方法时,就会抛出异常
NullPointException
if(obj!=null){
//obj的属性和方法
}