刚去电信营业厅办的电信200m宽带上传速度,

2147人阅读
java(20)
Java构造方法中的执行顺序
SEP 8TH, 2013&|&
作为静态区段的语句,容易知道,3 是会最先出现的。容易弄错的一点是 到底是 1 和 2 的出现顺序。
我们可以参考字节码来分析。在 eclipse 中使用 ASM bytecode 插件,得到相应的字节码:
// class version 50.0 (50)
// access flags 0x21
public class Test {
// compiled from: Test.java
static &clinit&() : void
GETSTATIC System.out : PrintStream
INVOKEVIRTUAL PrintStream.println(String) : void
&init&() : void
ALOAD 0: this
INVOKESPECIAL Object.&init&() : void
ALOAD 0: this
PUTFIELD Test.a : int
GETSTATIC System.out : PrintStream
INVOKEVIRTUAL PrintStream.println(String) : void
GETSTATIC System.out : PrintStream
INVOKEVIRTUAL PrintStream.println(String) : void
public static main(String[]) : void
INVOKESPECIAL Test.&init&() : void
正如我们所想,3 是被放在类构造方法中,这是类的初始化函数,固然在类的初始化时出现。
而在构造方法中先出现 2,之后才是 1。问题的核心集中到对象构造方法的指令顺序问题。实际上,在对象构造方法中,会先执行一些隐性的指令,比如父类的构造方法、{}区段的内容等,然后在执行显性的构造方法中的指令:
Java 编译时,对象构造方法里先嵌入隐式的指令,完毕之后,再执行 Java 源代码中显示的代码。
2.那些隐式的指令,包括父类的构造方法、变量的初始化、{}区段里的内容,并严格按照这个顺序嵌入到对象的构造方法中。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:346120次
积分:4532
积分:4532
排名:第6001名
原创:76篇
评论:158条
(1)(7)(3)(5)(14)(8)(1)(1)(2)(4)(2)(1)(2)(3)(16)(2)(3)(2)(4)(1)找好工作,快人一步昨天去面试遇到一道java设计机试题,让写出最优设计代码,我用接口实现的,结果被鄙视
题目是这样的,市场上所有商品都要交销售税10%,除了书籍、食品和药品,进口商品还有交5%的进口税,税种和商品种类以后都要变化
给出了一份商品名单表,计算出本商品单总价和总共要交的税
设计出最优的代码,体现面向对象和多态设计,使代码有很好的扩展性
商品种类&&& 单价&&& 数量&& 是否进口
book&&&&&& 12.10&&& 50&&&& 否
music CD&& 11.10&&& 10&&& 是
请各位大神说说自己的设计思路,相互学习。
《重构改善现有代码设计》一书开篇就类似例子,建议去看看
一堆map加一个完了,没有设计模式的模式是最好的模式.
明显规则引擎,呵呵我博客写一篇Bizzwhizz的博客,你看看改改,呵呵他一定满意,喜欢。
我的想法是用装饰者模式,将税收当成装饰,以后不管有多少种税收,只要在原有对象上装饰多一个税收类就能适应变化了,改动也只是多写一个税收类而已。 然后具体的税收标准还可以在计算税收的方法里去实现。又因为需求说明种类是变化的,所以就不太好实现为继承的形式,我想到的是用聚合的方法,这样种类的变化就与商品分离开来了。
class Goods{
//商品类型
private GoodsT
//是否进口
public Goods(){}
public Goods(String name,double price,boolean inlet,GoodsType type){
this.name =
this.price =
this.inlet =
this.type =
public boolean isInlet(){
public String getName(){
public double getPrice(){
public double moneyPayForTax(){
class GoodsType{
public int typeC
public String typeN
public GoodsType(String typeName,int typeCode){
this.typeCode = typeC
this.typeName = typeN
abstract class GoodsTaxDecroter extends Goods{
public GoodsTaxDecroter(Goods goods){
this.goods =
public boolean isInlet(){
return goods.isInlet();
public String getName(){
return goods.getName();
public double getPrice(){
return goods.getPrice();
//根据不同税收,编写税收函数,这样就可以瞒住税收多样的条件要求
public abstract double moneyPayForTax();
class SellTax extends GoodsTaxDecroter{
//税收比例
private double percent = 0.1;
public SellTax(Goods goods){
super(goods);
public double moneyPayForTax(){
return goods.getPrice() * percent + goods.moneyPayForTax();
class InletTax extends GoodsTaxDecroter{
//税收比例
private double percent = 0.2;
public InletTax(Goods goods){
super(goods);
public double moneyPayForTax(){
if(goods.isInlet()){
return goods.getPrice() * percent + goods.moneyPayForTax();
return goods.moneyPayForTax();
public class Test{
public static void main(String[] args){
Goods book = new SellTax(new Goods(&设计模式&,56.0,false,new GoodsType(&书籍&,1)));
Goods musicCD = new InletTax(new SellTax(new Goods(&音乐CD&,11.0,true,new GoodsType(&影音&,2))));
System.out.println(book.getName()
税收 : & + book.moneyPayForTax());
System.out.println(musicCD.getName()
税收 : & + musicCD.moneyPayForTax());
....向对象和多态设计 这个我不懂,野路子出身。
加一个免进口税的商品种类配置表... 然后写个sql.....
是不是想太多了,一个抽象的商品类+N个具体的商品,各个商品实现自己的计算价格不就行了么?
税种和商品种类以后都要变化,变化的东西应该抽象,所以商品、税种都应该继承或者是接口。税种和商品都在变化,所以计算税金的方法也应该抽象,是一个接口,用策略模式实现税金计算比较合理。
--- 共有 1 条评论 ---
我刚开始设计时就忽略了商品,定义了个商品基本类,税金计算用了接口和策略模式,如果商品采用抽象继承的话,抽象类还有实现接口吗?各个子类还用实现接口吗,我有点迷糊,搞不太清楚
接口,或者类。
标准的策略模式场景吧??
我觉得接口比较好,继承或者实现一下,定义点关键属性 就OK了。。。不懂什么设计模式。。。10:15 提问
昨天京东笔试的一道选择题,不理解
package cn.lut.
public class SameTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a=new Integer(1);
Integer b=1;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==c);
输出结果:
疑惑:有程序运行结果可得a和c地址相同,b和c地址相同,不是可以退出a和b相同吗?Integer a=1和int a=1有什么区别?
补充:不理解的地方是为什么a和c相同。
按赞数排序
1、基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。
2、复合数据类型(类) ,当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。
3、int 是基本数据类型,Integer是其包装类,注意是一个类。
int定义的变量和Integer定义的变量不关怎么比,都是想等的,因为在jdk1.5之后Integer会进行自动拆箱功能,就是将Integer定义的变量转化为int,类型,也就是说 Integer a=new Integer(1);拆箱为int a =1;
Integer a=new Integer(1);这样定义和Integer b=1;这样定义始终都不是一个对象,因为Integer b=1定义的变量b是一个对象引用,指向存放在常量池中的数,Integer a=new Integer(1);中a引用指向存放对象的堆内存中,所以这两个对象不是同一个对象。
要了解更多,可以看下这篇文章:
而 int 是数据类型
其他相似问题

我要回帖

更多关于 电信200m宽带上行速度 的文章

 

随机推荐