JAVA Head First学习笔记

这是我大四上学期在掌赢信息科技实习的时候看的一本书籍,Head First系列想必大家都听说过吧。当时因为要做Android的自动化测试,编写一个名为QT4A的自动化脚本,具体在此不详述。因为是for Android,而Android用到的语言是Java,因此我在公司订购了一本《Java Head First》,在利用晚饭的间隙,花了不到半个月的时间把这本读完了。以下是我当时边读书边写的读书笔记,笔记内容按书籍章节分层。

Java虚拟机JVM
Java1.02 Java1.1 Java2 Java5.0
类存在于源文件里面,方法存在于类中,语句(statement)存在于方法中
一定有一个main函数来作为程序的起点
不要字符串之间换行
覆盖(override)的意思是由子类重新定义集成下来的方法,以改变或延伸此方法的行为
对象本身已知的事物成为实例变量,对象可以执行的动作成为方法
对象带有实例变量和方法,但它们都是类设计中的一部分
创建对象时,它会被存放在称为堆的内存区域中。不论对象被如何创建,这个堆不是普通的堆,它是可以回收垃圾的堆。Java会主动管理我们的内存

认识变量

byte 8bits short16 int32 long64
浮点数 float32 double64
Contact[] ca = new Contact[10]; //创建对象

对象的行为

状态影响行为,行为影响状态,对象有状态和行为两种属性,分别由实例变量和方法来表示
Java是通过值传递的,也就是说通过拷贝传递的,所以在方法中改变一个值,它的值是不会变的, 因为传过来的只是一个拷贝
数据隐藏的方法:将实例变量标记为private,将getters与setters标记为public
实例变量与局部变量的区别:实例变量是声明在类内而不是方法中;局部变量是声明在方法中;局部变量在使用前必须初始化
使用==可以来比较两个primitive主数据类型,或者判断两个引用是否引用同一个对象
使用equals()可以判断两个对象是否在意义上相等

超强力方法

ArrayList是Java API类,可以使用一些方法比如add(), remove()等
Java程序不会因为使用了import而变大或者变慢
ArrayList a = new ArrayList{};

对象村的优质生活

Java内的继承:

public class FamilyDoctor extends Doctor{}  

当调用对象引用的方法时,我们会调用到与该对象类型最接近的方法,即“最低阶”的方法,意思是在层次树的最下方
在子类中引用父类的方法然后再加上额外的行为:

public void roam(){  
 super.roam();     //先执行父类的方法,使用super  
 // your own roam stuff  
}

了解多态是如何运行的,创建对象的一个过程是先声明一个引用变量,然后创建对象,最后连接对象与引用。在运用多态时,引用类型可以使实际对象类型的父类,例如

Animal[] animals = new Animal[5]; 
animals[0] = new Dog();  

覆盖的规则:要覆盖就不能改变返回值的参数和函数的参数,也就是说参数必须要一样,且返回类型必须要兼容,不能降低方法的存取权限,也就是不能将public改为private
方法重载:重载的意义是两个方法的名称可以相同,但参数不同,所以,重载与多态毫无关系(可以提问别人:重载和多态有什么关系?然后一脸懵逼)
重载的三个特点;1、返回类型可以不同;2、不能只改变返回类型;3、可以更改存取权限

深入多态

接口是多态和Java的重点
通过标记类为抽象类的,编辑器就知道不管在哪里,这个类就是不能创建任何类型的实例,防止这个类被new出来
设计抽象类的语法:

abstract class Canine extends Animal{}  

不是抽象的类就被称为具体类
如果声明一个抽象的方法,就必须将类也标记为抽象的。你不能在非抽象类中拥有抽象方法。
在Java中的所有类都是从Object这个类继承出来的,它是所有类的源头,是所有类的父类 java.lang.Object
终极对象Object有一些方法,比如获得类的类型,哈希表,转化为字符串等等
Object的部分方法可以覆盖,但是有一些方法被标记为了final,不能覆盖掉它们
任何从ArrayList取出的东西都会被当作Object类型的引用而不管他原来是什么
转换为原来的类型:

Object o = a1.get(index); 
Dog d = (Dog) o;  

如果不能确定它是Dog类型的,则可以使用instanceof这个运算符来检查

if(o instanceof Dog) {
    Dog d = (Dog) o
}  

