初始化、包、访问修饰符

来源:互联网 发布:小米笔记本 pro linux 编辑:程序博客网 时间:2024/05/17 03:51

静态初始化

在使用一个类前,虚拟机需要从外部加载这个类文件,加载完毕后,有一部分代码会自动执行
class T{
static{
//静态初始化代码块,在类加载后执行
}
}

public class T {    static{        System.out.println("加载静态代码块");    }    public static void main(String[] args){        System.out.println("加载代码块");    }}运行结果:加载静态代码块加载代码块

我们可以在静态代码块中初始化类的静态属性
(因为每个工程一般只会连接到一个数据库,数据库地址跟对象无关,所以这里定义为static类型)
class T{
static int dbURL; //连接数据库的地址
static{
dbURL = … ;
//从文件中读取数据库地址,这样可以在外部改变dbURL,而不用重新编译java代码;
}
}

如果A类依赖于B类,则先加载B类

package test;public class T {    static{        System.out.println("加载父类静态代码块");    }}
public class Sub extends T{    static{System.out.println("加载子类代码块"); }    public static void main(String[] args){        new T();    }}

运行结果:
加载父类静态代码块
加载子类代码块

在程序的一次运行过程中,类只会被加载一次,所以一个类的静态代码块也不会执行两次
class T{
static{System.out.println(“执行静态代码块”); }
}
new T();
new T();
运行结果:
执行静态代码块

静态初始化

class T{
static{System.out.println(1); }
T(){
System.out.println(2); }
}
}
new T();
//使用T类需要先加载T类,加载后会立刻执行static代码块,创建对象时才会执行构造方法

非静态初始化
在创建对象时除构造方法被执行外还有一段代码会自动执行
class T{
{
//非静态代码块,在执行构造方法内的代码前执行
}
}
new T();

package test;public class T {    static{        System.out.println("加载父类静态代码块");    }    {        System.out.println("执行父类非静态代码块");    }    public T(){        System.out.println("执行父类构造方法");    }}
package test;public class Sub extends T{    static{        System.out.println("加载子类代码块");    }    {        System.out.println("执行子类非静态代码块");    }    public static void main(String[] args){        new Sub();    }    public Sub(){        System.out.println("执行子类构造方法");    }}

执行结果:
加载父类静态代码块
加载子类代码块
执行父类非静态代码块
执行父类构造方法
执行子类非静态代码块
执行子类构造方法

对象初始化

package test;public class T {    //public T(){}    public T(int a){        System.out.println("执行父类构造方法");    }}
package test;public class Sub extends T{    public static void main(String[] args){        new Sub();    }    public Sub(){        System.out.println("执行子类构造方法");    }}

以上代码父类中加上无参构造方法,程序没错,一旦去掉,就会报错。原因是子类TT继承父类T,由于new Sub()创建了一个子类对象,而这个子类对象是通过调用子类中的构造方法来创建的,又因为凡是子类的构造方法(无论有参还是无参),第一行都会是super(参数)或者super()来调用父类相应的构造方法,又因为父类中如果没有构造方法,会默认调用无参构造方法,如果有有参的构造方法则会将默认的无参构造方法覆盖掉,因此我们常常会在父类中把无参和有参都写上。

对象的初始化顺序:
从顶级父类开始加载,每个类加载后执行其static代码块

从顶级父类的构造方法开始执行,如果某个类有非静态初始化代码块,先执行这个代码块再执行构造方法内的语句。


包是类库的组成单元, Java的类库是由各种各样功能包组成的.
Java安装目录jre\lib\rt.jar就是java的类库

类和接口是包的组成元素, 编程人员可以把一组类和接口通过package关键字封装在一个包中,从而实现了Java的命名空间。

声明包
在源文件的开始加上:package 包名(要求全部小写)(反域名制)
package cn.com.sun;

使用包中的类
如使用不同包的类,必须加入import关键字
引用的包必须在classpath环境变量中,如果不在,运行时要用-classpath参数单独指定。

打包及编译-示例

//在net下新建ezhi包,再在ezhi下新建comm包package net.ezhi.comm;public class User {    private String name;    private String password;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }     public User(){}}
//在net下新建ezhi包,再在ezhi下新建test包package net.ezhi.test;import net.ezhi.comm.*;//导入User包public class Admin extends User{}

访问修饰符

修饰类
public 可以跨包使用
缺省 只允许在包中使用
修饰成员(属性、方法、内部类(后面讲解))
public
protected
缺省(默认)
private

这里写图片描述

这里写图片描述

原创粉丝点击