1、类和对象
- 定义类:
[修饰符] class 类名
{
零到多个构造器定义...
零到多个成员变量...
零到多个方法....
}
修饰符可以是public、final、abstract,或者省略,类名一般由有意义的一个或多个单词组成,每个单词首字母大写,其余字母小写,不使用分隔符。
static修饰的成员不能访问没有static修饰的成员。
static修饰的方法和成员变量,既可以通过类来调用,也能通过实例调用,没有static修饰的只能通过实例调用
使用static修饰的方法、成员变量等表示它属于这个类本身,而不属于该类的单个实例。
(1)定义成员变量:
[修饰符] 类型 成员变量名 [= 默认值];
成员变量的修饰符可以是public、protected、private中的一个,或者省略,以及final、static的组合。命名采用驼峰法
(2)定义方法:
[修饰符] 方法返回值类型 方法名(形参列表)
{
方法体
}
方法的修饰符可以是public、protected、private中的一个,或者省略,以及final、static的组合。
命名采用驼峰法,第一个单词建议动词
(3)定义构造器:
[修饰符] 构造器名 (形参列表)
{
构造器执行体
}
构造器的修饰符可以是public、protected、private,或者省略。
不写构造器的话将使用系统默认的构造器
构造器名必须和类名相同
构造器隐式返回该类的实例 - 对象、引用、指针 :
如:Person p = Person(); 创建了一个Person的实例,p是该实例的引用。p存储的是指向Person的地址,存放在栈空间中,Person实例存放在堆空间中。 一个对象被创建成功后,保存在堆空间中,不能直接访问堆空间中的对象,只能通过该对象的引用操作该对象。一个对象可以有多个引用,指向同一个对象。如果堆内存里的对象没有任何引用,程序将无法在访问该对象,垃圾回收机制会回收该对象,释放该对象所占内存。因此希望回收某个对象时,只需把其所有引用负值为null。 - 对象的this引用:
this关键字总是指向调用该方法的对象。谁在调用这个方法,this就指向谁。在一个成员方法或构造器内部调用其他方法须使用this。如果方法或构造器内的局部变量不与成员变量明相同,则可以省略this。static修饰的方法(如main方法)不能使用this,如果需要调用其他成员方法,只能新建一个对象。
2、方法详解
Java里的方法不能独立存在,所有的方法都必须定义在类里,方法在逻辑上要么属于类,要么属于对象。
- 方法的所属性:
方法必须定义在类里,如果该方法使用的static修饰,则该方法属于这个类,否则属于这个类的实例。
执行方法时必须使用类或对象来作为调用者(“类.方法”、“对象.方法”)
那些看起来没有对象直接使用的方法,其实是省略了this
所以,方法的所属性主要体现在下面几个方面:
(1)方法不能独立定义,只能在类体里定义。
(2)从逻辑意义上看,方法要么属于该类本身,要么属于该类的一个对象。
(3)永远不能独立执行方法,指向方法必须使用类或对象作为调度者。 - 方法的参数传递机制:
Java里的参数传递方式只有一种:值传递
当传递的参数是引用类型(对象)时,实际上传进方法内的是指向这个堆空间内对象的地址,也就是说,在这个方法内对该对象赋值为null,只要该对象在其他地方有引用,堆空间内的该对象就不会被销毁。
- 形参个数可变的方法:
在参数类型后加... 即可传入个数可变的形参,如:
setName(String... names)
setName("张三","李四")
传进来的参数为数组,可变形参只能放在形参列表最后。 - 递归:
在一个方法中调用方法本身称为递归,递归必须在某次执行方法时能得到确定的值,即不再调用自己本身,否则会进入死循环。 - 方法重载:
Java允许一个类定义多个形参列表不同的同名方法,称为重载。
判断两个方法是否属于一个重载的唯一标准是两个方法同名且形参列表不同。
3、成员变量和局部变量:
变量包括:
1.成员变量:
(1)实例变量(不以static修饰)
(2)类变量(以static修饰)
2.局部变量:
(1)形参
(2)方法局部变量(在方法中定义)
(3)代码块局部变量(在代码块中定义)
同一个类不同实例访问类变量时,都是访问同一个类变量。
不建议使用实例来访问类变量,应替换成使用类来访问类变量,两者完全等价。
局部变量必须经过初始化才能使用,而成员变量则不用,因为成员变量在类创建的时候已经初始化了。
4、隐藏和封装:
- 封装:对象成员变量隐藏起来,只能通过对象的方法来访问和修改 。
- 访问控制符:
private:当前类访问权限,一般用来修饰成员变量。
default:包访问权限,可以被相同包下的其他类访问。
protected:子类访问权限:可被相同包下的其他类和不同包的子类访问。
public:公共访问权限。
没有处于任何类的内部的类称为外部类,外部类只能用public和default修饰。
- package、import、import static
定义包名后可直接使用同一包下的类。
使用import导包后可省略包名。
使用import static导入类变量后可以省略类名。
5、构造器:
如果一个构造器A的参数列表完全包含另一个构造器B,则可以对在A内重载B,且必须放在构造器内第一句。如:
Apple(String name,String,color)
{
this.name = name;
this.color = color;
}
Apple(String name,String,color,double weight)
{
this(name,color);
this.weight = weight;
}
6、继承:
一个类通过extends关键字继承。
一个类只有只能继承自一个直接父类,但可有多个间接父类。
父类的private修饰的方法子类无法调用。
- 重写(override):子类重写父类方法要求方法的方法名、形参列表相同,且须同为类方法或实例方法。
- super:要在子类中调用父类被覆盖的实例方法或构造器,使用super.XXX();
- 子类强转成父类使用(Parent)。
7、多态:
Fruit apple = new Apple();
Fruit为编译时类型,Apple为运行时类型。当两者不一样时,则发生了多态。
如果Apple类中重写了Fruit的方法,则调用实例apple的该方法时将执行Apple中写的方法,否则调用Fruit中重写的方法。
Apple中有而Fruit中没有的方法,实例apple不能调用。
实例变量不存在多态。
- instanceof的用法:
instanceof用于判断一个引用变量是否是某个类的实例。在强转之前判断可行性。如:
Fruit fruit = new Apple();
if(fruit instanceof Apple)
Apple apple =(Apple) fruit;
第二个参数必须是引用变量的编译时类型的父类或子类或同类,否则会报错。 - 初始化块:
对类的一些成员变量进行初始化,而又不需要传参进来,则可以使用初始化块。
初始化块的用法:
[修饰符]{
//初始化操作
}
其中修饰符为空或static,当为static时,为类初始化块,否则为实例初始化块。
创建一个类的多个实例时,如:
Apple a = new Apple();
Apple b = new Apple();
类初始化块只执行一次,而实例初始化块会执行两次(本例)。