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("这是静态代码块");
    }
}

当创建两个对象时

运行结果为:

 

posted @ 2018-12-04 11:51  张宗强1  阅读(142)  评论(0编辑  收藏  举报