1>Java中的常量

  使用final和static来修饰的变量称为常量,常量用大写字母表示,字母间用下划线连接。

  Java中定义常量有以下几种方式:

interface ConstantInterface {
String SUNDAY = "SUNDAY";
String MONDAY = "MONDAY";
String TUESDAY = "TUESDAY";
String WEDNESDAY = "WEDNESDAY";
String THURSDAY = "THURSDAY";
String FRIDAY = "FRIDAY";
String SATURDAY = "SATURDAY";
}
enum ConstantEnum {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
class ConstantClassField {
public static final String SUNDAY = "SUNDAY";
public static final String MONDAY = "MONDAY";
public static final String TUESDAY = "TUESDAY";
public static final String WEDNESDAY = "WEDNESDAY";
public static final String THURSDAY = "THURSDAY";
public static final String FRIDAY = "FRIDAY";
public static final String SATURDAY = "SATURDAY";
}

  第一种方式利用了接口(Interface)的中变量默认为static final的特性,但是不符合接口设计的初衷。

  第三种方式如果静态变量很多时,如果我们只需要其中的一个常量,导致的结果却是整个类被加载到内存中,这点是需要注意的,特别是类中的常量很多时。

2>容器类的并发性

  HashMap不是线程安全的,在并发的情况下可能会引起CPU占用率100%的情况,这是需要注意的。

  HashSet底层也是用HashMap实现的,也是线程不安全的。

  TreeMap和TreeSet也不是线程安全的。

  解决办法有2种:

  一是使用线程安全的版本,例如HashMap对应的ConcurrentHashMap,HashSet对应的CopyOnWriteArraySet。

  二是使用Collections的静态方法,例如Collections.synchronizeMap()。

  ArrayList也不是线程安全的,多线程的情况下可以使用CopyOnWriteArrayList或者Vector来代替。CopyOnWriteXXX类读时不加锁,写入时会加锁。

  还有我们常用的StringBuffer是线程安全的,StringBuilder不是线程安全的。

3>异常和错误

  Throwable是Java处理错误的父类。

  Throwable的子类可以分为2类:Error和Exception。

  Error是JVM无法预期的错误,将会导致程序的崩溃,无法修复,例如内存溢出OutOfMemoryError。

  Exception是可以恢复的意外,是可以被捕获到的,可以被修复的。

  出现异常后,系统会把异常一直往上抛,没有处理的代码,就会一直往上抛。最终的结果是,单线程由main方法抛出,多线程的由Thread.run()抛出。

  我们使用try/catch来捕获并处理异常,就是希望程序不会意外的终止。

  Java提供了2种异常机制:

  1.运行时异常,RuntimeException,出现异常时交由虚拟机去处理。

  2.检查式异常,编译器强行要求我们处理的异常,常见的包括I/O异常,sql异常,我们必须用try/catch来捕获并处理异常,否则无法通过编译。

  常见的运行时异常包括:ClassCastException,DOMException,NullPointerException,IndexOutOfBoundException(数组越界)。

  随着程序的调试,运行时异常会越来越少,程序健壮性也会越来越好。

4>接口

  接口的修饰符可以有public和缺省的2种。

  接口中的域默认的是public和final的,即使不去写public和final,它们也是public和final的。

  接口中方法默认的是public的,即使不去写public,它们也是public的。

  

  当一个类继承自一个类又实现了接口时,继承必须被放在前面,否则会报错。

  接口也可以继承自一个或者多个接口:interface A extends B,C。B和C是接口。

  接口可以嵌套在其他的接口或者类中,如下:

  

  接口的修饰符可以有public和缺省的2种,所以会报上面的错误。

  

public interface IA {
public void out(); }
public class SA {
public void out() {
System.out.println("SA");
} }
public class A extends SA implements IA{
public static void main(String[] args) {
new A().out();
} }

  输出的结果是:SA
  接口中的方法在实现类中都要写出来,A中里却没有,这是因为父类实现了这个方法。所以这里调用的还是父类的方法。

5>内部类

  内部类可以是静态static的,也可用public,default,protected和private修饰。而普通类只能使用public和default。

  内部类按使用的场景可以分为以下几种情况:

