2.9 Object类,包相关

1.equals(),hashCode(),toStrng():

/*
Object:所有类的根类

Object是不断抽取而来的,具备着所有对象都具备的共性内容。

部分共性方法:
1.equals(),判断对象的地址知否相等(==),没有意义。一般进行重写。
2.getClass(),获取该对象所属类的字节码对象,而字节码对象是Class类的对象。所有的类在加载时都是以Class类的对象形式加载的。
3.toString();   (默认添加)以文本的方式返回。建议所有子类都重写该方法。

*/
class Person
{
    private int age;
    Person(int age)
    {
        this.age = age;
    }



    //比较Person的年龄,是否是同龄人

    //一般都会覆盖equals方法,根据对象的特有内容,建立判断对象是否相同的依据。 因为光比较地址没有意义。

    public boolean equals(Object obj)   //向上转型,子类方法被隐藏
    {       
            if(!(obj instanceof Person))
            {
                //return false;
                throw new ClassCastException("类型错误");
            }
            Person p = (Person)obj;        //向下转型,注意转换异常
            return this.age == p.age;
    }

//注意:当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定.
//该协定声明相等对象必须具有相等的哈希码。 这才是真正的对象相等。内容相同,哈希码也相同。
        public int hashCode()
    {
            return age;
        }

        public String toString()
    {
            return "Person: " + age;
        }


}

class Demo
{
}

class  ObjectDemo
{
    public static void main(String[] args) 
    {
        Person p1 = new Person(20);
        Person p2 = new Person(20);
        Demo d = new Demo();



        System.out.println(p1 == p2);            
        System.out.println(p1.equals(p2));   //指向同一个对象时,才返回true,和==功能一样,比较地址。源代码其实用的就是==。

        System.out.println(p1);     //对象类型和哈希码(16进制表示)
    /*等效于:*/System.out.println(p1.getClass().getName() + "@" + Integer.toHexString(p1.hashCode()));

        System.out.println(Integer.toHexString(p1.hashCode()));   //对象的哈希码(10进制整数表示)
        System.out.println(p1.hashCode());   //重写了hashCode()方法。



        Class clazz1 = p1.getClass();
        Class clazz2 = p2.getClass();
        System.out.println(clazz1==clazz2);  //true
        System.out.println(clazz1.getName());  //获取Class类的名称。


    }
}

2.包:
①对类文件进行分类管理
②给类提供多层命名空间(类文件会有所属包)
③写在程序文件的第一行(package 包名)
包名全部小写。
命令自动建包:javac -d . PackageDemo.java
④类名的全称是 包名.类名
⑤包也是一种封装形式

package mypack.haha;

class PackageDemo  
{
    public static void main(String[] args) 
    {
        System.out.println("Hello World!");
    }
}

3.包与包之间的访问:
1.注意:

①使用其他包的类时:
1)要么导入包:
import.packa.DemoA;
import.packa.*;(导入packa包中所有的类,但不包含子包。开发不建议写*) 
import导包的作用 就是为了简化类名书写。
导包原则:用到哪个类,就导入哪个类。

2)要么写 包名.类名

②只能访问公共的包,即类必须设置为public,如果类不设置public,则是被包封装了。如果类中的方法不设置public,则也被包封装了。
③如果其他包不在classpath指定的目录下时,需要设置classpath的路径。

总结:包与包之间的访问,被访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。
不同公共包的类可以继承,当父类的方法被设置为protected时,只有该类或其子类才可以访问。

2.
4种权限:
public protected default private
同一类中 ok ok ok ok
同一包中 ok ok ok
子类中 ok ok
不同包中 ok

3.Jar包:
当把classpath设置为某个jar的路径时,可以不用解压直接运行里面的文件。

package pack;
/*
Jar : java的压缩包。
常用命令:
jar -cvf haha.jar pack   将包归档到指定名称的java压缩包 ,并生成详细输出v
jar -xvf haha.jar            将指定压缩包解压缩到当前目录,并生成详细输出v
jar -tvf haha.jar              列出指定jar的归档目录

*/

class JarDemo  
{
    public static void main(String[] args) 
    {
        System.out.println("Hello Jar!");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值