-
static静态变量补充知识:
- static静态变量:数据只需要一份,且需要被共享时(访问,修改)例如,记录全局某个数量。
- 实例变量:每个对象都要有一份,数据各不同。(普通定义)
-
静态方法
-
静态方法可以用来设计工具类。
-
工具类中的方法都是静态方法,每个类都是用来完成一个功能的。
-
静态方法可以直接用类来调用,避免用对象调用,浪费内存。
-
工具类定义时,建议把构造器私有化(private),这样就不能构建对象了。
-
静态方法可以直接访问静态属性,静态方法中不能出现this关键字。
-
面向对象小案例
- 电影类
package 面向对象小案例;public class Movie {private int id;private String name;private double price;private String actor;public Movie() {}public Movie(int id, String name, double price, String actor) {this.id = id;this.name = name;this.price = price;this.actor = actor;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getActor() {return actor;}public void setActor(String actor) {this.actor = actor;}
}
- 电影业务逻辑类
package 面向对象小案例;import java.util.Scanner;public class movieOperator {private Movie[] movie;//定义一个电影数组等会用于接收我们上面定义的电影信息public movieOperator(Movie[] movie) {//利用构造方法将我的main方法中的电影数组的电影信息存入业务逻辑类的电影数组中this.movie = movie;}//打印电影信息public void printMovies() {for (Movie m : movie) {System.out.println(m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor() + "\t");}}//根据电影ID查找电影信息public void searchMovie() {Scanner sc = new Scanner(System.in);System.out.println("请输入你要查找的电影ID:");int n = sc.nextInt();for (Movie m : movie) {if (m.getId() == n) {//如果查找的电影ID等于遍历到的电影数组里的ID,就打印这个电影的所有信息System.out.println(m.getId() + "\t" + m.getName() + "\t" + m.getPrice() + "\t" + m.getActor());return;}}System.out.println("没有你要查找的电影");}
}
- 主类
package 面向对象小案例;public class test1 {public static void main(String[] args) {Movie[] movies = new Movie[5];//创建一个电影数组//存入所有的电影数据movies[0] = new Movie(1, "qq", 10, "qq");movies[1] = new Movie(2, "ww", 3, "ww");movies[2] = new Movie(3, "ee", 40, "ee");movies[3] = new Movie(4, "rr", 5, "rr");movies[4] = new Movie(5, "tt", 30, "tt");//构建业务逻辑对象movieOperator mo = new movieOperator(movies);mo.printMovies();//调用打印电影信息的方法mo.searchMovie();//调用根据电影ID查找电影信息的方法}
}//结果为
/*
1 qq 10.0 qq
2 ww 3.0 ww
3 ee 40.0 ee
4 rr 5.0 rr
5 tt 30.0 tt
请输入你要查找的电影ID:
3
3 ee 40.0 ee进程已结束,退出代码为 0
*/
四种修饰符的权限范围
-
private
( private void xx ( ){ } )
- 只能本类调用访问
-
缺省
( void xx ( ){ } )
- 只能当前类中,同一个包的其他类中调用访问
-
protected
(protected void xx ( ){ })
- 只能当前类中,同一个包的其他类中,子孙类中访问
-
public
- 任何类中都能访问
-
子类的全部构造器,都会先调用父类构造器,再执行自己
-
用this调用兄弟构造器
-
super()和this()必须写在构造器的第一行,并且两者不能同时出现
-
多态
-
前提是:类之间有继承关系,存在父类引用子类对象,存在方法重写。
-
编译看左,运行看右。
-
右边对象是解耦的,更便于拓展和维护
-
多态下不能使用子类的独有功能(因为编译看左,父类中没有子类独有的方法)
解决方法:强制转换
父类 a = new 子类();
子类 b = new (子类) a ;
b.子类方法();
-
支付模块小案例
- Card类
package 支付模块小案例;public class Card {private String carId;private String name;private String phone;private double money;public Card(String carId, String name, String phone, double money) {this.carId = carId;this.name = name;this.phone = phone;this.money = money;}public Card() {}public String getCarId() {return carId;}public void setCarId(String carId) {this.carId = carId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}@Overridepublic String toString() {return "Card{" +"carId='" + carId + '\'' +", name='" + name + '\'' +", phone='" + phone + '\'' +", money=" + money +'}';}//预存金额public void deposit(double money) {this.money+=money;}//消费金额public void consume(double money) {this.money-=money;}
}
- Gold Card类
package 支付模块小案例;public class GoldCard extends Card {public GoldCard(String carId, String name, String phone, double money) {super(carId, name, phone, money);}public GoldCard() {}public void consume(double money){System.out.println("您的金卡当前消费为:"+money);System.out.println("打折后消费:"+money*0.8);if(this.getMoney()<money*0.8){System.out.println("您的余额为:"+this.getMoney()+"无法支付该金额");return;}//更新消费后,剩下的余额this.setMoney(this.getMoney()-money*0.8);if(money>=200){System.out.println("您的消费满200,送您一张免费洗车票");}}
}
- Silver Card类
package 支付模块小案例;public class SilverCard extends Card{public SilverCard(String carId, String name, String phone, double money) {super(carId, name, phone, money);}public SilverCard() {}@Overridepublic void consume(double money){System.out.println("您的银卡当前消费为:"+money);System.out.println("打折后消费:"+money*0.9);if(this.getMoney()<money*0.9){System.out.println("您的余额为:"+this.getMoney()+"无法支付该金额");return;}//更新消费后,剩下的余额this.setMoney(this.getMoney()-money*0.9);}
}
- 主类
package 支付模块小案例;import java.util.Scanner;public class Demo {public static void main(String[] args) {Card card1=new GoldCard("111","张三","123123",6000);pay(card1);Card card2=new SilverCard("222","李四","456456",2500);pay(card2);}//设置一个刷卡机方法public static void pay(Card card){System.out.println("请刷卡,请输入你当前消费的金额:");Scanner sc=new Scanner(System.in);double money=sc.nextDouble();card.consume(money);}
}/*
结果为:请刷卡,请输入你当前消费的金额:3000您当前消费为:3000.0打折后消费:2400.0您的消费满200,送您一张免费洗车票请刷卡,请输入你当前消费的金额:3000您当前消费为:3000.0打折后消费:2700.0您的余额为:2500.0无法支付该金额
*/