安卓的很大一部分是Java,所以学好Java很重要。虽然现在可以用kotlin来编写安卓程序,但是毕竟是新东西,用起来谁知道会出什么问题,Java开发安卓已经这么多年了,他的根也那么深了,前人都已经做了那么多,我们当然也要用好轮子。
虽然大二这一年都学的是Java,但是进入工作室学习安卓,导师也会把Java的一些东西再给我们细讲一下。这一讲才发现,原来自己学的Java的基础知识太不牢固了。
1、A a = new A();这条Java语句的含义:
①左边那部分指的是声明一个叫a的对象;
②右边那部分指的是在计算机中分配一个内存空间(栈内存),并且初始化对象的成员;
③等于号指的是a变量指向所开辟的那个空间,即把对象的首地址赋给对象的引用变量。
2、对象的存储
内存空间分为堆和栈,当程序中发生方法调用时,为被调方法分配栈内存空间,用来存放被调方法的形式参数和局部变量。产生的对象放在堆里面
堆(Heap) 堆是个自由内存区域,常用于动态或临时内存分配,对类和数组对象提供内存。
栈(Stack) 栈存储方法调用的状态,如方法调用使用的任何局部变量和方法的操作数。
3、构造方法
①构造方法名与类名相同,并且是类的方法,不能通过对象引用来调用,创建一个类对象的同时,系统会自动调用该类的构造方法将新对象进行初始化。
②不能对构造方法指定类型,它有隐含的返回值,该值由系统内部使用;如果指定了类型,就不是构造方法。
③构造方法可以重载 ,可以定义多个不同参数的构造方法;构造方法可以继承。
④如果用户在一个自定义类中未定义该类的构造方法,系统将为这个类添加一个默认的空构造方法。构造方法与类的修饰符保持一致。
默认构造方法用默认值初始化对象的成员变量:
数值型 0
boolean false
char ‘\0’
对象 null
自定义构造方法:构造方法格式 [修饰符] 类名 (参数列表) ,修饰符可以是public、protected、缺省、private之一, 构造函数没有返回值,不能加void。
4、static
用static 修饰符修饰的域变量不属于任何一个类的具体对象,而专属于类。
其特点为它被保存在类的内存区(堆)的公共存储单元中,而不是保存在某个对象的内存中。
一个类的任何对象访问它时,存取到的都是相同的数值。
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。
用static修饰符修饰的方法称为静态方法,它是属于整个类的类方法,不属于类的任何对象。不用static修饰的限定方法,虽然在类中定义,但其实是为对象而定义。
static修饰的方法有如下特点:
①static方法是类方法,但可以被所有对象访问,引用这个方法时,可以使用对象引用做前缀,也可以用类名做前缀。
②static方法内部的代码,只能访问类中的static属性或方法,不能访问类中的非static属性或方法(属于对象的方法),但非static方法可以访问static成员或方法。
③main方法是特殊的静态方法。因为在程序开始执行时必须调用main() ,所以它被声明为static。
Static 变量优先于非Static 变量,不论出现顺序如何, Static {后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且是在类被第一次装载时。(Static(静态) 代码块)
5、初始化
成员初始化:
声明变量时未赋初值,自动获得一个缺省值。
一个变量本身是引用,初始化为得到为null ;一个变量是整形,初始化为得到 0 ;一个boolean, 初始化为得到false。
定义初始化:
定义数据成员的同时也为他其赋初值。
静态数据初始化:
静态数据成员只在这个类的第一个对象要创建的时候初始化。
初始化顺序:
① 定义初始化在先,构造函数在后
② 先做静态初始化、再做定义初始化、最后做构造函数
6、访问权限修饰词
public——对所有类可见
protected——对本包和所有子类可见
default(缺省)——对本包可见
private——仅对本类可见
7、继承类初始化和装载
初始化顺序:
① 先父类静态初始化,后子类静态初始化
② 先父类定义初始化、构造函数,后子类定义初始化、构造函数
例:
class Insect{
int i=9; //3
int j;
Insect(){ //4
prt("i="+i+",j="+j);
j=39;
}
static int x1=prt("static Insect.x1.initialization"); //1
static int prt(String s){
System.out.println(s);
return 47;
}
}
public class Beetle extends Insect{
int k=prt("Beetle.k initialized"); //5
Beetle(){ //6
prt("k="+k);
prt("j="+j);
}
static int x2=prt("static Beetle.x2 initialized"); //2
static int prt(String s){
System.out.println(s);
return 63;
}
public static void main(String [] args)
{
prt("Beetle constructor");
Beetle b=new Beetle();
}
}
static Insect.x1.initialization
static Beetle.x2 initialized
Beetle constructor
i=9,j=0
Beetle.k initialized
k=63
j=39
8、多态
Java中提供两种多态的机制: 编译时多态性(即重载overloading ) 运行时多态性(即覆盖overriding )
重载(overloading)
在一个类中定义多个同名而参数列表不同的方法,我们称这些方法是重载的。
参数列表不同: 数目不同 、类型不同、 顺序不同
在JAVA中,同名同参数但不同类型返回值的方法不是重载,编译不能通过。
覆盖(override)
方法的覆盖:方法名称相同、参数列表相同、返回类型相同
被final修饰的最终方法不能被覆盖
static方法只能覆盖为static方法,不能覆盖非静态方法, static方法也不能被非static方法覆盖。
子类的方法覆盖父类方法,必须提供与父类被覆盖方法相同或更大的访问权限