多重继承可能会很差,Java不支持这种方式。可以使用接口来处理这种问题。
Java的接口好像是100%的纯抽象类。
接口的定义:

public/abstract interface Pet{...}  
public class Dog extends Canine impliments Pet {..}  

类可以实现多个接口,在impliments后面加逗号,一个一个添加就行

对象的前世今生

对象的生存空间堆 heap、方法调用及变量的生存空间stack,局部变量存在于栈
实例变量是被声明在类中而不是方法里面,它代表了每个独立对象的字段,实例变量存在于所属的对象中
局部变量和方法的参数都是被声明在方法中,它们是暂时的,且生命周期只限于方法被放在栈上的这段期间,也就是方法调用至执行完毕为止
方法有返回类型,构造函数没有返回类型
如果已经有一个没有参数的构造函数,编译器不会帮你写没有参数的构造函数
构造函数可以是公有、私有或不指定的
构造函数在执行的时候,第一件事就是执行它的父类的构造函数,这会连锁反应到Object这个类为止
super();会把父类的构造函数放在堆栈的最上方,编译器会帮我们加上super()的调用
this是个对对象本身的引用,this只能用在构造函数中,且它必须是第一行语句,this会与super冲突,每个函数都可以选择调用super或this,但不能同时调用
杀掉一个对象的三种方法:引用永久性的离开它的范围、引用被赋值到其他对象上、直接将引用设定为NULL

数字很重要

在Math这个类中的所有方法都不需要实例变量值,因为这些方法都是静态的,无需Math的实例
静态方法的声明,例如public static int min(int a, int b){}
以类的名称调用静态的方法,比如Math.min(88,86)
以引用变量的名称调用非静态的方法,比如Song t2 = new Song(); t2.play();
让构造函数标记为私有,所以无法创建Math实例
静态的方法不能调用非静态的变量,也不能调用非静态的方法
静态变量有一个功能,可以被同类的所有实例变量共享使用。比如定义一个静态变量放在构造函数中来看这个对象被实例化过多少次
静态变量会在该类的任何静态方法执行之前就初始化
final的变量代表你不能改变它的值,final的method代表你不能覆盖掉该method,final的类代表你不能继承该类(也就是创建它的子类)
String.format() 在 java.util中的Formatter类中,可以为日期格式化等,输出一些经常输出的东西
format的第一个参数成为格式化串,比如“%,2f”,在选择格式输出时可以进行查表查找
java.util.GregorianCalendar中有各个历法,可以调用将当前以各种形式显示,这是一个java API,Calendar c = Calendar.getInstance();
java 5.0之后有静态的import,比如import static java.lang.System.out; 后面可以写out.println()
import java.lang.Math.*; 后面可以直接写sqrt(),而不用写Math.sqrt()

有风险的行为

不是由编译器检查的RuntimeException的子类,被称为检查异常
方法可以用throw关键词抛出异常对象:throw new FileIsTooSmallException();
finally块是用来存放不管有没有异常都得执行的程序
可以抛出多重异常,利用多个catch块进行选择
异常也是多态的,可以以所抛出的异常父类来catch异常
有多个catch块时异常排列要从小排到大
可以duck掉异常,但是这样会将此方法从栈上弹出,异常会再度丢给栈上的方法,这样最后JVM崩溃
void foo() throws ClothingException 声明异常
异常处理规则:catch与finally不能没有try;try与catch之间不能有程序;try一定要有catch或finally;只带有finally的try必须要声明异常

看图说故事

JFrame是一个代表屏幕上window的对象
别忘了import javax.swing.*
在Java上,取得与处理用户操作时间的过程称为even-handling
JFrame frame = new JFrame()
可以加入按钮、文字字段等:

frame.getContetnPane().add(button)  
frame.setSize(300,300)  

监听 button.addActionListener(this);

网络联机

java.net.Socket
启动新的线程

Runnable threadJob = new MyRunnable(); 
Thread myThread = new Thread(threadJob); 
myThread.start();

数据结构

关于泛型:要创建被泛型化类(例如ArrayList)的实例,声明与指定泛型类型的变量,声明(与调用)取用泛型类型的方法
以上三者是

new ArrayList<Song>()  
List<Song> songList = new ArrayList<Song>()  
void foo(List<Song> list)  x.foo(songList)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值