模拟公司给员工发公司
public class Test08 {
public static void main(String[] args) {
//6. 定义测试类,创建Company对象,Manager对象,Coder对象,调用公司paySalary方法,给Manager和Coder发工资
Company company = new Company();
Manager m = new Manager();
Coder c = new Coder();
m.setName("张三");
m.setSalary(9999);
c.setName("李四");
c.setSalary(1024);
double a = company.paySalary(m);
double b = company.paySalary(c);
System.out.println("给经理:" + m.getName() + "发" + m.getSalary() + "元 公司还有" + a + "元");
System.out.println("给程序员:" + c.getName() + "发" + c.getSalary() + "元 公司还有" + b + "元");
}
}
//定义员工Employee类。包含属性:姓名,薪资
class Employee{
private String name;
private double salary;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
//2. 定义经理Manager类继承Employee类
class Manager extends Employee{
}
//3. 定义程序员Coder类继承Employee类
class Coder extends Employee{
}
//4. 定义Money接口,提供抽象方法paySalary,参数为Employee
interface Money {
public abstract double paySalary(Employee e);
}
//5. 定义公司Company类,实现Money接口,Company类包含公司总资金属性
class Company implements Money{
double s = 900000.0;
@Override
public double paySalary(Employee e) {
s -= e.getSalary();
return s;
}
}
模拟各种商品添加到购物车,电子商品打8.8折优惠,展示所有商品信息。
import java.util.ArrayList;
public class Test09 {
public static void main(String[] args) {
//创建购物车对象
ShoppingCart s = new ShoppingCart();
//创建笔记本电脑对象
Laptop L = new Laptop();
L.setName("笔记本");
L.setId("g10000");
L.setPrice(10000);
L.show();
//创建手机对象
Phone2 p = new Phone2();
p.setName("手机");
p.setId("g10001");
p.setPrice(5000);
p.show();
//创建苹果对象
Apple ap = new Apple();
ap.setName("苹果");
ap.setId("g20000");
ap.setPrice(18.88);
ap.show();
System.out.println("============================");
//加入购物车
s.addGoods(L);
s.addGoods(p);
s.addGoods(ap);
//展示
s.showGoods();
s.total();
}
}
//定义购物车类。
//2.使用ArrayList作为成员变量,保存各种商品对象。
//3.提供添加商品,移除商品,计算总价的方法。
class ShoppingCart{
ArrayList<Goods> list = new ArrayList();
//存储
public void addGoods(Goods goods){
list.add(goods);
}
//展示
public void showGoods(){
System.out.println("您选购的商品为:");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).getName()+ ", " +list.get(i).getId() + ", " + list.get(i).getPrice());
}
}
//计算最后价格
public void total(){
double d = 0;
double b = 0;
for (int i = 0; i < list.size(); i++) {
d += list.get(i).getPrice();
if (list.get(i) instanceof Fruit){
b += list.get(i).getPrice();
}
}
System.out.println("======================================");
System.out.println("原价为:" + d + "元");
System.out.println("打完折:" + ((d-b)*0.88+b) + "元");
}
}
//4.定义商品类Goods,包含商品名称,id,价格等属性。
class Goods{
private String id;
private String name;
private double price;
public String getId() {
return id;
}
public void setId(String 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;
}
}
//5.定义电子商品类EGoods继承Goods。
class EGoods extends Goods{
}
//6.定义笔记本类Laptop继承电子商品EGoods类。
class Laptop extends EGoods{
public void show (){
System.out.println("加入笔记本成功");
}
}
//7.定义手机类继承继承电子商品EGoods类类。
class Phone2 extends EGoods{
public void show (){
System.out.println("加入手机成功");
}
}
//8.定义水果类Fruit继承商品类。
class Fruit extends Goods{
}
//9.定义苹果类继承水果类
class Apple extends Fruit{
public void show (){
System.out.println("加入苹果成功");
}
}
static 关键字可以用于修饰类的成员变量、成员方法、代码块和内部类,被 static 修饰的成员称为静态成员。
静态成员属于类,不属于对象。我们可以在不创建对象的情况下,直接通过类访问静态成员。
静态成员的好处
- 全局的,可以被所有对象所共享,在内存中只存储一份,更节省内存空间。
- 可以直接通过类访问而不用创建对象,编码效率更高。
静态成员的缺点
- 静态成员是属于类的,类不被卸载,静态成员就一直存在。而实例成员会随着对象的销毁一并被 GC 回收。
接口关键字interface。实现接口关键字implements。
接口中可以定义的成员
- 常量 使用 public static final 修饰
- 抽象方法 使用 public abstract 修饰
- 默认方法 使用 public default 修饰(JDK8+)
- 静态方法 使用 public static 修饰(JDK8+)
接口中不能定义的成员
- 构造方法(接口不能创建对象,也没有成员变量需要初始化)
- 静态代码块(技术上可以做到,但没有这样的需求,在接口中定义静态代码块没有意义)
多态的前提条件
- 继承或实现关系(二选一)
- 方法的重写(子类重写方法才能有不同的表现形式)
- 父类引用指向子类对象(多态的语法格式)父类 对象名 = new 子类;
多态的好处是提升了代码的扩展性和复用性
- 扩展性:以返回值多态为例,如果有新的子类出现,方法的返回值类型和方法的调用者无需做任何修改。
- 复用性:以参数多态为例,调用方法可以传递该类及其所有子类对象,无需针对多个类编写多个方法。
态的弊端是无法调用子类特有的方法。
解决弊端的方法:强制类型转换(向下转型)。
格式:子类 对象名 = (子类)父类类型对象;