static+代码块+静态常量+访问权限修饰符总结+匿名内部类+案例
static以及代码块静态常量访问权限修饰符和总结匿名内部类案例static
代码块
成员代码块
类名{//成员代码块{主体;}}
创建对象时执行一次,创建一次执行一次。
创建子类对象时执行一次。
静态代码块:
类名{//代码块static{主体;}}
当类加载时,静态代码块会执行 类只加载一次,所以静态代码块只执行一次
创建类的对象时
访问静态成员变量
访问静态成员方法
创建子类对象时
静态代码块 > 成员代码块 > 构造方法
静态常量
public static final pi = 3.1415926535;访问:类名.pi;
访问权限修饰符
private和abstract不能一起使用修饰方法?
private修饰的方法不能被重写,abstract必须要重写
final和abstract能一起使用吗?
不可以。 final修饰的类 子类不能继承 abstract修饰的类要求子类必须继承
final修饰的方法 子类不能重写 abstract修饰的方法 子类必须重写!
static和abstract能一起使用吗?
都可以修饰方法 但是static修饰的方法 类名可以访问 但是abstract修饰的方法没有方法体,不能直接被调用。
static和final可以一起使用吗?
可以 静态常量
内部类
在内部定义的类就是内部类
匿名内部类(重要)
两件事
1.定义了一个类的子类
2.同时创建了这个子类对象
作用:创建一个类子类对象的快捷方式
格式 new 父类/接口(){重写方法};
例如有一个定义好的类Fly
public class Fly {public void fly(){}}
测试类
public class Test {public static void main(String[] args) {//使用匿名内部类创建Fly对象Fly f = new Fly(){//此时new好的类相当于Fly类的子类。@Overridepublic void fly(){//重写了父类的方法System.out.println("lalal");}};f.fly();//多态的表现------------- --------------- -- -- - ---- ------------------------------------------//也可以直接调用 new Fly(){@Overridepublic void fly(){System.out.println("我我我");}}.fly();
上面的开始的Fly类也可以定义成抽象类或者接口都是一样的。
public interface Run {void run();}main(){Run r = new Run(){@Overridepublic void run() {System.out.println("跑跑跑");}};r.run();}
匿名内部类作为方法的实际参数和方法的返回值类型
public interface Fly {public abstract void fly();}
方法的参数是接口,只能传递实现类对象。
public static void method(Fly f){f.fly();}
方法的返回值类型是接口,只能返回实现类对象。
public static Fly method(){return new Fly() {@Overridepublic void fly() {System.out.println("鸟儿飞了");}};}
主类
public class Test {public static void main(String[] args) {//调用 传递参数是接口 的方法method(new Fly() {@Overridepublic void fly() {System.out.println("鸟飞了");}});//或者Fly f = new Fly() {@Overridepublic void fly() {}};method(f);//调用 返回值类型是接口 的方法,只能返回实现类对象Fly f2 = method();f2.fly();} }
案例
公司类
属性
总资产属性
所有员工属性
方法
发工资方法:从总资产中减去所有员工支出。
员工类:
属性
姓名
工号
存款
工资
经理、厨师、服务员均为员工子类。经理在员工基础上添加奖金属性。发完工资后,请查看所有员工的存款情况.
公司类加入调整员工工资方法:
返回值为void
参数为:被调整工资的员工与调整金额
方法体逻辑为,在员工工资的基础上调整相应的金额
公司类添加评选幸运员工方法(随机抽取一名员工并返回)。
公司类添加开party方法,要求只能让厨师和服务员进来,其他员工都不能来。
答案
先实现员工类,很常规,定义私有成员,构造方法还有get set方法。
public class YuanGong {private String name;private String id;private double cunKuan;private double gongZi;//空参构造public YuanGong() {}//带参构造public YuanGong(String name, String id, double cunKuan, double gongZi) {this.name = name;this.id = id;this.cunKuan = cunKuan;this.gongZi = gongZi;}//get、set方法public String getName() {return name;}public void setName(String name) {this.name = name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public double getCunKuan() {return cunKuan;}public void setCunKuan(double cunKuan) {this.cunKuan = cunKuan;}public double getGongZi() {return gongZi;}public void setGongZi(double gongZi) {this.gongZi = gongZi;}}
定义一个接口,定义抽象的服务的方法供其他类使用。
public interface Service {public abstract void service();}
再定义经理类继承员工类,额外加一个私有成员奖金,构造方法,get、set方法。
public class JingLi extends YuanGong{private double jiangJin;public JingLi() {}public JingLi(String name, String id, double cunKuan, double gongZi, double jiangJin) {super(name, id, cunKuan, gongZi);this.jiangJin = jiangJin;}public double getJiangJin() {return jiangJin;}public void setJiangJin(double jiangJin) {this.jiangJin = jiangJin;}}
再定义厨师类继承员工类,没有特殊成员直接写构造方法就好,他要实现那个服务类。
public class ChuShi extends YuanGong implements Service{public ChuShi(String name, String id, double cunKuan, double gongZi) {super(name, id, cunKuan, gongZi);}public ChuShi() {}@Overridepublic void service() {System.out.println("厨师来了,炒菜");}}
再定义服务员类继承员工类,没有特殊成员直接写构造方法就好,他要实现那个服务类。
public class FuWuYuan extends YuanGong implements Service{public FuWuYuan() {}public FuWuYuan(String name, String id, double cunKuan, double gongZi) {super(name, id, cunKuan, gongZi);}@Overridepublic void service() {System.out.println("服务员来了服务");}}
定义公司类
两个成员变量:总工资和员工集合
定义构造方法
定义get set方法
定义展示工资方法
定义发工资方法
定义调整工资方法
定义开宴会方法
定义抽取幸运观众方法
import java.util.ArrayList;import java.util.Random;public class GongSi {//成员变量private double zongZiChan;private ArrayList<YuanGong> list;//开宴会,厨师和服务员可以过来服务。public void party(Service s){s.service();}//调整工资的方法public void updateGongZi(YuanGong yg, double money){yg.setGongZi(yg.getGongZi()+money);}//抽取幸运观众public YuanGong lucky(){Random r = new Random();int index = r.nextInt(list.size());return list.get(index);}//发工资public void faGongZi(){for (int i = 0; i < list.size(); i++) {YuanGong yg = list.get(i);//员工存款 = 原来的存款+工资yg.setCunKuan(yg.getGongZi() + yg.getCunKuan());zongZiChan -= yg.getGongZi();//如果是经理还要发加奖金if(yg instanceof JingLi){//向下转型JingLi jl = (JingLi) yg;zongZiChan -= jl.getJiangJin();//经理存款 = 原来的存款+奖金,工资已经加过了。jl.setCunKuan(jl.getCunKuan()+jl.getJiangJin());}}}//展示工资public void show(){System.out.println("总资产:"+zongZiChan);//展示所有员工的信息for (int i = 0; i < list.size(); i++) {YuanGong yg = list.get(i);System.out.println("姓名:"+yg.getName());System.out.println("员工工号:"+yg.getId());System.out.println("存款:"+yg.getCunKuan());System.out.println("工资:"+yg.getGongZi());//如果是经理另外打印奖金,if(yg instanceof JingLi){//向下转型JingLi jl = (JingLi) yg;System.out.println("奖金:"+jl.getJiangJin());}System.out.println("----------------------------------");}}//构造方法public GongSi(double zongZiChan, ArrayList<YuanGong> list) {this.zongZiChan = zongZiChan;this.list = list;}public GongSi() {}public double getZongZiChan() {return zongZiChan;}//get、set方法public void setZongZiChan(double zongZiChan) {this.zongZiChan = zongZiChan;}public ArrayList<YuanGong> getList() {return list;}public void setList(ArrayList<YuanGong> list) {this.list = list;}}
定义测试类
import java.util.ArrayList;public class Test {public static void main(String[] args) {double zongZiChan = 1000000.0;//创建员工集合ArrayList<YuanGong> list = new ArrayList<>();list.add(new JingLi("柳岩","001",10000,20000,200));list.add(new FuWuYuan("金莲","002",0,250));list.add(new ChuShi("唐嫣","003",10000,20000));//为公司传入参数GongSi gongSi = new GongSi(zongZiChan, list);gongSi.show();gongSi.faGongZi();//发工资了System.out.println("------------------------------");gongSi.show();//发完展示一下gongSi.updateGongZi(list.get(1),20);//提高一下金莲的工资System.out.println(list.get(1).getGongZi());YuanGong g = gongSi.lucky();//抽取幸运员工System.out.println(g.getName());System.out.println("---------");//开party测试JingLi jl = (JingLi)list.get(0);FuWuYuan fwy = (FuWuYuan) list.get(1);ChuShi cs = (ChuShi) list.get(2);gongSi.party(fwy);gongSi.party(cs);}}
Object类中的toString方法
将对象转换为字符串 对象的数据类型 + @ + 地址值(哈希值)在Object类中 或者 子类不重写 打印的是地址值而一般情况 子类都会对这个方法进行重写 返回 属性内容
定义一个person类对继承的toString()方法重写
public class Person {private String name;private int age;//自动生成@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public Person(String name, int age) {this.name = name;this.age = age;}}main(){Person p = new Person("柳岩",38);System.out.println(p);System.out.println(p.toString());}打印结果Person{name='柳岩', age=38}Person{name='柳岩', age=38}