Java 学习笔记(二)


1. 接口与多态。在程序设计中,有些类不应该被初始化。我们可以在类的前面加上 abstract 实现。
将该类标记为 抽象。那么这个类就不能被 new 出来,但是可以作为引用类型。

2. 编译器不会让我们初始化抽象类。抽象类代表没有人能够创建出该类的实例。但是还是可以使用抽象类来
声明为引用类型给多态使用,却不担心哪个创建该类型的对象,编译器会确保这件事。

3. 抽象类除了被继承过之外,是没有用途、没有值、没有目的的。

4. 抽象的方法没有实体。因为我们已经知道编写出抽象方法的程序代码没有意义,所以不会含有方法。

5. 如果你声明出一个抽象的方法,就必须将类也标记为抽象的。你不能在非抽象类中拥有抽象方法。多态的好处
就在于所有子型都会有那些抽象的方法。

6. 继承之后,我们必须实现所有的抽象方法。

7. 没有直接继承过其他类的类会是隐含的继承对象。继承自 Object 类。也被称为终极对象。

8. Object o = new Dog();
o.makeNoise();
上面的调用是错误的。Java 是类型检查很强的程序语言。编译器会检查你调用的是否是该对象确实
可以响应的方法。换句话说,你只能从确实有该方法的类去调用。

9. ArrayList<Object> myDogArrayList = new ArrayList<Object>();
Dog aDog = new Dog();
myDogArrayList.add(aDog);
Dog d = muDogArrayList.get(aDog); //无法通过编译
任何从ArrayList<Object> 取出来的东西都会被当作 Object 类型的引用而不是管它原来是什么类型。
编辑器无法将对象识别为Object 以外的事物。

10. 当用Object 引用一个对象时,Object 是不能直接调用那个对象的,Object 本身不存在的方法的。编译器是根据引用
类型来判断有哪些方法可以调用,而不是根据 Object 确实的类型。就算你知道对象有这个功能,编译器还是
会把它当作一般的Object 来看待。编译器只管引用的类型,而不是对象的类型。

11. 探索内部Object 对象会从父类继承来的所有东西。这代表每个对象,不论实际类型,也会是个Object 的实例。
所以Java 中的每个对象除了真正的类型外,也可以当作是 Object 来处理。

12. Java 的接口就好像是100% 的纯抽象类。接口方法带有 public 和 abstract 的意义。这两个修饰符是属于
选择性的(我们是为了强调才把它们打出来的,实际上不需要。)
public interface Pet {

public abstract void beFriendly();
public abstract void play();
}
接口的方法是抽象的,所以必须以分号结束。他们没有内容。

13. 抽象的类可以带有抽象和非抽象的方法。实现接口的类必须实现它所有的方法,因为这些方法都是 public
与 abstract 的。

14. 编译器只会在我们完全没有定义构造函数的时候,才会设定默认的构造函数。‘

15. 在构建新对象时,所有继承下来的构造函数都会被执行。执行 new 的指令是个重大事件,它会启动构造函数
连锁反应。还有,就算是抽象的类也有构造函数。虽然不能对抽象的类执行 new 指令,但是抽象的类还是父类,
因此它的构造函数会在具体子类创建出实例时执行。构造函数在执行的时候,第一件事是去执行它的父类的构造
函数。(Constructor Chainning)

16. 如果有构造函数但没有调用super() 编译器会帮忙加的一定会是没有参数的版本,假使父类有多个版本,也只有
无参的这个版本会被调用。super 必须保证是第一条指令,不然编译器会报错。

17. 子类实例化的时候,当完成构造链的时候,父类没有对应的默认构造函数,提供默认的构造链完成机制,需要
显示的声明调用哪一个构造函数。

18. 使用 this() 来从某个构造函数调用同一个类的另一个构造函数。this() 只能用在构造函数中,且必须是第一
行语句。super() 与 this() 不能兼得。

19. 实例变量的寿命与对象相同。如果对象还活着,则实例变量也会是活的。局部变量只能在声明它的方法在执行中
才能被使用。当最后一个引用消失时,对象就会变成可回收的。

20. null 的真相。当你把引用设为 null时,Java 虚拟机会知道这是什么意思。对 null 引用使用 . 运算符会在执行
期遇到 NullPointerException 这样的异常。

21. Java 是面向对象的,但若出于某种特殊的情况下,通常是使用方法,则不需要类的实例。static
这个关键词可以标记出不需要类实例的方法。一个静态的方法代表说“一种不依靠实例变量也就不需要对象的行为。”

22. 静态的方法不能调用非晶态的变量。静态的方法是在无关特定的类的实例情况下执行的。如同你在上一页看到的
甚至也不会有该类的实例出现。因为静态的方法是通过类的名称来调用的,所以静态的方法无法引用到该类的
任何实例变量。在此情况下,静态的方法也不会知道可以使用哪个实例变量值。
静态的方法是不知道 堆 上有哪些实例的。

23. 静态的方法也无法调用非静态的方法。虽然可以使用引用变量代替类名称调用类的静态方法,但是不支持这样。
因为容易产生误解。降低程序的可读性。

24. 静态变量 它的值对所有实例来说都相同。被同类的所有实例共享的变量。

25. 静态变量会在该类的任何对象创建之前完成初始化。静态变量会在该类的任何静态方法执行之前就初始化。
静态变量的默认值,是该类型变量的默认值。

26. 静态的 final 变量是常量,常量的命名习惯是全部使用大写。final修饰类表示为最终类,不能为继承。修饰方法表示方法不能被覆盖。修饰变量
表示变量不能被修改。
final 类型的变量必须初始化,不在声明变量的时候初始化,也要在构造函数中初始化。

27. 如果类只有静态的方法,你可以将构造函数标记为 private 以避免被初始化。
final 的静态变量值必须在声明时或者静态初始化程序中复制:
final static int count;
static {
count = 0;
}

28. primitive 主数据类型的包装。当你需要以对象的方式来处理 primitive 主数据类型时,就把
它们包装起来。Integer、Character、Byte、Short、Boolean、Long、Float、Double。

29. 数字的格式化。Java 5.0 之前是通过 java.text 这个包来处理的。从 5.0 起,更过更好更有用的
扩展性的功能是通过 java.util 中的 Formatter 这个类提供的。无需自己创建与调用这个 class
上的方法,因为 java 5.0 已经把便利性的功能加到部分的输入输出类与String 上。因此只需要调用
静态的 String.Format() 并传入值与设定就好。
% 代表把参数放在这里 String.format("I have %.2f bugs to fix.", 47656.566);

30. 要取得当前的日期时间就用Date ,其余功能可以从 Calendar 上面找。Calendar 是一个抽象类。无法
取得Calendar 的实例,但是你可以取得他的具体子类的实例。

31. 静态的 import 。import static java.lang.System.out; import static java.lang.Math.*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值