  1.成员内部类

  就是作为外部类的成员,可以直接使用外部类的所有成员和方法,即使是private的。同时外部类要访问内部类的所有成员变量/方法,则需要通过内部类的对象来获取。

  成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己。

public class Outer {
public static void main(String[] args) {
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); //注意用法
inner.print("Outer.new");
} public class Inner {
public void print(String str) {
System.out.println(str);
} public Outer getOuterInstance(){
return Outer.this; //注意用法
}
}
}

  2.局部内部类

  局部内部类,是指内部类定义在方法和作用域内。

public class Parcel4 {
public Destination destination(String s) {
class PDestination implements Destination {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
return new PDestination(s);
}
public static void main(String[] args) {
Parcel4 p = new Parcel4();
Destination d = p.destination("Tasmania");
}
}

  局部内部类也像别的类一样进行编译,但只是作用域不同而已,只在该方法或条件的作用域内才能使用,退出这些作用域后无法引用的。

3.嵌套内部类

  嵌套内部类,就是修饰为static的内部类。声明为static的内部类,不需要内部类对象和外部类对象之间的联系,就是说我们可以直接引用outer.inner,即不需要创建外部类,也不需要创建内部类。

  嵌套类和普通的内部类还有一个区别:普通内部类不能有static数据和static属性,也不能包含嵌套类,但嵌套类可以。

  严格地讲,嵌套内部类不属于内部类,没有外部类对象时,也能够访问嵌套内部类。

public class StaticTest {
   private static String name = "javaJohn"; 
    private String id = "X001";
    static class Person{
      private String address = "swjtu,chenDu,China";
      public String mail = "josserchai@yahoo.com";//内部类公有成员
      public void display(){
        //System.out.println(id);//不能直接访问外部类的非静态成员
        System.out.println(name);//只能直接访问外部类的静态成员
        System.out.println("Inner "+address);//访问本内部类成员。
      }
    }
  
    public void printInfo(){
      Person person = new Person();
      person.display();
      //System.out.println(mail);//不可访问
      //System.out.println(address);//不可访问
      System.out.println(person.address);//可以访问内部类的私有成员
      System.out.println(person.mail);//可以访问内部类的公有成员
  
    }
    public static void main(String[] args) {
    StaticTest staticTest = new StaticTest();
    staticTest.printInfo();
  }
 }

4.匿名内部类

  使用匿名内部类还有个前提条件:必须继承自一个抽象类或实现一个接口。

interface Person {
public void eat();
} public class Demo {
public static void main(String[] args) {
Person p = new Person() {
public void eat() {
System.out.println("eat something");
}
};
p.eat();
}
}

  内部类的继承

  内部类的继承,是指内部类被继承,普通类 extents 内部类。而这时候代码上要有点特别处理。

public class InheritInner extends WithInner.Inner {
// InheritInner() 是不能通过编译的,一定要加上形参
InheritInner(WithInner wi) {
wi.super();
} public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner obj = new InheritInner(wi);
}
} class WithInner {
class Inner { }
}

  可以看到子类的构造函数里面要使用父类的外部类对象.super();而这个对象需要从外面创建并传给形参。

  内部类还有一些需要注意的地方,如下:

  1.嵌套类是可以放到接口中,默认是static的

class T2 {
public void test() {
IN.MyTestInner ttt = new IN.MyTestInner();
ttt.testInner();
}
} interface IN {
public void testOutter(); // 嵌套类
public class MyTestInner {
public void testInner() {
System.out.println("testInner");
}
}
}

  2.每个内部类都可以独立的实现一个接口,无论这个接口是否已经被外部类所实现。

  3.如果是抽象类而不是接口,那么只有内部类才能实现多继承。

  

