类和对象
类是对象的抽象,对象是类的实例。
类的定义
class 类名{
成员变量; //描述对象的特征
成员方法; //描述对象的行为
}
实例:定义一个曲奇饼干类
class Cookie{
String brand; //类中定义的变量称为成员变量
int num;
void read() {
int price = 3; // 方法内部定义的变量称为局部变量
int total_price = num * price;
System.out.println("The price of" + num + brand + " is " + total_price + " yuan.");
}
}
Java的方法不能像C++一样类外定义,C++如果在类的内部定义方法, 这个方法将自动地成为内联(inline) 方法,但是Java中, 所有的方法都必须在类的内部定义, 而且也并不表示它们是内联方法。
注意:如果需要返回一个可变对象的引用, 应该首先对它进行克隆(clone ),否则就有可能破坏对象的封装性。
程序设计语言的参数传递一般有两种方式:值调用和引用调用。Java是值调用而非引用调用,对象引用是按值传递的。
对象的创建
创建对象分为声明对象和实例化对象
类名 对象名称 = null;
对象名称 = new 类名();
可以合为一步创建:类名 对象名称 = new 类名();
创建曲奇饼干对象[皇冠丹麦][蓝罐丹麦]
public class Test1 {
public static void main(String[] args[]) {
Cookie danisa = new Cookie(); //创建第一个Cookie对象
danisa.brand = "Danisa"; //为danisa对象的brand属性赋值
danisa.read(); //调用danisa对象的read()方法
Cookie kjeldsens = new Cookie(); //创建第二个Cookie对象
kjeldsens.brand = "Kjeldsens";
kjeldsens.read();
}
}
对象的引用传递
和C++的引用不同,Java的引用本质是指针,类似C++的对象指针,而C++的引用是为原变量起一个别名,二者是同一个对象,只是名字不同。
类属于引用数据类型,引用数据类型就是指内存空间可以同时被多个栈内存引用,引用传递就是一个堆内存空间的使用权给多个栈内存空间使用。
但是一个栈内存空间只能指向一个堆内存空集,如果想要再指向其他堆内存空间,就必须先断开已有的指向才能分配新的指向。
public class Test2 {
public static void main(String[] args[]) {
Cookie danisa = new Cookie(); //声明danisa并实例化
danisa.brand = "Danisa";
danisa.read();
Cookie goodies = null; //声明goodies但不实例化
goodies = danisa; //danisa给goodies分配空间使用权
goodies.read();
}
}
访问控制
- (1)private(当前类访问级别):private 属于私有访问权限,用于修饰类的属性和方法。类的成员一旦使用了private关键字修饰,则该成员只能在本类中进行访问
- (2)default:如果一个类中的属性或方法没有任何的访问权限声明,则该属性或方法就是默认的访问权限,默认的访问权限可以被本包中的其它类访问,但是不能被其他包的类访问
- (3)protected:属于受保护的访问权限。一个类中的成员使用了 protected 访问权限,则只能被本包及不同包的子类访问
- (4)public:public 属于公共访问权限。如果一个类中的成员使用了 public访问权限,则该成员可以在所有类中被访问,不管是否在同一包中
访问范围 | private | default | protected | public |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包的类中 | √ | √ | √ | |
不同包的子类 | √ | √ | ||
全局范围 | √ |
小提示:Java 程序的文件名
如果一个 Java 源文件中定义的所有类都没有使用 public 修饰,那么这个 Java 源文件的文件名可以是一切合法的文件名;如果一个源文件中定义了一个 public 修饰的类,那么这个源文件的文件名必须与 public 修饰的类名相同。by 《Java基础案例教程(第二版)》
类的封装
封装:将将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类提供的方法实现对内部信息的操作访问
实现封装:private关键字修饰类的属性,让类的属性私有化,被私有化的属性只能在类中访问
class Cookie{
private String brand;
private int num;
private int price = 3;
public String getBrand() {
return brand;
}
public void setBrand(String brand){
this.brand = brand;
}
public int getNum() {
return num;
}
public void setNum(int num){
if(num <= 0){
system.out.println("您输入的数量有误");
} else {
this.num = num;
}
}
public void read() {
int total_price = num * price;
System.out.println("The price of" + num + brand + " is " + total_price + " yuan.");
}
}
构造方法
构造方法用于在实例化对象时(注意不是声明对象时)为对象的属性赋值,不定义构造方法即会创建默认构造方法。
语法:
- (1)构造方法的名称必须与类名一致
- (2)构造方法名称前不能有任何返回值类型的声明
- (3)不能在构造方法中使用 return 返回一个值,但是可以单独写 return 语句作为方法的结束
class Cookie{
private String brand;
private int num;
private int price = 3;
public Cookie(