作用:
java.lang:包含语言支持类(例如分类,用于定义基本数据类型,数学运算)。该软件包会自动导入。
java.io:包含分类以支持输入/输出操作。
java.util:包含实现像链接列表,字典和支持等数据结构的实用类; 用于日期/时间操作。
java.applet:包含用于创建Applets的类。
java.awt:包含用于实现图形用户界面组件的类(如按钮,菜单等)。
java.net:包含支持网络操作的类。
.java源文件中只能有一个public类,包中public的类的类名必须和文件名相同
main方法一个特殊的函数,作为程序的入口,可被JVM调用,(String[] args):main函数的参数,类型是一个数组,该数组中的元素为字符串数组,每个类中有且仅有一个主函数
Java类都有一个共同的祖先类:Object类(实体类),Object类拥有的方法:hashcode()、equals()、toString()、getClass()、wait、notify()、notifyAll()、finalize()、clone()
## Class类和Object类的关系
Object类和Class类没有直接的关系
Object类是一切java类的父类,对于普通的java类,即便不声明,也是默认继承了Object类
Class类是用于java反射机制的,一切java类,都有一个对应的Class对象,他是一个final类
Class 类的实例表示正在运行的 Java 应用程序中的类和接口
clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常
hashCode方法
该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价
成员内部类
静态内部类
局部内部类(方法内、代码块内、构造器内)
匿名内部类
public class TestDemo {
public static void main(String[] args) {
Person per = new Person() {
public void work() {// 匿名内部类自定义的方法work
System.out.println("work方法调用");
}
@Override
public void eat() {// 实现接口的的方法eat
System.out.println("eat方法调用");
}
};
per.eat();// 可调用
per.work();// 出错,不能调用,因为 Person per = new Person()创建的是Person的对象,而非匿名内部类的对象。匿名内部类连名字都没有,无法实例化调用对象,但继承父类的方法和实现的方法是可以正常调用的
}
}
interface Person {
public void eat();
}
注意:
修饰属性
将类中的属性划分为 静态属性(静态变量) 和非静态属性(实例变量)
静态变量随着类的加载而加载。可以通过 类.静态变量 的方式进行调用,早于对象的创建
由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
静态属性举例:System.out; Math.PI;
修饰方法
①随着类的加载而加载,可以通过 类.静态方法 的方式进行调用
②静态方法中,只能调用静态的方法或属性
③静态方法中,不能使用this关键字、super关键字,因为没有对象
修饰代码块
代码块的作用是:限制局部变量的作用范围,提前释放内存,一般结合if,while ,for等关键字使用
3.每创建一个对象,就执行一次非静态代码块
4.作用:创建对象时对对象的属性进行初始化
5.非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
static代码块的作用:用于给类进行初始化,在加载的时候就执行,并且只执行一次。一般用于加载驱动
## 子类调用父类构造方法:
当子类构造方法调用父类无参构造方法,一般都是默认不写的,要写的话就是super(),且要放在构造方法的第一句
当子类构造方法要调用父类有参数的构造方法,必须要用super(参数)来调用父类构造方法,且要放在构造方法的第一句
当子类的构造方法是无参构造方法时,必须调用父类无参构造方法。
局部代码块
构造代码块
静态代码块
//A类
public class A {
static {
Log.i("HIDETAG", "A静态代码块");
}
private static C c = new C("A静态成员");
private C c1 = new C("A成员");
{
Log.i("HIDETAG", "A代码块");
}
static {
Log.i("HIDETAG", "A静态代码块2");
}
public A() {
Log.i("HIDETAG", "A构造方法");
}
}
//B类
public class B extends A {
private static C c1 = new C("B静态成员");
{
Log.i("HIDETAG", "B代码块");
}
private C c = new C("B成员");
static {
Log.i("HIDETAG", "B静态代码块2");
}
static {
Log.i("HIDETAG", "B静态代码块");
}
public B() {
Log.i("HIDETAG", "B构造方法");
}
}
//C类
public class C {
public C(String str) {
Log.i("HIDETAG", str + "构造方法");
}
}
// 主函数
public static void main(String[] args) {
B a = new B();
}
//输出:
I/HIDETAG: A静态代码块
I/HIDETAG:A静态成员构造方法
I/HIDETAG:A静态代码块2
I/HIDETAG:B静态成员构造方法
I/HIDETAG:B静态代码块2
I/HIDETAG:B静态代码块
I/HIDETAG:A成员构造方法
I/HIDETAG:A代码块
I/HIDETAG:A构造方法
I/HIDETAG:B代码块
I/HIDETAG:B成员构造方法
I/HIDETAG:B构造方法
执行顺序:
父类的静态成员和代码块——>子类的静态成员和代码块——>父类成员初始化和代码块——>父类构造方法——>子类成员初始化和代码块——>子类构造方法
向上转型
向上转型就是子类的对象赋给父类的引用或(父类的引用指向子类的对象)
Person p1=new Man();
Person p1=new Woman();
向下转型
向上转型无法调用子类特有的属性和方法,为了能够调用子类特有的属性和方法,就有了向下转型。向下转型是子类对象被父类引用之后,再把父类引用强转成子类,强转时叫做向下转型。
使用强转时,可能出现ClassCastException的异常。会用到instanceof关键字
Person p1=new Man();//向上转型
if(p1 instanceof Man){
Man m2 = (Man)p1;
m2.work();
System.out.println("******Man******");
}
它在方法内部使用,即这个方法所属对象的引用;它在构造器内部使用,表示该构造器正在初始化的对象。
// 调用方法
public void getInfo(){
System.out.println("姓名:" + name) ;
this.speak();
}
// 调用属性
public boolean compare(Person p){
return this.name==p.name;
}
// 调用本类的构造器
public Person(String name){
this(); // 调用本类中的无参构造器
this(name) ; // 调用有一个参数的构造器
this.name = name ;
}
父类方法中的this也可能代表的是调用该父类方法的子类的实例对象,abstract类中的非抽象方法中的this对象只能是代表子类自己的实例对象指针
父类的final修饰方法,意味着子类无法去重写该方法,但不影响子类对象直接去调用父类的final方法,所以final方法中的this对象既可以代表子类自己的实例对象指针,又可以代表父类本身的实例对象指针