【Core Java】02 Java 面向对象基础

7 篇文章 0 订阅

封装

类的定义

class Type{
    public String _var; // 成员属性
    public Type(...){ // 构造方法
        // ...
    }
    public void method)(...){ // 成员方法
        // ...
    }
}

成员变量初始化:

class Type {
    private int field = 10;
}

或者可以使用某个方法的返回值:

class Type {
    private int field = addObj();
    // ...
    private static int addObj() {
        // ...
        
    }
    // ...
}

如果不进行显式的初始化,成员变量将被赋予默认值:0 false null,这是成员变量与局部变量的主要不同点,局部变量不会被赋予默认值,必须显式初始化才可以使用。

类的访问权限

在 Java 中,public、private、protected 这些访问权限必须直接修饰方法,而不是 C++ 分类式地声明。

class Type{
    public int field;
    public void method(){
        //...
	}
}

Java 中有四种权限修饰方式:

修饰符访问范围
public均可访问
protected包内和所有子类可访问
(缺省)包内可访问
private仅本类访问

构造方法

重载

构造方法的重载机制与 C++ 基本完全相同,不赘述。

委托构造

使用this关键字可以在构造方法中调用其他构造方法。

class Type {
    // ...
    Type() {
        this(/* params */);
    }
    // ...
}

在 C++ 中,委托构造必须写在初始化列表中。

静态域/类域

C++ 中有静态方法和静态变量,可以通过类名直接访问。

在大多数面向对象的编程语言中,这个概念都被成为类域,Java 使用static修饰只是沿用了 C++ 的叫法。

public static void main();
private static int field;

(静态)初始化块

初始化块

构造对象时,初始化块内的代码将被首先调用:

可以用来构造对象,但一般不这么做(除非要进行构造代码的复用),而且要避免读取后面初始化的成员变量。

class Type {
    {
 		// ...       
    }
}
静态初始化块

首次加载该类时(不论以何种方法),会直接调用静态初始化块。

类似静态域的构造函数。

class Type {
    static {
 		// ...       
    }
}

对象析构

在 Java 垃圾回收期清理对象之前会调用该对象的finalize方法,在该方法中可以做一些收尾工作。

更好的方法是提供一个close方法进行收尾,由调用者决定调用的时间点,因为我们无法确定finalize方法会在何时被调用。

概述

包用来组织类,使类之间拥有一个层次结构,并减少类名冲突(这是主要目的)。

包结构类似(其实完全一样)文件的组织结构:

一个文件路径home/dev/class1.java对应到包 --> home.dev.class1

实际上,大多数人在组织包结构时,通常使用域名的逆序,例如笔者可以这样命名:top.gaolihai

这种方式来源于 Sun 公司的建议:

为了保证包名的绝对 唯一性,Sun公司建议将公司的因特网域名(这显然是独一无二的)以逆序的形式作为包名。并且对于不同的项目使用不同的子包。例如, horstmann.com 是本书作者之一注册的域名。逆序形式为 com.horstmann。这个包还可以被进一步地划分成子包,如 com.horstmann.corejava。

—— Core Java I (P131)

将类添加到包

在文件开头写上:

package /* ... */;

例如:

package top.gaolihai.test;

那么该类应放在./top/goalihai/test目录下,编译时使用javac top/gaolihai/test/Src.java,调用解释器时使用java top.gaolihai.test.Src

当我们不指定类文件的包时,该类将位于一个默认包(没名字)下,与其他没有指定包的类共享一个包作用域。

导入类

要访问不同包里的公有类,我们可以在类名前指定完整的包路径:

java.util.LinkedHashMap<String, Integer> map = new java.util.LinkedHashMap(); 

或者使用import

导入该类:

import java.util.LinkedHashMap

或者导入包下的所有类:

import java.util.*

这时候就可以直接使用:

LinkedHashMap<String, int> map = new LinkedHashMap(); 

类的作用域在整个包内,故若与某类在同一个包,可以不导入,直接使用。

import 语句并不类似于 C/C++ 中的 #include,而更像 C/C++ 中的 using。对应地,包类似于 C/C++ 中的 namespace。

导入静态域

import还可以用来将一个类的静态域和静态方法全部导入(或导入特定的),例如导入Math下的所有静态域和静态方法:

import java.lang.Math.*;

这时就可以直接使用,而不是通过Math来引用:

round(/* val */);
类路径

在调用第三方库(jar 文件、java 文件)时,我们需要告诉编译器这些类都在哪。

在编译时使用-cp(classpath 的缩写)参数,其后指定一个或多个.jar文件或目录并以:;分隔。

java -cp {route};{route};...

对于.java文件,可以直接指定上级目录,对于.jar文件,必须指定具体的文件名或使用通配符*,例如./lib/*

更多详细内容见 Java 核心技术 卷 I --> P137

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高厉害

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值