内部类
将一个类定义在另一个类里面。
内部类的访问特点:
1、内部类可以直接访问外部类中的成员。
2、外部类要访问内部类,必须建立内部类的对象。
内部类能直接访问外部类中成员的原因:内部类持有了外部类的引用。外部类名.this
用途:
一般用于类的设计
分析事物时,发现该事物描述中还有事物,而且这个还有事物还在访问被描述事物的内容。这时就把还有事物定义成内部类来描述。
直接访问外部类中的内部类中的成员:
Outer.Inner in = new Outer().new Inner();in.show(); 但通常内部类会封装起来private
如果内部类是静态的,则相当于是一个外部类。
Outer.Inner in = new Outer.Inner(); in.show();
如果内部类是静态的,内部类里的成员也是静态的。
Outer.Inner.show();
如果内部类中定义了静态成员,该内部类也必须是静态的。
局部内部类:
内部类可以存放在局部位置上。也就是放在一个方法内部。
内部类在局部位置上只能访问局部中被final修饰的局部变量。
匿名内部类:
就是内部类的简写格式。
必须要前提:内部类必须继承或实现一个外部类或者接口。
abstract class Demo
{
abstract void show();
}
class Outer
{
int num=4;
/*
class Inner extends Demo
{
void show()
{
System.out.println("show....."+num);
}
}
*/
public void method()
{
//new Inner().show();
//Inner in=new Demo()
new Demo() //new Demo的子类对象,匿名内部类
{
void show()
{
System.out.println("show....."+num);
}
}.show();
//in.show();
}
}
可以看出,匿名内部类,就是一个匿名子类对象。
格式: new 父类或接口(){ 子类内容 }
使用场景:
1、当函数参数是接口类型时,而且接口中的方法不超过三个,可以用匿名内部类作为实际参数进行传递。
class Outer
{
public void method()
{
Object obj = new Object()
{
public void show()
{
System.out.println("show run");
}
}; //因为匿名内部类这个子类对象被向上转型为了Object类型,就不能再使用子类特有方法
obj.show();
}
}
要改为以下形式:
class Outer
{
public void method()
{
new Object()
{
public void show()
{
System.out.println("show run");
}
}.show();
}
}
对象的初始化过程:
1、成员变量初始化
2、父类的构造代码块初始化
3、父类的构造函数,如果有成员方法被覆盖,调用子类的方法。
4、显示初始化。(给那些变量赋值)
5、子类的构造代码块初始。
6、子类构造函数。
Object类
Object是所有类的根类。
Object是不断抽取而来,具备着所有对象都具备的共性内容。
Object的equals方法一般都会被覆盖,根据对象的特有内容,建立判断对象是否相同的依据。
重写equals方法时一般也要重写hashCode方法。
包
包
对类文件进行父类管理。
给类提供多层命名(名称)空间。
写在程序的第一行。
类名的全称是 包名.类名。
包名的所有字母都是小写。
包与包之间的类进行访问,该访问的包中的类必须是public的,被访问的包中的类的方法也必须是public的。
public | protected | default | private | |
同一类中 | ok | ok | ok | ok |
同一包中 | ok | ok | ok | |
子类中 | ok | ok | ||
不同包中 | ok |
import是为了简化类名的书写。