Java学习笔记(3): 对象封装
2017-11-05 17:39
344 查看
封装
封装对象初始流程
package cc.openhome; class CashCard { String number; int balance; int bonus; CashCard(String number,int balance,int bonus) { this.number = number; this.balance = balance; this.bonus = bonus; } }
构造函数是与类名称同名的方法,不用声明返回类型。为了区别构造函数的参数与类的数据成员同名,在对象数据成员前加上this关键字,表示将参数的值指定给这个对象的数据成员。
封装对象操作流程
可以定义方法,来解决撰写重复流程的问题。方法若有返回值,必须在方法前声明返回值的类型,如果不用返回值,方法名前声明void。在Java命名习惯中,方法名称首字母是小写。封装对象内部数据
用户撰写程序时,如果有些数据是类所私有,在Java中可以使用private关键字定义。如果没有提供方法存取private成员,那用户就不能存取(除非你愿意提供取值方法)。在Java命名规范中,取值方法的名称形式是固定的,也就是以get开头,之后接上首字母大写的单词。
封装目的主要就是隐藏对象细节,将对象当作黑箱进行操作。
private也可以用在方法或构造函数声明上,私有方法或构造函数通常是类内部某个共享的演算流程,外界不用知道私有方法的存在。private也可以用在内部类声明。
package cc.openhome; class CashCard { private String number; private int balance; private int bonus; //使用private定义私有成员 ... void store(int money) { //要修改balance,得通过store()定义的流程 if(money > 0) { this.balance += money; if(money >= 1000) { this.bonus++; } } else { System.out.println("储值是负的?"); } } int getBalance() { //提供取值方法成员 return balance; } int getBonus() { return bonus; } int getNumber() { return number; } }
类语法细节
public权限修饰
之前我们的Cashcard类是定义在cc.openhome包中,现在要将CashCard类定义至cc.openhome.virtual包中,除了原始码与位码的文件需求必须符合包层级之外,原始码内容也得做些修改:package cc.openhome.virtual; class CashCard { …… }
修改过后出现错误
CashCard is not public in cc.openhome.virtual; cannot be accessed from outside package----,是因为不同包的类程序代码中,想要直接存取,就会出现这样的错误。
包范围权限:如果没有声明权限修饰的成员,只有在相同包的类程序代码中,才可以直接存取。
如果想在其他包的类程序代码中存取某包的类或对象成员,则该类或对象成员必须是公开成员,在Java中要使用public加以声明。
构造函数、方法、对象前都可以声明public。
包权限:包管理其实还有权限管理上的概念,没有定义任何权限关键字时,就是包权限。
如果类上没有声明public权限关键字,类中的方法就算是public,也等于是包权限了,因为类本身是包权限,其他包根本就无法使用类,那么其中定义的方法也无法使用。
构造函数
在定义类时,可以使用构造函数定义对象建立的初始流程。构造方法是与类名称同名,无须声明返回类型的方法。public class Some { private int a = 10; private Sting text; public Some (int a, String text) { this.a = a; this.text = text; } …… }
如果这样建立Some对象,成员a和text会初始两次。a和text分别先初始为0与null,之后在通过构造函数流程,设定为构造函数参数的值。如果定义类时,没有撰写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数。所以也可以以自变量方式调用构造函数:
Some some = new Some();
只有编译程序自动加入的构造函数,才称为默认构造函数,自行撰写无参数没有内容的构造函数不称为默认构造函数。
如果自行撰写了构造函数,编译程序就不会自动建立默认构造函数。
public class Some { public Some(int a) { } }
那就只有一个具int参数的构造函数,所以就不可以用new Some()来创建对象,而必须使用new Some(1)的形式来创建对象。
构造函数与方法重载
视使用情境或条件的不同,创建对象时也许希望有对应的初始流程。可以定义多个构造函数,只要参数类型或个数不同,这称为重载构造函数。有些场合建议,如果定义了有参数的构造函数,也可以加入无参数的构造函数,即使内容为空也无所谓,这是为了日后使用上的弹性。
定义方法时也可以进行重载,可为类似功能的方法提供统一名称,但根据参数类型或个数的不同调用对应的方法。返回值类型不可作为方法重载依据。
编译程序在处理重载方法时,会依以下顺序来处理:
1. 还没有装箱动作前可符合自变量个数与类型的方法。
2. 装箱动作后可符合自变量个数与类型的方法。
3. 尝试有不定长度自变量并可符合自变量类型的方法。
4. 找不到合适的方法,编译错误。
使用this
除了被声明为static的地方外,this关键字可以出现在类中的任何地方,在对象建立后为“这个对象”的参考名称。在Java中,this()代表了调用另一个构造函数,调用哪个构造函数视调用this()时给的自变量类型与个数而定。
this()调用只能出现在构造函数的第一行。
如果撰写了对象初始区块,对象建立之后会先执行对象初始区块,接着才调用指定的构造函数。
对象初始区块:在创建对象之后,调用构造函数之前,想要执行的流程。用{}定义。
static类成员
被声明为static的成员,不会让个别对象拥有,而是属于类,是将类名称作为名称空间。通过类名称与“.”运算符就可以取得static成员。根据命名习惯,首字母大写就是类,类名称加上“.”运算符直接调用的就是static成员。
在static方法或区块中不能出现this关键字,也不能调用非static方法或区块。但是可以使用static数据成员或方法成员。
import static语法是为了偷懒,但要注意名称冲突问题,有些名称冲突编译程序可通过以下顺序来解析:
局部变量覆盖:选用方法中的同名变量、参数、方法名称。
成员覆盖:选用类中定义的同名数据成员、方法名次。
重载方法比较:使用import的各个静态成员,若有同名冲突,尝试通过重载判断。
不定长度自变量
要使用不定长度自变量,声明参数列时要在类型关键字后加上…。实际上int…声明的变量实际上展开为数组。package cc.openhome; public class MathTool { public static int sum(int... numbers) { int sum = 0; for(number : numbers) { sum += number; } return sum; } }
使用不定长度自变量时,方法上声明的不定长度参数必须是参数列最后一个。
public void some (int arg1,int arg2,int...varargs) { ... }
使用两个以上不定长度自变量是不合法的。
内部类
在类中再定义类,这称为内部类。内部类也可以使用public、protected或private声明。
内部类本身可以存取外部类的成员,通常非静态内部类会声明为private,这类内部类是辅助类中某些操作而设计,外部不用知道内部类的存在。
内部类也可以声明为static。
相关文章推荐
- 【学习笔记03】java面向对象-封装
- Java学习笔记——类与对象(封装、继承与多态)
- (JAVA SE 学习笔记)Java.SE.第009讲.面向对象之封装
- (JAVA SE 学习笔记)Java.SE.第011讲.面向对象之封装.续二(对一些原理机制进行了详细的解释,适合初学者学习)
- java学习笔记2—对象及封装
- Java学习笔记002——类、对象、封装
- Java 学习笔记 ------第五章 对象封装
- Java菜鸟学习笔记--面向对象篇(二):封装与访问修饰符
- java类和对象学习笔记(二)数据域封装和可见性修饰符
- (JAVA SE 学习笔记)Java.SE.第010讲.面向对象之封装.续
- Java学习笔记(四)之―认识类、对象、封装、继承、多态、打包器
- java学习笔记(六)----对象的类型转换, 匿名内置类
- JAVA2核心技术卷1 学习笔记3 对象和类
- 持有对象的引用 -Java学习笔记(33)
- java学习笔记2:对象的"引用"之二
- Java 学习笔记 (2) -Java 对象 间的 传递 赋值
- java对象序列化学习笔记
- Java对象序列化学习笔记
- Java 对象的 toString() 方法 -Java 学习笔记 (16)
- java对象序列化学习笔记