包机制、访问控制权限、Object类、匿名内部类
包机制
-
为什么使用package?
package是java中包机制。包机制的作用是为了方便程序的管理。不同功能的类分别存放在不同的包下。
-
package怎么用?
package是一个关键字,后面加包名
package com.baidu.javase
package语句只允许出现在java源代码的第一行
-
包名有没有命名规范?
一般都采用公司域名倒叙的方式
公司域名倒序 + 项目名 + 模块名 + 功能名
-
import使用
-
import什么时候用?
A类中使用B类
A类和B类都在同一个包下,不需要imprt
A类和B类不在同一个包下,需要import
java.lang.*;这个包下的类不需要使用import导入
-
import怎么使用?
import语句只能出现在package语句之下,class声明语句之上,也可以采用星号的形式
import java.util.* //这个效率不低,因为编译器编译时,会自动把*转换为具体的类
-
访问控制权限
-
访问控制权限有哪些?
private(私有)、public(公开)、protected(受保护)、默认
-
4个访问控制权限的范围
- private表示私有,只能在本类中访问
- public表示公开,在任何位置可以访问
- “默认”表示只能在本类、以及同包下访问
- protected只能在本类、同包、子类中访问
- public > protected > 默认 > private
-
访问控制权限修饰符可以修饰什么?
- 属性(4个都可以使用)
- 方法(4个都可以使用)
- 类(pubic和默认可以使用、其他不行)
- 接口(pubic和默认可以使用、其他不行)
- …
Object类
任何一个类都默认继承Object
1. toString()方法
-
源代码
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }//类名@对象的内存地址转换为十六进制的形式
-
作用
通过调用这个方法可以将一个“java对象”转换成“字符串”形式,建议所有子类重写toString()方法
public class Student { private int id; private String name; public String toString(){ return "学号:" + id + ",姓名" + name; } }
2. equals()方法
-
源代码
public boolean equals(Object obj) { return (this == obj); }
-
作用
通过equals方法来判断两个对象是否相等
但是,在Object类中的equals方法当中,默认使用 ” == “ 判断两个java对象是否相等。而 ” == “判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等,所以我们还是要重写equals方法
public class Student { int id; String name; public Student(){ } public Student(int id , String name){ this.id = id; this.name= name; } public boolean equals(Object obj){ if(obj==null || !(obj instanceof Student)) return false; if(this==obj) //地址相同 指向的内容一定相同 return true; Student s=(Student)obj; if(id==s.id&&name.equals(s.name)) return true; return false; } }
匿名内部类
-
什么是内部类?
在类的内部又定义一个新类,称为匿名内部类
-
内部类的分类
- 静态内部类:类似于静态变量
- 实例内部类:类似于实例变量
- 局部内部类:类似于局部变量(匿名内部类属于局部内部类中的一种)
class Test{ static class Inner1{ //静态内部类 } class Inner2{ //实例内部类 } public void doSome(){ class Inner3{ //局部内部类 } } }
-
匿名内部类实例
public class Demo{ public static void main(String[] args) { Math m = new Math(); m.mySum(new Menu() { //匿名内部类 表示这个类没有名字 @Override //表面上看上去是接口new了,实际不是,后面的{}代表了对接口的实现 public int sum(int a, int b) { return a+b; } },20,30); } } public interface Menu { int sum(int a,int b); } class Math{ public void mySum(Menu m,int x,int y){ int result=m.sum(x,y); System.out.println(x + "+" + y + "=" + result); } }
以上方法等价于:
public class Demo{ public static void main(String[] args) { Math m = new Math(); m.mySum(new MenuImpl(),20,30); } } class Math{ public void mySum(Menu m,int x,int y){ int result=m.sum(x,y); System.out.println(x + "+" + y + "=" + result); } } public interface Menu { int sum(int a,int b); } public class MenuImpl implements Menu { @Override public int sum(int a, int b) { return a+b; } }
总结:为什么不建议使用匿名内部类?
因为一个类没有名字,没有办法重复使用,代码太乱,可读性差