Java基础内容(5) ---- 类与对象,封装,构造方法,(this关键词)
面对对象程序设计理解:
- 不同于面向过程编程需要手动一步步整个过程实现功能,Java语言是面对对象编程,即事先写好对象的行为方法,通过调用对象的行为实现功能。
- 粗易例如洗衣服用面过程实现需要第一步浸泡衣服,第二部洗涤衣服,第三步....,而面对对象只要明确完成这个功能的对象是洗衣机,然后写好洗衣机的行为方法,就可以通过调用洗衣机实现洗衣功能。
类与对象理解:
- 面向对象编程语言是对客观世界的模拟,客观世界中的实体具有静态属性,动态行为。
- 映射到程序中,实体对应对象,对象需要为成员变量赋值并且可以调用成员方法。
- 进一步地,提取对象的共性抽象出类。所以类是对象的模板,对象是类的具体实现。
封装理解:
- 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
- 映射到程序中,private关键字将属性隐藏起来,其他类只能通过公共方法getXxx(),setXxx()对成员变量赋值和访问。
- 适当的封装可以增强代码的安全性。具体的保护措施在setXxx()中实现。
- 适当的封装可以让代码更容易理解与维护。具体体现在赋值限制条件更改可以通过对setXxx()方法进行修改,不需要对调用setXxx()的程序进行更改。
构造方法理解:
- 构造方法是与类同名的无返回方法,为成员变量赋初始值,新建对象时可以用系统提供的无参数方法为成员变量赋初始值
- 构造方法可以方法重载,实现业务分离,可视为封装优化。比如某些商品两份打折,点单作为对象可以运用构造方法的重载为这类特殊的点单赋特殊的初始值。
使用 “类,成员变量,成员方法,封装操作,封装忧化(构造方法,this关键词),对象” 的最终代码:
//1.1新建一个零售商品类,编辑商品的静态属性,动态行为
public class retailing {
//1.2封装,定义成员变量
//零售商品的成员变量(静态属性)有商品品牌名称,价格,库存量,销量
// 定义成员变量格式:private 变量类型 变量名;
// private可以修饰成员变量,成员方法,使其只能在本类中访问
private String brand;
private double price;
private int stock;
private int salesNumber;
//整数(byte,short,int,long) 默认值为0
//浮点数(float,double) 默认值为0.0
//字符(char) 默认值为'\u0000'
//布尔变量(boolean) 默认值为false
//数组,类,接口 默认值为null
//-----------------------------------------------------------------------------
//1.3定义构造方法,为成员变量赋初始值
public retailing() {}
public retailing(String brand,double price,int salesNumber,int stock){
this.brand = brand;
this.price = price;
this.salesNumber = salesNumber;
this.stock = stock;
}
//与类名同名,用以初始化成员变量的方法为构造方法
//可方法重载定义多个含有参数的构造方法
//若不自定任何构造方法,系统自动提供无参数的构造方法为成员变量赋给默认初始值
//---------------------------------------------------------------------------------
//1.4属性被private隐藏起来后,构造方法后的赋值,访问通过公开方法操作
public void setBrand(String brand){
this.brand = brand;
//形参不和成员变量同名不利于阅读,同名会覆盖成员变量,导致不能完成赋值
//this表示对用该方法的对象,使得成员变量不被覆盖
}
public String getBrand(){
return brand;
//方法中只有一个变量时,默认使用static修饰,可以省略不写
}
public void setPrice(double price){
if(price >= 0){
this.price = price;
}else{
System.out.println("价格有误")
}
}
//在setPrice()方法中对价格属性赋值进行条件限制,体现了封装的安全性
//
public double getPrice(){
return price;
}
public void setStock(int stock){
this.stock = stock;
}
public int getStock(){
return stock;
}
public void setSalesNumber(int salesNumber){
this.salesNumber = salesNumber;
}
public int getSalesNumber(){
return salesNumber;
}
//------------------------------------------------------------------------------
//1.5 定义成员方法
//成员方法sale()---零售商品销售出,库存减少,销量增加(动态行为)
public void sale(int quantities){
if(stock >= quantities){
System.out.println(brand+"当前库存:"+stock);
stock -= quantities;
salesNumber += quantities;
System.out.println(brand+"销售出"+quantities+",当前剩余:"+stock);
}else{
System.out.println(brand+"当前库存:"+stock+",库产不足");
}
}
//
//成员方法purchase()---零售商品进货后,库存量增加(动态行为)
public void purchase(int quantities){
//方法形数是局部变量
//局部变量作用范围仅在方法中,所以sale()和purchase()可以用同名形参代表不同和含义
//局部变量存储在栈内存,方法执行完毕随之方法从从栈中消失
//
System.out.println(brand+"进货"+quantities+"件");
stock+=quantities;
System.out.println(brand+"当前库存: "+stock);
}
//
//成员方法sales()---统计零售商品的总销售额(动态行为)
public void sales(){
double sales = salesNumber*price;
//方法体内的变量也是局部变量
//局部变量无默认值,sales必须定义,赋值
System.out.println("该商品当前总销售额为:"+sales);
}
//--------------------------------------------------------------------------------
//1.6新建一个热狗对象,对热狗信息进行完善,销售,入库,统计销售额。
public static void main(String[] args) {
retailing hotDog = new retailing();
//不使用含有参数的构造方法就默认使用无参数构造方法,为成员变量赋默认值
//也可以用自定义的全参数构造方法为对象赋初始值
//retailing hotDog = new retailing("Tom's hot dog",1.5,0,20);
//
System.out.println("堆内存中hotdog的内存地址为:"+hotDog);
//new关键字在堆内存中为hotdog申请了内存空间并标记了内存地址
//
//set系方法改变赋值
hotDog.setBrand("Tom's hot dog");
hotDog.setPrice(1.5);
hotDog.setSalesNumber(0);
hotDog.setStock(20);
//
//对象.成员方法(); 调用对象的行为方法
hotDog.sale(10);
hotDog.sale(20);
hotDog.purchase(30);
hotDog.sales();
}
}
堆内存中hotdog的内存地址为:com.baishi.stage1.day06.retailing@1b6d3586
Tom's hot dog当前库存:20
Tom's hot dog销售出10,当前剩余:10
Tom's hot dog当前库存:10,库产不足
Tom's hot dog进货30件
Tom's hot dog当前库存: 40
该商品当前总销售额为:15.0