9、面向对象
(1)类:
[public | final | abstract] class 类名{}
类名驼峰,首字母大写
(2)Field:
[public | protected | private 、 static 、 final] 类型 名称 [=默认值];
Field名驼峰,首字母小写
用static修饰的Field属于类本身,没有static修饰的Field属于调用该Field的对象
static修饰类Field,并不是属于对象,而是属于类本身,当系统初始化类时,就会为类Field分配内存、并指定初始值。
而局部变量则必须由程序员显式的赋值,否则将无法使用。
(3)方法:
a)、构造方法
[public | protected | private] 构造方法名(参数){}
this关键词有两个作用:
1. this引用 —— 如果在构造器中,代表构造器正在初始化的对象。
如果在方法中,代表正在调用该方法的对象。
this引用总是代表该类的实例。
2. this调用:
只能用在构造器、而且必须是构造器中第一条代码。
this调用总是调用当前类中重载的构造器。this调用到底调用哪个构造器,取决于传入的参数值。
b)、普通方法/抽象方法
[public | protected | private 、 abstract 、 final 、 static] 返回值类型 方法名(参数){方法体}
方法名驼峰,首字母小写
用static修饰的方法(静态方法)属于类本身,没有static修饰的方法属于调用方法的对象
方法的形参可变参数:public void test(String... str){}
其类似于:public void test(String[] str){}
Java方法的参数传递机制:值传递
方法重载:方法名相同,形参列表不同。Java里不能使用方法返回值类型作为区分方法重载的依据。
(4)this关键字:this关键字总是代表调用该方法的对象,this不能用在有static修饰的方法中.
(5)封装
private 本类访问权限
默认 包访问权限
protected 子类访问权限
public 公开访问权限
javadoc默认只提取public、protected的文档注释
(6)包
定义包 package 包名
导包 import 包名.类名
Java默认会 import java.lang.*;
静态导包(代码中可以省略类名)import static
(7)继承
父类、子类
方法的重写(@Override):
方法名相同,参数列表相同
返回值相同或更小,异常类型相同或更小
访问权限相同或更大
super关键字:super限定、super调用(父类构造器)
super调用只能在构造器用,而且必须位于第一行,不能与this调用同时出现
子类构造器总会调用父类的构造器。
当父类没有无参数的构造器时,子类的构造器中【必须显式】的用super调用父类有参数的构造器。
否则:子类构造器会自动(隐式)调用父类无参数的构造器——必然导致找不到构造器的错误。
(8)多态
对于一个引用变量来说,可以认为有两个类型:
1. 编译时类型。声明该变量时所用的类型,就是编译时类型。
对于编译器来讲,编译器只管变量的编译时类型,与运行时类型无关。
2. 运行时类型(实际类型)。该变量实际所指向的对象的类型,就是运行时类型。
(9)初始化块
[static]{}
非静态初始化块经编译后放入构造方法
静态初始化块只在类第一次使用时加载,因此只有一次执行机会
(10)包装类(Wrapper Class)
java提供了八个基本数据类型的包装类和自动装箱、拆箱(1.5+)
包装类缓存:
Boolean:(全部缓存)
Byte:(全部缓存)
Character(<= 127缓存)
Short(-128 — 127缓存)
Long(-128 — 127缓存)
Float(没有缓存)
Doulbe(没有缓存)
总之就是缓存-128 — 127的内容
import java.util.ArrayList; public class WrapperClass{ //Integer自动装箱 public WrapperClass(){ ArrayList<Integer> arrayList=new ArrayList<Integer>(); arrayList.add(100); } //a=100,b=100 => a==b (因为Integer缓存) //a=200,b=200 => a!=b public void test(Integer a,Integer b){ if(a==b){ System.out.println("a==b"); }else{ System.out.println("a!=b"); } } }
同时对于垃圾回收来说
Integer i = 100; i = null;//这里的代码不会有对象符合垃圾回收器的条件,这儿的i虽然被赋予null,但它之前指向的是cache中的Integer对象,而cache没有被赋null,所以Integer(100)这个对象还是存在。