概述:
Java是完全OOP语言,最外层实体永远只能是对象(类其实也是特殊的对象而已),所有的属性或方法最外层都只能通过对象来引用,所有的实例方法都默认且只能是虚方法;入口点为:
1 public static void main(String[] args);
基本数据类型:
Java提供了8种基本数据类型:
4种整形: byte short int long 长度分别为1字节、2字节、4字节、8字节
2种浮点型: float double 长度分别为4字节、8字节
字符型: char Unicode代码点(一般为2字节)
布尔型: boolean 值只有true和false两个
注:void呢?C中void主要有两种用途,第一种用于表示函数什么都不返回,Java中与之一致;第二种用于表示无类型指针void *,java中显然不需要使用了。至于数组,字符串
都是类类型。
标识符规则:字母开头,由字母和数字组成的序列。
变量: 基本类型变量 对象引用
运算符:
java中运算符与C++类似,注意一下几点:
1. 逻辑运算符只能应用于布尔型变量,其中&&和||表示短路方式,&和|表示不短路方式。
2. 位运算符中,>>表示算数右移动,>>>表示逻辑右移
3. 强制类型转换:最好不要在字符型和其他类型之间转换,永远不要在布尔型和其他类型之间转换
4. 没有delete,因为有垃圾收集嘛
控制流程与C基本一致,需要注意的是:
1. 分支条件只能是布尔型
2. switch条件可以是字符串(编译时会将其进行转换和其他必要处理),枚举常量,整形和字符型及其包装器(long不行)
类是对象的描述,它描述了对象的属性和行为等元信息;而类本身也是一种对象,姑且称为类对象,因而一个实例对象的元数据就存储在它对应的类对象,类对象就是该类在运行时
的实际表示,类中的static 成员实际上就是这个类对象的属性和方法了;那么所有的类对象又是什么类型的实例变量呢,那就是Class<T>,因而最终归结为这么个东西,那么这个
类在运行时又怎么表示呢?显然它是终极Boss,只需要一个对象来存储这个类的元信息就可以了,那么这个唯一对象的类是啥呢?还是Class<T>,因为这时无所谓知道它的类型了
,而且也不会继续递归下去,因为就在这两者之间循环往复了,或者干脆让这个Boss对象没有类型也就完了,因为这都在虚拟机管理范围了,虚拟机知道这个Boss对象本身的布局
就可以了。
OK,除了基本类型变量,Java中就只有对象了,对象的类型是类。
注:
1. Java中的所有类有一个唯一的祖先同志是Object
2. 类本身有两种访问控制:public > (default)
类成员有四种访问控制:public > protected > (default) > private 值得关注的是成员的访问权限是基于类的
3. 访问器和更改器:不要编写返回引用可变对象的访问器方法,而应该返回一个副本
4. static成员是类对象本身的成员,通过类引用,也就是通过类对象引用
5. Java的所有的参数传递都是值传递,Java的引用更类似C++的指针,这从其默认多态方法也能看出来,一个子类对象的引用能赋值给一个父类对象的引用。
6. Java的final不同于C++的const,final用于类表示最终类,不允许再被继承;final用于属性,表示不可变属性;final用于方法,表示不可override的方法。
7. this的使用:引用对象自身;调用本类另一个构造器
8. super的使用:编译器期符号,用于调用父类方法;调用父类的构造器
9. a instanceof B表示测试a是否是B及B的子类的实例或实现了B接口的类及其子类的实例
10. abstract用于类表示类是抽象类,抽象类不能实例化;abstract用于方法表示方法是抽象方法,表示方法未实现。
11. 常量的定义方式通常是public static final
12. 初始化问题:类加载时,默认初始化所有static属性,然后执行定义初始化,最后执行static初始化块;new对象时,默认初始化对象属性,然后执行定义初始化,然后执行
初始化块,最后执行构造器(如果存在继承,按类层次从上往下依次执行)
13. Java是单继承的
14. 不能多继承,交互上存在问题咋办?-----接口,接口可以看成是所有方法都是public abstract方法的抽象类,但是一个类可以实现多个接口,因此,接口是作为协定存在的,
它是为了让类之间交互而规定的协约,任何遵守这个协约的类之间就都可以交互了;把接口用于回调也是很自然的了,想想C++中的仿函数,C++中通过函数调用运算符
重载隐式的规定了协议,而Java中使用接口显式的规定协议。
接口中声明的所有方法都是public abstract的,所有属性都是public static final的
15. 为什么使用内部类?
可能有三种理由:第一种是,对同一个包中的其他类隐藏起来;第二种是内部类可以访问外围类的任何属性;第三种是用于回调。
内部类分为以下三种:静态内部类;对象内部类;局部内部类(包括匿名内部类)。