关于java String字符串及final的问题

今天测试String字符串时遇到的问题,求大神解决

public void demo1() {
        String a = "abc";
        String ab = "ab";
        String c = "c";
        String abc = ab+c;
        System.out.println(a==abc);//false
    }

private void demo2() {
    final String ab = "ab";
    final String c = "c";
    final String abc = "abc";
    System.out.println(ab+c==abc);//true
}

private void demo3() {
    final String ab ;
    ab ="ab";//这跟demo2()方法差别就是后赋值
    final String c = "c";
    final String abc = "abc";
    System.out.println(ab+c==abc);//false
}

可以解释下吗,三个都不太了解

http://www.kokojia.com/article/14774.html

String是很特殊的一个对象。除非你使用直接赋值
String a="abc",b="abc"
或者引用赋值
String b="abc",String a = b
才能保证值的内存地址相同.这样 == 表达式才能true,因为==对比的是内存地址。
否则,所有的string操作都会产生新的string对象。所以看到的都是false