java学习之内部类、包与代码块
一 内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。
1 成员内部类
成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
定义的格式:
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问方式:外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
2 局部内部类
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
定义格式:
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
访问方式:在外部类方法中,创建内部类对象,进行访问。
3 匿名内部类
最常用到的内部类就是匿名内部类,它是局部内部类的一种。
定义的匿名内部类有两个含义:
1 临时定义某一指定类型的子类
2 定义后即刻创建刚刚定义的这个子类的对象
下面是例子来帮助理解:
package com.oracle.Demo01; public interface Smoking { public abstract void smoke(); }
public class Test { public static void main(String[] args) { //匿名内部类对象 //new 接口或者抽象类{ //重写父类的抽象方法 //} new Smoking(){ public void smoke(){ System.out.println("抽烟"); } }.smoke(); } }
当接口中有多个构造方法的时候,必须重写所有的接口方法,否则会报错。
二 包的声明与访问
1 包的概念
java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件。
当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理。
在项目中,我们将相同功能的类放到一个包中,方便管理。并且日常项目的分工也是以包作为边界。
类中声明的包必须与实际class文件所在的文件夹情况相一致,即类声明在a包下,则生成的.class文件必须在a文件夹下,否则,程序运行时会找不到类。
2 包的声明格式
通常使用公司网址反写,可以有多层包,包名采用全部小写字母,多层包之间用”.”连接
如:Oracle网址oracle.com那么网址反写就为com.oracle
注意:声明包的语句,必须写在程序有效代码的第一行(注释不算)
3 包的访问
在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)。
如: java.util.Scanner
java.util.Random
com.oracle.Demo
4 导包
我们每次使用类时,都需要写很长的包名。很麻烦,我们可以通过import导包的方式来简化。
导包的格式:
import 包名.类名;
三 访问修饰符
在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:
|
public |
protected |
Default(默认) |
private |
同一类中 |
√ |
√ |
√ |
√ |
同一包中(子类与无关类) |
√ |
√ |
√ |
|
不同包的子类 |
√ |
√ |
|
|
不同包中的无关类 |
√ |
|
|
|
这是两个不同包下的四个类
这是A类
这是B类
这是C类
这是D类
五 代码块
1局部代码块
class Demo{ public static void main(String[] args) { { int x = 1; System.out.println("普通代码块" + x); } int x = 99; System.out.println("代码块之外" + x); } }
结果:
普通代码块1
代码块之外99
2 构造代码块
构造代码块是定义在类中成员位置的代码块
l 优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作
l 每创建一个对象均会执行一次构造代码块。
package com.oracle.Demo04; public class Person { public Person(){ System.out.println("这是构造方法"); } { System.out.println("这是构造代码块"); } }
package com.oracle.Demo04; public class Test { public static void main(String[] args) { Person p=new Person(); } }
运行结果为:
当再创建一个对象p2时
运行结果为:
3 静态代码块
静态代码块是定义在成员位置,使用static修饰的代码块。
l 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
l 该类不管创建多少对象,静态代码块只执行一次。
package com.oracle.Demo04; public class Person { public Person(){ System.out.println("这是构造方法"); } { System.out.println("这是构造代码块"); } static{ System.out.println("这是静态代码块"); } }
当创建两个对象时
运行结果为: