Head First Java

条件语句

&和|可以用作条件语句,但是是长连接,左右两边的表达式必须都执行完!这和&&和||不同,&&和||是短连接,只要左边的表达式已经能够计算出整个表达式的结果,右边的表达式就不会执行!

继承、重载、多态

重载和多态不是一个概念:

  • 重载:类内的、横向的关系;两个方法名称相同,但参数不同,返回类型可以不同(但不能只改变返回类型),存取权限可以不同(因为重载的两个方法之间没有更多的关系,与继承和多态无关)。
  • 多态:类间(父类和子类)的、纵向的关系;继承自父类的方法并覆盖重写,方法名称相同,参数相同,返回类型相同或为该返回类型的子类(且子类保证能执行父类的一切行为),存取权限相同或更为开放。
  • 关于返回类型和存取权限的不相同情况,可以从子类的声明不能影响父类中声明的使用方式这一角度来看,因为多态的目的就是使用父类作为引用而不关心子类的实现,,所以子类的声明不能使得父类中的声明所体现的使用方式无法使用。因而,返回类型子类不能超出父类的声明,而存取权限子类不能限制父类的声明。

调用method:

  • 编译器根据引用类型来判断哪些method可以调用,而不是对象真正的类型。但是在调用哪个版本时,是根据对象的真正类型寻找最近的版本。

为什么会允许创建Object对象?

  • 因为有时候就是需要创建一个通用的对象,一个轻量化的对象,最常见的是在线程的同步化中。

super、this

  • 每个构造函数可以选择调用super()或this(),但不能同时调用,且它们必须是构造函数的第一条语句(父类构造函数是子类构造函数执行的第一步,父类必须先于子类构造)。

输出格式化

普通格式化

格式化说明:


格式化例子:%1$,06.1f

  • 1$:使用第1个参数(计数是1基的,即格式化字符串后面的第一个参数)作为浮点数进行格式化;
  • 使用“,”分隔整数部分;
  • 06:整数部分最少6个字符,不足部分用0补齐;
  • .1:小数点之后保留一位小数;
  • f:浮点数;

日期格式化(String.format(...))

格式化中“<”表示重复利用之前用过的参数

日期类

java.util.Calendar:set(...)中的月份是零基的,所以0表示一月份,并且set是有延迟的。

异常

try/catch是用来处理真正的异常,是程序员无法预测或防止的执行期失败状况,而不是程序的逻辑错误,而runtimeexception大部分都是程序的逻辑问题,属于非检查异常(unchecked,编译器不检查)。

输入输出

串流(InputStream/OutputStream)

设计原则:

  • 面向对象设计:每个类只要做好一件事情就行了。
  • 所以java的输入/输出API带有连接类型的串流,代表来源与目的地之间的链接,连接串流将串流与其他串流连接起来。
  • 一般来说,串流要两两连接才有意义——其中一个表示连接(输入的来源或输出的目的地),另一个表示要被调用方法(高层API,读取出真正的高层次数据类型或输出真正的高层次数据)。
  • 比如FileOutputStream用于想文件写入字节,但我们通常并不直接写字节,而是以对象层次的观点来写入,所以需要高层次的连接串流处理高层次的对象数据到字节流的连接。
  • 于是这样就可以通过不同的组合来达到最大的适应性,而不必在一种串流类中考虑所有可能的情况(这是不可能的)。

序列化

  • 标记接口:
    • Serializable接口又被成为marker或tag类的标记用接口,所有需要被序列化的类都需要声明实现该接口,而实际上没有任何方法需要被实现,只是用来标记,告诉JVM这个类可以被序列化。
    • 而一个类被序列化时,其内部所有的成员变量也将被序列化,因此它的成员变量也必须是能被序列化的,即实现了Serializable接口。
  • 过滤:
    • 如果某个成员变量不需要序列化,则使用关键字transient标记一下,序列化将跳过这个变量。
  • 指向不变性:
    • 序列化会区分两个变量指向的对象是否相同,如果序列化时两个变量指向同一个对象,则反序列化时这两个变量依然指向同一个对象。
  • 父类与子类:
    • 不可序列化的父类(非final)可以有可序列化子类,但是当对象被反序列化时,父类的构造函数将和创建新的对象一样执行(可序列化类的构造函数不会被执行),属于该不可序列化父类及其祖先类的成员变量将被构造函数初始化,但是被可序列化子类重载的成员变量将按照子类中的定义(是否transient)进行序列化和反序列化。
  • static:
    • 静态变量不会被序列化,反序列化后静态变量会维持类中原本的样子,而非存储时的值。
  • 序列化版本serialVersionUID:
    • 在类中显式地保存这个ID,则可以保证可序列化的类在演化后依然保持相同的ID,从而在经历了不损坏序列化的演化后该类依然能够反序列化之前序列化的数据(新加的变量将使用默认值)。

泛型

  • 在方法参数中使用万用字符?时,编译器会阻止任何可能破坏引用参数所指集合的行为,即只读不可写:
class ChildClass extends SuperClass {
    ...
}

public void f(List<? extends SuperClass> list) {
    list.get(0); // ok
    list.add(new ChildClass()); // wrong
}
这样倒是可以:
public <T extends SuperClass> void f(List<T> list) {
    list.get(0); // ok
    list.add((T) new ChildClass());
}
时间: 2024-08-13 14:36:34

Head First Java的相关文章

Java多线程学习(吐血超详细总结)

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程

Java TM 已被阻止,因为它已过时需要更新的解决方法

公司的堡垒机需要通过浏览器登陆,且该堡垒机的网站需要Java的支持,最近通过浏览器登陆之后总是提示"java TM 已被阻止,因为它已过时需要更新的解决方法"导致登陆之后不能操作, 但是操作系统中确实已经安装了比较新的JDK,安装的JDK版本是jdk-7u67-windows-i586,因为太烦人,所以决定搞清楚报错的原因,一劳永逸,彻底解决这个问题 准备工作:安装JDK,安装版本jdk-7u67-windows-i586.exe,因为机器的Eclipse还依赖64位的JDK,所以另安

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

由@NotNull 注解引出的关于Java空指针的控制(转)

Java 小技巧和在java应用避免NullPonintException的最佳方法 在java应用程序中,一个NullPonintException(空指针异常)是最好解决(问题)的方法.同时,空指针也是写健壮的顺畅运行的代码的关键.“预防好过治疗”这句话也同样适用于令人不爽的NullPonintException.通过应用防御性的编码技术和在遵守多个部分之间的约定,你可以再很大程度上避免NullPointException.下面的这些java小技巧可以最小化像!=null这种检查的代码.作为

Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API来处理编译期的注解. 反射机制方式的注解处理器 仅当定义的注解的@Retention为RUNTIME时,才能够通过运行时的反射机制来处理注解.下面结合例子来说明这种方式的处理方法. Java中的反射API(如java.lang.Class.java.lang.reflect.Field等)都实现了接

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

Java注解(1)-注解基础

注解(Annotation)是在JAVA5中开始引入的,它为在代码中添加信息提供了一种新的方式.注解在一定程度上把元数据与源代码文件结合在一起,正如许多成熟的框架(Spring)所做的那样.那么,注解到底可以做什么呢? 1.注解的作用. 提供用来完整地描述程序所需要的信息,如编译期校验程序信息. 生成描述符文件,或生成新类的定义. 减轻编写"样板"代码(配置文件)的负担,可以使用注解自动生成. 更加干净易读的代码. 编译期类型检查. 2.Java提供的注解 Java5内置了一些原生的注

异常笔记--java编程思想

开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出异常.抛出异常后发生的几件事: 1.在堆上创建异常对象. 2.当前的执行路径中止                                          3. 当前环境抛出异常对象的引用.                                         4. 异常处理机制接

Java自学序言

Java自学序言 亲爱的自己和各位读者朋友: 您们好! 这是作者本人自学Java编程开发的一系列文章,不具有一定的权威性,也算是自己一个人的学习笔记和总结,希望自己通过博客的形式将我自己的学习效率得到提高.如自学的稳重存在不足或错误的地方希望广大的博客朋友们多多指教.本人在此不胜感激! 学习Java是一件很痛苦的事儿,我自己要想不断的去挑战一下自己,把自己大学所学的Java知识能够巩固起来.不断的去改正自己开发中的不足之处.如何来学习Java?如何来更好的掌握Java开发语言?这些都是我们要不断

接口测试(java+testng+ant+jenkins)第五篇 java二

1.数据代码分离,方便维护. 一般做法是将数据保存在excel,通过程序读取. 2.读取excel数据. 在D盘新建excel,A列放url,B列放参数. 新建class redExcel package com.lx; import java.io.File; import java.io.IOException; import jxl.*; import jxl.read.biff.BiffException; public class redExcel{ public static voi