面向对象
日后我们写的class类成千上万,为了我们的Java文件不重叠,就有了包的概念。包的出现就算我们有俩个Java文件也不用怕了。所谓包,呵呵、你别想的是多么牛逼,其实就是个文件夹。只是我们将文件夹用一个关键字(package)定义在Java类中的顶端,Java有一个命令就会帮我们生成文件夹。我们只要找文件夹,就可以找到我们的Java类了。
Java是面向对象的语言嘛!这也是面向对象的思想,我们不需要去找我们的类,我们只要找到包,就可以找到我们想要找的类了。呵呵!
包(package)
1、对类文件进行分类管理。
2、给类提供多层命名空间。
3、写在程序的第一行。
4、类名的全称是 包名.类名。
5、包也是一种封装形式。
6、Javac -d . 类名.Java。
//Javac -d 目录(包要生成在的目录) 文件名
7、包的定义是用一个关键字package包名(Java中定义包是的规则是字母都是小写)
代码示例:
package pack;
class Demo{
public static void main(String[] args){
System.out.println("package");
}
}
import关键字:
当我们用到某个包中的类的时候,就用一个关键字import把包的所有的类给导进行。
我们不用每次都写包名了,方便了操作,简化了书写。
注意:
1、为了简化类名的书写,使用一个关键字import。
1)import pack.A.Test;--------//导入包中的某一个类——不包含子包
2)import pack.A.*;------------//导入子包(A)所有类——不包含根目录包的类
3)import pack.*;--------------//导入根目录包的所有类——不包含根(目录)包中的子包的类
友情提示:建议不要写通配符,(*)需要用到包中的那个类,就导入包中的哪个类。
2、当导入不同包中有同名类时,必须指定包名,才知道是哪个包中的类嘛。
3、为了不至于包名重复,可以使用 url 来完成定义url 是唯一的。
(url 是什么?就是域名嘛!别跟我说不懂,看你访问我博客的地址栏,你懂的。)
例子:(包名注意是全部小写哦)
1)package com.itheima.demo
2)package com.itheima.test
Jar包 Java的压缩包(Java为了我们的包过多而哪找,就搞了个压缩包)
1、方便项目的携带。
2、方便于使用,只要在 classpath 设置Jar 路径即可。
3、数据库驱动,ssh 框架等都是以Jar包体现的。
包与包之间访问
1、需要设置classpath告诉Jvm去哪里找指定的package包。
2、有了包,范围变大,一个包中的类要被访问,必须要有足够大的权限,所以被访问的类被public修饰。
3、类共有后,被访问的成员也要共有才可以被访问。
4、包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。
5、不同包中的子类还可以直接访问父类中被protected(被保护的)权限修饰的成员
6、包与包之间可以使用的权限只有两种,public protected
7、
总结:
包与包之间进行访问,被访问的包中的类以及类中的成员,需要public修饰。
不同包中的子类还可以直接访问父类中被protected权限修饰的成员。
包与包之间可以使用的权限只有两种,public protected。
Object类
Object:所有类的超类。
Object:是不断抽取而来,具备着所有对象都具备的共性内容。
常用的共性内容:
equals方法:指示其它某个对象是否与此对象"相等"。
equals和==的区别:
经常被简单的理解为equals方法用来比较两个对象中的数据是否相同,而==号比较运算符用来比较两个基本数据类型的数值是否相同或者二个对象的内存地址值是否相同。这样的理解无可厚非,但还要透过简单看看本质,才会更清晰。
那equals方法还有什么用呢?
虽然每个对象都有自己的内存地址,但是每个对象也有自己的一些特有的特征。
比如学生对象有自己的姓名和年龄,希望根据姓名和年龄的相同来判断学生对象的数据内容是否相同。
这时使用Object类的equals就不能满足需求了,就需要通过覆盖equals的方式,建立学生对象比较相同的具体内容。
代码示例:
public boolean equals(Object obj){
if(this.姓名.equals(obj.姓名) &&this.年龄==obj.年龄)
return true;
return false;
}
Student s1 =newStudent("程序员",20);
Student s2 =new Student("程序员",20);
System.out.println(s1==s2);
/*结果是false,比较两个对象的地址值,因为都是new出现的实体,所以内存地址值也就不同。*/
System.out.println(s1.equals(s2));//结果是true,比较的是对象的数据中的具体内容。
所以,在用Java的类描述对象的时候,如果要判断该对象是否相同时,通常都会覆盖equals方法,建立根据该对象特征进行比较相同的依据。这也就是大家常听到的"equals是用来比较对象内容"的原因。Java中很多对象都覆盖了equals方法,建立该对象特有的比较相同的方式。
比如String,Integer,Boolean等。
hashCode方法:返回该对象的哈希码值。
根据对象的不同,可以覆盖父类的hashCode方法。
如Person类
public int hashCode(){
return age;
}
内存地址值返回的是人对象的年龄。
getClass方法:返回对象的运行时类。简单的说就是获取当前对象所属的字节码文件对象。
toString方法:返回该对象的字符串表示。
Java默认的toString方法:
public String toString(){
return getClass().getName() +"@" +Integer.toHexString(hashCode());
}
保留该功能,建立自己特有内容,覆盖该方法。
覆盖Person类中的toString方法:
public String toString(){
return"Person :"+age;
}