JAVA权限修饰符
包(package):java的包,其实就是我们电脑系统中的文件夹.包里存放的是类文件.
当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理.
在项目中,我们将相同功能的类放到一个包中,方便管理.并且日常项目的分工也是以包作为边界的.
包的特点:
可以有多层
不同包下的文件名可以重复
包的声明必须是第一行代码
不同包之间的互相访问:
在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)
前提:包的访问与访问权限密切相关,这里以一般情况来说,即类用public修饰的情况。
简化:当我们要使用一个类时,这个类与当前程序在同一个包中(即同一个文件夹中),或者这个类是java.lang包中的类时通常可以省略掉包名,直接使用该类.
不同包之间的相互访问
使用类的全名
使用关键字import将类导入
Note:*代表的是通配符,代表导入了这个包下所有的类,并没有导入子包下的类
类的全路径名称(类的全名):包名.类名
权限修饰符
在java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限.访问能力
| public | protected | default | private |
同一类中 | √ | √ | √ | √ |
不同包中(子类与无关类) | √ | √ | √ |
|
不同包的子类 | √ | √ |
|
|
不同包中的无关类 | √ |
|
|
|
Sum:在日常开发过程中,编写的类.方法.成员变量的访问
想要仅能在本类中访问使用private修饰
想在本包中的类都可以访问除了private修饰符,其他都可以.
向本包中的类与其他包中的子类可以访问使用protected修饰
向所有包中的所有类都可以访问使用public修饰.
Note:如果类用public修饰,则类名必须与文件名相同.一个文件中只能有一个public修饰的类,其他的可以用default等
总结:权限修饰符:
Public 当前类,相同包下不同的类,不同包下的类
Default当前类,相同包下不同的类
Private当前类
Protected:当前类,相同包下不同的类.
Default:当前包下使用
Protected:让子类对象使用,
内部类
内部类:将类写在其他类的内部.可以写在其他类的成员位置和局部位置,这时写在其他 类内部的类就称为内部类.其他类也称为外部类. 内部类主要分为成员内部类 和局部内部类
场景: 在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含着发动机.这时发动机就可以使用内部类来描述.
Class 汽车{ //外部类
Class 发动机{ //内部类
}
}
成员内部类:
定义在外部类中的成员位置.与类中的成员变量相似,可通过外部类对象进行访问.
格式:
Class 外部类{
修饰符 class 内部类{
//代码
}
}
访问方式:外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
成员内部类:
在类的成员位置,和成员变量以及成员方法所在的位置是一样的.
在内部类当中,可以直接访问外部类的成员.包括私有成员.
成员内部类可以使用的修饰符:private,public,protected,final.static,abstract.
我们可以使用权限修饰符修饰成员内部类,但是如果使用私有来修饰,则无法在其他类中访问.
我们可以使用static修饰成员内部类,不用再创建外部类的对象
局部内部类:
定义在外部类方法中的局部位置.与访问方法中的局部变量相似,可通过调用方法进行访问.
格式:
Class 外部类{
修饰符 返回值类型 方法名(参数){
Class 内部类{
//其他代码
}
}
}
访问方式
在内部类方法中,创建内部类对象.进行访问.
匿名内部类:
作用:匿名内部类是创建某个类型子类对象的快捷方式.
格式:
New 父类或接口(){
//进行方法重写
}
Demo:
//已经存在的父类
Public abstract class Person{
Public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量.
Person p=new Person(){
Public void eat(){
System.out.println(“我吃好了”);
}
};
//调用eat方法
p.eat();
使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成.虽然是两个步骤,但是两个步骤是连在一起完成的.
匿名内部类如果不定义变量引用,则也是匿名对象.代码:
New person(){
Public void eat(){
System.out.println(“我吃好了”);
}
}.eat();
总结:
匿名内部类:
可以把匿名内部类看成是一个没有名字的局部内部类.
定义在方法当中
必须在定义匿名内部类的时候创建他的对象.
格式:
New 类/接口(){
如果是创建了继承这个类的子类对象,我们可以重写父类的方法
如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法.
};
原理:而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象.
匿名内部类作为参数传递:
Demo:
public class demo{
public static void main(String[] args){
method(new Animal(){
@Override
public void eat(){
System.out.println(“猫吃鱼”);
}
}
);
}
public static void method(Animal a){
a.eat();
}
}