包
java中的包就相当于我们电脑系统中的文件夹,包里存放的是类文件,包名通常是全部小写字母,多层包之间用“.”连接。
- 包的特点:
包可以有多层结构
不同包下的文件名可以相同
包的声明必须写在程序有效代码的第一行 - 不同包之间的相互访问:
可以使用类的全名(包名.类名)
可以使用关键字import将类导入
*表示的是通配符,代表导入的这个包下所有的类,并没有导入子包下的类。
权限修饰符
public | protected | default | private | |
同一个类中 | Y | Y | Y | Y |
同一个包中(子类与无关类) | Y | Y | Y | |
不同包的子类 | Y | Y | ||
不同包中的无关类 | Y |
1、private修饰仅能在本类中访问,
2、在本包中的类都可以访问除了private修饰都可以,
3、想在本包中的类和其他包的子类都可以访问,可以使用protected的修饰,
4、所有的包中所有的类都可以访问使用public修饰。
如果类用public修饰,则类名必须与文件名相同,一个文件中只能有一个public修饰的类。
修饰符 | 类 | 成员变量 | 成员方法 | 构造方法 |
public | Y | Y | Y | Y |
default | Y | Y | Y | Y |
protected | Y | Y | Y | |
private | Y | Y | Y | |
abstract | Y | Y | ||
static | Y | Y | ||
final | Y | Y | Y |
static修饰的成员可以直接被类名调用。
final修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量。
private修饰的类不能被别的类使用。
protected用来修饰成员的,为子类提供。
内部类
内部类就是将类写在其他类的内部,在编译时也会有自己的class文件。
- 成员内部类:
定义在外部类中的成员位置,与类中成员变量相似。
成员内部类可以使用的修饰符有:public、private、protected、final、static、abstract,但是使用private,无法在其他类中访问,使用static修饰不用再创建外部类的对象了(Outer.Inter.speak()?,
public class InterDemo {
public static void main(String[] args) {
//第一种访问方式
Outer.Inter i2 =new Outer().new Inter();
i2.speak();
//Outer.Inter.speak()
//第二种访问方式
Outer o =new Outer();
o.method();
}
}
class Outer{
private int a=10;
public void method(){
Inter i = new Inter();
i.speak();
}
//内部类
// static class Inter{
// public static void speak(){
class Inter{
public void speak(){
System.out.println("a="+a);//在内部类中,可以直接访问外部类饿成员,包括私有成员
}
}
}
输出结果:
a=10
a=10
- 局部内部类:
定义在外部类方法中的,和局部变量相似,出了方法就不能使用
public class InterDemo {
public static void main(String[] args) {
Outer o =new Outer();
o.method();
}
}
class Outer{
private int a=10;
public void method(){
// Inter i = new Inter();在内部类声明之后才能创建对象
class Inter{
public void speak(){
System.out.println("a="+a);
}
}
Inter i = new Inter();
i.speak();
}
}
- 匿名内部类:
是用来创建某个类型子类对象的快捷方式。定义在方法中,必须在定义匿名内部类的时候创建他的对象。
它是创建了继承这个类的子类对象或是创建了实现这个接口的子类对象。
public class InterDemo {
public static void main(String[] args) {
Outer o =new Outer();
o.method();
}
}
interface Inter{
public void function();
}
class Outer{
public void method(){
Inter i =new Inter(){
//如果创建了继承这个类的子类对象,可以重写父类的方法,
//如果是创建了实现了这个接口的子类对象,必须要实现该接口的所有方法。
@Override
public void function() {
System.out.println("function");
}
};
i.function();
}
}