1、类
类比成“图纸”。
对事物、逻辑、概念、算法的抽象。
将相关的数据、算法代码进行封装,封装在一个类内部,形成一个独立的程序组装件。
2、对象、实例
类必成“产品”。
从类创建出的具体实例。
每个对象都是独立的,都占用独立的内存空间。
3、引用
类比成“遥控器”。
引用保存一个实例的内存地址。
引用的特殊值null,表示不引用任何实例的内存地址。
4、构造方法
特殊的方法,在新建实例的时候执行。
如果不编写构造方法,编译器编译代码时,会添加默认的构造方法。
public class Light{
public Light(){
}
}
构造方法可以重载。(所谓重载就是“同名不同参”)
public class Light{
public Light(){
}
public Light(int color){
}
public Light(boolean on){
}
public Light(int color,boolean on){
}
}
5、this
可以引用成员。this是一个特殊的引用,保存当前对象的内存地址。例如:this.name this.age this.gender
可以用在构造方法之间的互相调用。方式:this(); 注意必须是构造方法的首行代码。
Class A{
public A(a){
this(a,null,null);
}
public A(a,b,c){
this(a,b,c,null);
}
public A(a,b,c,d){
所有参数集中在此处处理。
}
}
6、继承、扩展
作用:代码复用。
一个类只能继承一个父类。一个父类可以有多个子类。
子类可以从父类继承有访问权限的成员。没有访问权限的成员不能继承,也不能继承构造方法。
1>创建子类实例的过程
(1)先创建父类实例,执行父类构造方法。
(2)在创建子类实例,执行子类构造方法。
(3)两个实例绑定在一起,作为子类实例。
(4)当调用成员时,会从子类到父类实例查找成员。
2> 创建子类实例时,构造方法执行
(1)先执行父类构造方法,默认执行父类无参构造方法,super();//会隐含调用这个
(2)也可以手动调用父类有参构造方法,使用super(传递参数);来调用
3>super
如果想要在子类构造方法中调用父类的构造方法,可以复用父类的构造方法。
方法是:super();//隐含调用
super(传递参数);//手动调用
注意:在使用super的时候必须是子类构造方法的首行代码。
3>override
如果从父类继承的方法不适用于子类,在子类中可以重写编写这个方法。
7、多态
作用:一致的类型
类型转换:
1>向上转型
子类实例转为父类型。向上转型后,只能调用通用成员,不能调用子类的扩展成员。
2>向下转型
转为父类型的子类实例,在转回它的真实类型。
运行期类型识别
instanceof
对一个实例的真实类型及其父类型判断都得到true,也就是说Father son = new Son(); 其中son instanceof Son 得到true,son instanceof Father也得到true。
8、抽象类(abstract)
作用:提供通用代码或者通用方法的定义
是一个半成品,不能创建实例。
注意:包含抽象方法的类必须是抽象类。但是抽象类中不一定有抽象方法。
9、final关键字
可以用来修饰变量,方法,类
1>修饰变量时变量的值是不可变的,称为“常量”
final int a = 100;如果在编写a = 20;编译器会报错,不能对修改常量的值。
final Son s = new Son(10,"boy");
s.age = 12;//这样是对的,可以修改对象的值,但是如果这样 s = new Son(12,"boy");这样就不对了
总结:基本类型值本身不可变;对于引用类型(对象),保存的内存地址不可变。如果对成员变量加final,那么没有默认值。
2>修饰方法时,不能在子类重写(编译器会报错)
3>修饰类时,不能被继承,也就是说没有子类(编译器会报错)
10、static静态
1>静态成员属于类,不属于实例;
2>访问静态成员时,允许使用实例调用静态成员,但是应该使用类名去调用;Utils.print
3>静态的使用场合
(1)原则是:能不用就不用
(2)使用场景:
<1>共享的数据Integer.MAX_VALUE,Math.PI等等
<2>工具方法
Integer.parseInt();String.valueOf();Math.pow();
(3)对于static修饰的代码块,在代码块中不能调用非静态成员。
class A{
int a =10;
static int b = 20;
void f1(){
a
b
f2();
}
static void f2(){
b
//a不能用
//f1();不能用
}
}
11、对象创建的过程
Class A{
int a = 10;
static int b = 20;
public A(){
}
}
class B extends A{
int c = 30;
static int d =40;
public B(){
}
}
B b = new B():
创建B实例的过程:
1>加载父类A,为父类的静态成员变量分配内存
2>加载子类B,为子类静态成员变量分配内存
3>为父类A的静态成员变量赋值
4>为子类B的静态成员变量赋值
5>为父类A实例分配内存,为父类A的非静态成员变量分配内存
6>为子类B实例分配内存,为子类B的非静态成员变量分配内存
7>为父类A的非静态成员赋值
8>执行父类A的构造方法
9>为子类B的非静态成员赋值
10>执行子类B的构造方法
12、String、StringBuffer、StringBuilder
其中String是常量,使用String定义的字符串不能改变,实际中每次对于String的操作都会创建一个新的对象。
StringBuffer是线程安全的。
StringBuilder是线程不安全的。
备注:想要获取一个对象的内存地址,可以获取改对象的hashCode();默认情况下,hash值及对象的内存地址。
13、Thread
Thread是程序执行的最小单元,它是分配CPU的最小单位。可以用Thread来执行以下异步操作。
Thread的运行是独立于Activity的,当Activity被finish后,如果没有主动停止Thread或者Thread里面的run方法没有执行完毕,Thread也会一直执行。