《Thinking in Java》学习笔记(三)的更多相关文章

  1. Java学习笔记三十一:Java 包(package)

    Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...

  2. Java学习笔记三十:Java小项目之租车系统

    Java小项目之租车系统 一:项目背景介绍: 根据所学知识,编写一个控制台版的“呱呱租车系统” 功能: 1.展示所有可租车辆: 2.选择车型.租车量: 3.展示租车清单,包含:总金额.总载货量以及其车 ...

  3. Java学习笔记三:Java的变量、常量、变量的类型及使用规则

    Java的变量.常量.变量的类型及使用规则 每一种语言都有一些具有特殊用途的词,Java也不例外,它们被称为关键字.关键字对 Java 的编译器有着特殊的意义. 一:Java中的关键字: 注:Java ...

  4. Java学习笔记三.2

    5.继承 //Java中所有对象都显式/隐式的继承子Object类 class fu{ fu(){ System.out.println("fu..."+getNum()); sh ...

  5. Java学习笔记三——数据类型

    前言 Java是强类型(strongly typed)语言,强类型包含两方面的含义: 所有的变量必须先声明后使用: 指定类型的变量只能接受预支匹配的值. 这意味着每一个变量和表达式都有一个在编译时就确 ...

  6. Java学习笔记三---unable to launch

    环境配置好后,在eclipse下编写HelloWorld程序: ①创建新工程 ②创建.java文件,命名为HelloWorld ③在源文件中添加main方法,代码如下: public void mai ...

  7. Java 学习笔记 (三) Java 日期类型

    以下内容摘自:  https://www.cnblogs.com/crazylqy/p/4172324.html import java.sql.Timestamp; import java.text ...

  8. Java学习笔记三:运算符

    1.算术运算符: GitHub代码练习地址:https://github.com/Neo-ML/JavaPractice/blob/master/OperPrac01.java +  -  *  /  ...

  9. Java学习笔记三.3

    9.异常处理:Java中的异常处理对象就是将以前的if语句进行的判断进行抽象化,并形成的一套错误处理体系.最顶端是Throwable,接着是Error,Exception,其中Exception又明显 ...

  10. Java学习笔记三

    1.面向过程思想,强调的是过程(即动作,函数):面向对象思想,强调的是对象. 2.类与对象关系:类是对事物的描述(属性和行为-方法),对象是类的实例.对象通过new生成.属性也称成员变量;方法也称成员 ...

随机推荐

  1. [hdu5225][BC#40]Tom and permutation

    好久没写题解了..GDKOI被数位DP教做人了一发,现在终于来填数位DP的大坑了>_<. 发现自己以前写的关于数位DP的东西...因为没结合图形+语文水平拙计现在已经完全看不懂了嗯. 看来 ...

  2. HDU1102(最小生成树Kruskal算法)

    Constructing Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. Linux shell编程命令-Linux基础环境命令学习笔记

    1.正则表达式 1)^开始 *前一个字符重复0次以上 + 1次以上 ? 0次或者1次 . 一个任意字符(.*连用) {m,n} m到n次 [0-9][a-z] 任意数字或字母 $结束字符 2)sed和 ...

  4. javascript 之原型、原型链-14

    原型 原型是一个对象,每个函数对象(在javascript 之对象中说过函数也是对象 )都有一个属性(prototype)指向这个对象--原型对象,这个对象的作用是让所有对象实例共享原型对象中的属性. ...

  5. JavaScript实现职责链模式

    什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...

  6. dede的pagelist标签的listsize数字属性详解

    转载▼http://blog.sina.com.cn/s/blog_a4f3bd4e01012c8n.html dede的pagelist标签的listsize数字属性详解.见远seo经常用织梦搭建各 ...

  7. Java数据结构和算法(十三)——哈希表

    Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...

  8. 30分钟学玩转RabbitMQ

    最近在学习RabbitMQ,在网上找了不少资料发现都特高端.动辄集群部署,分布式架构什么的,对于一个初学者实在不够友好.心想求人不如求自己,为什么不自己整理一套资料呢?于是<30分钟学玩转Rab ...

  9. 基于 HTML5 WebGL 的 3D 网络拓扑结构图

    现在,3D 模型已经用于各种不同的领域.在医疗行业使用它们制作器官的精确模型:电影行业将它们用于活动的人物.物体以及现实电影:视频游戏产业将它们作为计算机与视频游戏中的资源:在科学领域将它们作为化合物 ...

  10. MYSQL Nested Join Optimization

    table_factor的语法和标准sql比较,后者只接受table_reference,每个逗号项都等于一个inner Join,e.g. SELECT * FROM t1 LEFT JOIN (t ...