1、成员变量
/** * 在java中。对象的属性也被称为成员变量 */ public class Book { private String Name;//定义一个String类型的成员变量 public String GetName(){ // 定义一个GetName 方法 int id = 0; // 局部变量 setName("Java"); // 调用类中的其他方法 return id + this.Name; //设置方法返回值 } /** * 定义一个SetName方法 * @param name */ private void SetName(String name){ this.Name = name; // 将参数值赋予类中的一个成员变量 } public Book getBook(){ return this; // 返回Book的类引用 } }
2、成员方法
3、权限修饰符
4、局部变量==在成员方法内部定义的变量
5、局部变量的有效范围
6、this关键字
方法里隐藏着一个this自引用,指向调用这个方法的对象。
使用一个对象调用方法,也叫做在这个对象上调用方法。因为方法可以访问这个对象的值。
访问一个成员变量的完整形态,是"this.成员变量的名字"
public class MerchandiseV2 { public String name; public String id; public int count; public void addCount(int count) { // >> TODO 方法里隐藏着一个this自引用,指向调用这个方法的对象。 // >> TODO 使用一个对象调用方法,也叫做在这个对象上调用方法。因为方法可以访问这个对象的值。 // >> TODO 访问一个成员变量的完整形态,是"this.成员变量的名字" this.count += count; System.out.println("MerchandiseV2的addCount方法使用的对象是:" + this); } }
7、类的构造方法
package supermarket; public class MerchandiseV2WithConstructor { public String name; public String id; public int count; public double soldPrice; public double purchasePrice; // >> TODO 构造方法(constructor)的方法名必须与类名一样,而且构造方法没有返回值。这样的方法才是构造方法。 // >> TODO 构造方法可以有参数,规则和语法于普通方法一样。使用时,参数传递给 new 语句后类名的括号后面。 // >> TODO 如果没有显示的添加一个构造方法,Java会给每个类都会默认自带一个无参数的构造方法。 // TODO 如果我们自己添加类构造方法,Java就不会再添加无参数的构造方法。这时候,就不能直接 new 一个对象不传递参数了(看例子) // >> TODO 所以我们一直都在使用构造方法,这也是为什么创建对象的时候类名后面要有一个括号的原因。 // >> TODO 构造方法无法被点操作符调用或者在普通方法里调用,只能通过 new 语句在创建对象的时候,间接调用。 // TODO 理解一下为什么构造方法不能有返回值,因为有返回值也没有意义,new 语句永远返回的是创建出来的对象的引用 public MerchandiseV2WithConstructor(String name, String id, int count, double soldPrice, double purchasePrice) { this.name = name; this.id = id; this.count = count; this.soldPrice = soldPrice; this.purchasePrice = purchasePrice; } public void describe() { System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice + "。商品进价是" + purchasePrice + "。商品库存量是" + count + "。销售一个的毛利润是" + (soldPrice - purchasePrice)); } public double calculateProfit() { double profit = soldPrice - purchasePrice; // if(profit <= 0){ // return 0; // } return profit; } public double buy(int count) { if (this.count < count) { return -1; } return this.count -= count; } }
8、构造方法的重载和相互调用
package supermarket; public class MerchandiseV2 { public String name; public String id; // >> TODO 构造方法执行前,会执行给局部变量赋初始值的操作 // >> TODO 我们说过,所有的代码都必须在方法里,那么这种给成员变赋初始值的代码在哪个方法里?怎么看不到呢? // TODO 原来构造方法在内部变成了<init>方法。学习就是要脑洞大,敢想敢试,刨根问底。 public int count = 999;// 999/0; public double soldPrice; public double purchasePrice; // >> TODO 构造方法(constructor)的重载和普通方法一样 public MerchandiseV2(String name, String id, int count, double soldPrice, double purchasePrice) { this.name = name; this.id = id; this.count = count; this.soldPrice = soldPrice; this.purchasePrice = purchasePrice; // soldPrice = 9/0; } // >> TODO 在构造方法里才能调用重载的构造方法。语法为this(实参列表) // >> TODO 构造方法不能自己调用自己,这会是一个死循环 // >> TODO 在调用重载的构造方法时,不可以使用成员变量。因为用语意上讲,这个对象还没有被初始化完成,处于中间状态。 // >> TODO 在构造方法里才能调用重载的构造方法时,必须是方法的第一行。后面可以继续有代码 public MerchandiseV2(String name, String id, int count, double soldPrice) { // double purPrice = soldPrice * 0.8; // this(name, id, count, soldPrice, purchasePrice); this(name, id, count, soldPrice, soldPrice * 0.8); // double purPrice = soldPrice * 0.8; } // >> TODO 因为我们添加了构造方法之后,Java就不会再添加无参数的构造方法。如果需要的话,我们可以自己添加这样的构造方法 public MerchandiseV2() { this("无名", "000", 0, 1, 1.1); } public void describe() { System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice + "。商品进价是" + purchasePrice + "。商品库存量是" + count + "。销售一个的毛利润是" + (soldPrice - purchasePrice)); } public double calculateProfit() { double profit = soldPrice - purchasePrice; // if(profit <= 0){ // return 0; // } return profit; } public double buy(int count) { if (this.count < count) { return -1; } return this.count -= count; } }
9、静态变量、常量和方法
静态变量使用 static 修饰符
静态变量如果不赋值,Java也会给它赋以其类型的初始值
静态变量一般使用全大写字母加下划线分割。这是一个习惯用法
所有的代码都可以使用静态变量,只要根据防范控制符的规范,这个静态变量对其可见即可
比如 public 的静态变量,所有的代码都可以使用它
但是如果没有public修饰符,只能当前包的代码能使用它
TODO 使用自己的使用静态变量的时候,直接写静态变量名字。
import com.geekbang.supermarket.MerchandiseV2WithStaticVariable; import static com.geekbang.supermarket.MerchandiseV2WithStaticVariable.*; public class MerchandiseV2DescAppMain { public static void main(String[] args) { MerchandiseV2WithStaticVariable merchandise = new MerchandiseV2WithStaticVariable ("书桌", "DESK9527", 40, 999.9, 500); merchandise.describe(); // >> TODO 使用import static来引入一个静态变量,就可以直接用静态变量名访问了 // TODO import static也可以使用通配符*来引入一个类里所有静态变量 System.out.println(DISCOUNT_FOR_VIP); } }
packagesupermarket; public class MerchandiseV2WithStaticVariable { public String name; public String id; public int count; public double soldPrice; public double purchasePrice; // >> TODO 静态变量使用 static 修饰符 // >> TODO 静态变量如果不赋值,Java也会给它赋以其类型的初始值 // >> TODO 静态变量一般使用全大写字母加下划线分割。这是一个习惯用法 // >> TODO 所有的代码都可以使用静态变量,只要根据防范控制符的规范,这个静态变量对其可见即可 // TODO 比如 public 的静态变量,所有的代码都可以使用它 public static double DISCOUNT_FOR_VIP = 0.95; // TODO 但是如果没有public修饰符,只能当前包的代码能使用它 static int STATIC_VARIABLE_CURR_PACKAGE_ONLY = 100; public MerchandiseV2WithStaticVariable(String name, String id, int count, double soldPrice, double purchasePrice) { this.name = name; this.id = id; this.count = count; this.soldPrice = soldPrice; this.purchasePrice = purchasePrice; } public String getName() { return name; } public MerchandiseV2WithStaticVariable(String name, String id, int count, double soldPrice) { this(name, id, count, soldPrice, soldPrice * 0.8); } public MerchandiseV2WithStaticVariable() { this("无名", "000", 0, 1, 1.1); } public void describe() { System.out.println("商品名字叫做" + name + ",id是" + id + "。 商品售价是" + soldPrice + "。商品进价是" + purchasePrice + "。商品库存量是" + count + "。销售一个的毛利润是" + (soldPrice - purchasePrice) + "。折扣为" + DISCOUNT_FOR_VIP); } public double calculateProfit() { double profit = soldPrice - purchasePrice; // if(profit <= 0){ // return 0; // } return profit; } public double buy() { return buy(1); } public double buy(int count) { return buy(count, false); } public double buy(int count, boolean isVIP) { if (this.count < count) { return -1; } this.count -= count; double totalCost = count * soldPrice; if (isVIP) { // >> TODO 使用自己的使用静态变量的时候,直接写静态变量名字。 return totalCost * DISCOUNT_FOR_VIP; } else { return totalCost; } } }
10、类的主方法