IT行业的技术类型总结

1.协议

描述:

一系列用于多个对象之间信息交换的规则

例子:

HTTP,TCP

2.编程语言

描述:

一系列语法规则的集合

例子:

C语言,Java

3.架构

描述:

多个子模块之间形成的逻辑接口,其中模块本身是点,模块与模块之间的联系(即存在信息交换)构成线

例子:

分布式架构,MVC[springMVC],SOA[dubbo]

父类中存在子类成员的问题

public class ClassLoop {
    public static void main(String[] args) {
        try {
            Parent p = new Parent(); 
            p.fun(); 
        } catch (Exception e) {
            System.out.println(e); 
        }
    } 
}

class Parent {
    private Parent s = new Sub();
    public void fun() {
        s.fun();
    }
}
class Sub extends Parent {
    public void fun() {
        System.out.println("Hello");
    }
}

运行结果:
抛出栈溢出的异常: java.lang.StackOverflowError

笔记

在软件外包行业,对技术人员(主要是程序员)而言,熟悉业务领域的重要性不亚于掌握编程技术。简言之,业务重于技术。对身在此中的人而言,除了提升技术之外,熟悉“主要业务领域”,拓展“周边延伸领域”,预期“未来可能的重要领域”,这三件事情也必须要提升到职业发展的战略位置。

 

拿外汇金融行业来说,与外汇交易相关的参与者,规则,交易系统等就是“主要业务领域”,这些知识必须要足够熟悉;而大宗商品,股票,期货等应该归为“周边延伸领域”,公司目前的业务可能就多少与之有关联;而那些随着公司业务发展,将来极可能严重依赖的领域则可归为“未来可能的重要领域”。

IncompatibleClassChangeError

java.lang.IncompatibleClassChangeError:这种错误主要用于表示“不兼容性的类的变化错误”。这种问题往往发生在比较大的java项目中,由于jar包的版本变化,导致两种相互依赖的jar包不再兼容。网上有不少人说是jar包重复导致,但是这种说法不是很准确。通俗来讲,这种错误就是一个类的变化差异太大,现在正在执行的代码(正在使用这个类的代码)已经无法正常运行。最常见的情况是父类或接口的变化,导致子类出现错误(导致子类必须重构,即重新编译)。这种错误一般是在父类或接口与子类分开编译的前提下才会出现。往往是父类或接口已经改动而且重新编译过了,但是没有重新编译子类,导致子类(.class文件)与重新编译之后的父类或者接口(.class文件)不匹配引起的。

下面列举一些常见的具体情境:

(1)java.lang.IncompatibleClassChangeError: Expected non-static field ChildClass.name

父类中的某个成员变量改变为static类型的类变量,而子类中却还是以对象变量来访问这个域。比如:

public class BaseClass{

public String name=”BaseClass”;

}

public class ChildClass extends BaseClass{

public static void main(String[] agrs){

BaseClass obj = new ChildClass();

System.out.println(this.name);

}

}

BaseClass修改之后重编译:

public class BaseClass{

public static String name=”BaseClass”;

}

(2)java.lang.IncompatibleClassChangeError: Expected static field BaseClass.name

父类中的类变量改变为对象变量

public class BaseClass{
public static String name=”BaseClass”;
}

public class ChildClass extends BaseClass{
public static void main(String[] agrs){
System.out.println(BaseClass.name);
}
}

BaseClass修改之后重编译:

public class BaseClass{
public String name=”BaseClass”;
}

(3)java.lang.IncompatibleClassChangeError: Implementing class

字面意思就是“实现了类”,父接口的类型变成类,导致子类错误:

public interface BaseInterface{

}

public class ChildClass implements BaseInterface{

public static void main(String[] agrs){

}

}

BaseInterface修改之后重编译:

public class BaseInterface{

}

(4)java.lang.IncompatibleClassChangeError: class ChildClass has interface BaseClass as super class

父类改变成接口导致:

public class BaseClass{
}

public class ChildClass extends BaseClass{

public static void main(String[] agrs){
System.out.println(“Hello World”);
}
}

BaseClass修改之后重编译:

public interface BaseClass{
}

 

参考文章:

[1]http://examples.javacodegeeks.com/java-basics/exceptions/java-lang-incompatibleclasschangeerror-how-to-resolve-incompatible-class-change-error/

知识的树形拓扑结构

知识与知识之间是存在依赖关系的,这种依赖关系可以用树形拓扑结构来描述。计算机最原始最基本的树形拓扑图如下所示:

计算机的所有知识都是建立在物理学(尤其是电学)和数学的基础之上的。物理学支撑了计算机的硬件方面,而数学则支持了计算机的软件方面。

再比如计算机中的HTTP的知识拓扑结构:

技术攻坚的“点线原则”

点:选准一个点,发力,重点突破。可以围绕这个点在相关的其他地方做适当的尝试,除非形成突破,否则就不要再继续花费过多的时间了,需要尽快回到点上来或继续在别的地方尝试。这个过程必须保证只有一个重点。我们经常犯的错误就是在这个地方挖一下,又在别的地方动几下锄头。这就有点想挖井的策略,既不能太死较劲,万一这个地方真的一点谁也没有,你就算挖一辈子也挖不出井来;但是也不能一点劲也不用,否则就算地下有水,你挖的太浅了,也不可能出水来的。

线:在攻坚的过程中不能中途停止,要一鼓作气,形成突破。保持连续性,以避免二次攻坚时在精力和状态恢复过程的时间浪费。

论技术学习路线

学习一个技术有以下两条基本线路:

(1)从具体的应用(实践)入手;

(2)从理论规范出发;

所谓从具体应用入手,就是先自己搭建一个DEMO,然后在这个DEMO之上归纳出与之对应的理论,这是一个归纳法的实践;而从理论规范出发,同样也要搭建一个DEMO,然后把理论在DEMO上面演绎出来,对应的这种思路就是演绎法的体现了。不管哪种思路,最后都必须要对每个技术在理论和体验(实践)两方面把握。

其实任何一种技术的掌握都离不开这两方面。理论是灵魂,体验(实践)是血肉。缺一不可。少了任何一个方面,你都不能宣称自己掌握了这个技术。

总体来说,前者学习体验更具体形象,但是稍微片面,而且碎片化。而后者较抽象复杂,好处是非常全面,严谨。