一、包
Java中的包等同于C#中的命名空间,它是类的上一级结构。
- 定义包:package 包名;
- 导入包
包导入语句 | 导入效果 |
import 包名.* | 导入包中所有文件 |
import 包名.类名 | 导入包中的指定类 |
PS. 还可以在程序中直接通过包名.类名进行调用。
注意:
- 建议采用“import 包名.类名”的方式加载,提高效率;
- 加载类的顺序与import导入的顺序无关;
- “import 包名.* ”只能访问包名下的类,无法访问子包下的类。
二、访问权限
同一个类 | 同一个包 | 不同包的子类 | 不同包的非子类 | |
private | ✓ | |||
默认 | ✓ | ✓ | ||
protected | ✓ | ✓ | ✓ | |
public | ✓ | ✓ | ✓ | ✓ |
package com.h.test;
public class Test {
private int varPrivate = 0;
int varDefault = 1;
protected int varProtected = 2;
public int varPublic = 3;
public void myTest() {
// 同类
System.out.println(this.varPrivate);
System.out.println(this.varDefault);
System.out.println(this.varProtected);
System.out.println(this.varPublic);
}
}
package com.h.test;
public class Test2 {
public void myTest() {
// 同包非子类
Test test = new Test();
System.out.println(test.varPrivate); // 编译报错
System.out.println(test.varDefault);
System.out.println(test.varProtected);
System.out.println(test.varPublic);
}
}
package com.h.test;
public class Test3 extends Test{
public void myTest() {
// 同包子类
Test test = new Test();
System.out.println(test.varPrivate); // 编译报错
System.out.println(test.varDefault);
System.out.println(test.varProtected);
System.out.println(test.varPublic);
System.out.println(this.varPrivate); // 编译报错
System.out.println(this.varDefault);
System.out.println(this.varProtected);
System.out.println(this.varPublic);
}
}
package com.h.test2;
import com.h.test.Test;
public class Test4 {
public void myTest() {
// 不同包非子类
Test test = new Test();
System.out.println(test.varPrivate); // 编译报错
System.out.println(test.varDefault); // 编译报错
System.out.println(test.varProtected); // 编译报错
System.out.println(test.varPublic);
}
}
package com.h.test2;
import com.h.test.Test;
public class Test5 extends Test {
public void myTest() {
// 不同包子类
Test test = new Test();
System.out.println(test.varPrivate); // 编译报错
System.out.println(test.varDefault); // 编译报错
System.out.println(test.varProtected); // 编译报错
System.out.println(test.varPublic);
System.out.println(this.varPrivate); // 编译报错
System.out.println(this.varDefault); // 编译报错
System.out.println(this.varProtected);
System.out.println(this.varPublic);
}
}
综上所述:
- private只允许在同类中进行访问;
- default允许同类、同包中访问;
- protect允许在同类、同包、不同包子类中访问;
- public允许在同类、同包、不同包中进行访问。
三、关键字
- static(静态)
- static不能修饰类、方法里的局部变量;
- 静态方法不能直接访问同一个类中的非静态成员,只能直接调用同一个类中的静态成员,但可通过实例化进行访问非静态成员;
- 静态方法中不能使用this;
- 静态方法不允许在子类中重写。
- final
- final不能修饰构造方法;
- 使用final修饰的类,没有子类,不能被继承;
- 使用final修饰的方法,不能被子类重写,可以正常被子类继承使用;
- 使用final修饰的变量,只要在使用前赋值即可,一旦赋值不能改变,即常量。
- 定义初始化
- 构造代码块中赋值
- 构造方法中赋值
- this和super
this | super |
访问当前类的成员方法 | 访问父类的成员方法 |
访问当前类的成员属性 | 访问父类的成员属性 |
访问当前类的构造方法 | 访问父类的构造方法 |
不能在静态方法中使用 | 不能在静态方法中使用 |
四、 定义
- 类:抽象的概念,是一个模板。
- 对象:类的实例化,是一个具体实体。
- 属性:对象具有的各项静态特征,代表着“有什么”。
- 方法:对象具有的各项动态行为,代表着“做什么”。
五、类与对象
- 类的创建:修饰符 class 类名{}
public class Test{
}
- 对象的声明与实例化:
类名 对象名 => 在栈空间中创建空对象
new 类名() => 在堆空间中开辟了一个新的实例空间
Test test = new Test();
六、属性与方法
属性与方法的定义等同于变量与方法的定义。
public class Test{
public int varTest;
public void myTest(){
}
}
七、构造方法
和普通方法不同,构造方法只能在类被实例化的时候进行调用。因此,构造方法常被用于初始化类。
构造方法根据是否带有参数分为无参构造方法和带参构造方法。
构造方法的结构为:
public class TestSample {
String name;
// 无参构造方法
public TestSample() {
}
// 带参构造方法
public TestSample(String name) {
this.name = name;
}
}
定义构造方法时需注意:
- 构造方法与类同名且没有返回值
- 当类中没有指定构造方法时,系统会自动添加无参的构造方法
- 当有指定构造方法时,无论是带参、无参的构造方法,都不会自动添加无参的构造方法
- 一个类中可以有多个构造方法
- 构造方法之间可以通过 this() 或 this(参数) 进行调用,但只能放在第一条语句处
- 在构造方法中可以调用类的成员属性和成员方法
- 子类构造方法默认调用父类的无参构造方法,子类可以通过super() / super(参数)调用父类允许被访问的构造方法,但必只能放在第一条语句处
八、代码块
- 普通代码块:定义于方法中的{}。
执行顺序:顺序执行,先出现,先执行。
public void myTest() {
{
System.out.println("普通代码块1");
}
System.out.println("普通方法");
{
System.out.println("普通代码块2");
}
}
- 构造代码块:定义于类中,没有加static关键字的代码块{}。
执行顺序:创建对象(实例化)时调用,优先于构造方法执行。(每次创建对象都会被调用)
{
System.out.println("构造代码块");
}
- 静态代码块:定义于类中,加以关键字static进行修饰的代码块。
执行顺序:类加载时调用,优先于构造代码块执行。(每个静态代码块只执行一次)
static{
System.out.println("静态代码块");
}
因此,整合上述代码,可得执行效果如下:
package com.h.test3;
public class TestSample {
static{
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public TestSample() {
System.out.println("构造方法");
}
public void myTest() {
{
System.out.println("普通代码块1");
}
System.out.println("普通方法");
{
System.out.println("普通代码块2");
}
}
}
package com.h.test3;
public class TestMain {
public static void main(String[] args) {
TestSample testSample = new TestSample();
testSample.myTest();
}
}
/* 执行结果如下:
静态代码块
构造代码块
构造方法
普通代码块1
普通方法
普通代码块2
*/