1.类 / 对象 / 方法
--类是定义对象的模板,指定了数据及操作数据的代码(类是一系列指定如何构建对象的计划)
--对象是类的实例,类的对象被创建时,内存中才会有类的物理表示
--组成类的方法和变量都称为类的成员,数据成员也称为实例变量
--类可能只包含方法,或只包含实例变量,大多数两者都包含
--当一个类是程序运行起点时,才需要定义main()方法
--可使用点运算符来访问实例变量和方法 object.member
--每个对象都有由类定义的成员副本
--创建对象,如Vehicle minivan = new Vehicle();
--将一个基本类型的变量赋给另一个变量时,等号左边的变量接收等号右边变量值的副本
--将一个对象引用变量赋给其他对象引用变量时,在改变引用变量所引用的对象
--方法:ret-type / void name(parameter-list){ //body of method }
当为ret-type时,方法体最后需有对应于该返回类型值的return语句;
当为void时,返回方式有两种:到达花括号或执行 return; 语句
--形参: 定义方法时方法名后的圆括号中声明的参数 实参:调用方法时向方法传递的值
--构造函数:在创建对象时初始化对象(初始化类定义的实例变量),与类同名,无显示的返回类型
--所有的类都有构造函数,java会自动提供一个默认构造函数(无形参构造函数),默认值0,null,false(数值类型,引用类型,布尔类型),一旦定义了自己的构造函数(带形参构造函数)就不会使用默认构造函数
--垃圾回收:当不再对某对象进行引用时,该对象就被认定为没有存在的必要,它所占用的内存就要被释放。被回收的内存可用于以后的分配。
--包: 存放和管理类的路径,所有的类都属于某个包,若无,则使用默认包(无名称) package pkg;
一个包定义了一个名称空间,因此里面的类的名称就成为了该包名称空间一部分
包名通常小写 导入包 import mypack.MyClass; import mypack.*;
--成员的访问控制通过使用访问修饰符来实现
public:包内包外都可访问
private:仅对它所属的类中的其他成员访问
protected:对其所属的包和其全部子类(包括其他包中的子类)都可访问
默认:包内访问,包外不可访问
--当向方法传递基本类型时,传递的是值,因此创建实参的副本,无论形参作何改变都不会对方法以外实参产生影响
当向方法传递引用时,接收引用的形参和实参会指向同一对象,方法内部对对象的修改就会影响作为实参的对象
--方法重载:同一个类中两个或多个方法的方法名相同,形参声明不同(形参类型和数量),则为方法重载
方法重载是java实现多态性的途径之一
--继承:允许创建类层次结构。被继承的类称为超类/父类,继承类称为子类。子类是超类具体化版本,子类继承了超类定义的非private变量和方法,并添加自己独有的元素,继承关键字extends
--超类的构造函数构造对象的超类部分,子类的构造函数构造对象的子类部分
在类的层次结构中,构造函数的调用是按照继承的顺利,从超类到子类来进行的
--super:子类可使用super调用超类构造函数,并且super须在子类构造函数中执行第一条语句
AA(double w, double h){} (超类) BB(String s, double w, double h){ super(w, h); style = s} (子类)
引用子类的超类 super.member,多用于子类的成员名隐藏了超类中同名成员的情况
--this:引用子类(本类)
--方法重写:在类层次结构中,子类的方法和超类方法有相同返回类型和签名时,则子类的方法重写了超类的方法
当在子类中调用被重写的方法时,总是引用子类中被定义的方法,超类中的方法将被隐藏
方法重写使java支持运行时多态性
--递归:方法可调用自身,这个过程称为递归。调用自己的方法称为递归方法
--static: 定义类成员,其使用与任何对象无关,访问(类名.成员),声明static的变量都是全局变量
--varargs方法:可变长度实参的方法。varargs方法的形参列表的长度可变,数量不固定,因此,varargs方法可接受可变数量的实参
static void vaTest(int ... v){ } v隐式声明为一个int[]类型数组
--final:防止重写,防止继承,对数据成员使用final创建常量
--Object类:所有类的隐式超类
2.抽象类和接口
--抽象类:该(超)类只定义一个为所有子类共享的一般形式,不提供一个或多个方法具体实现,具体实现由每个子类去实现
--关键字 abstract,超类中抽象方法无方法体,不能使用,无法被超类实现,这样子类必须重写它
abstract type name(parameter-list);
--abstract只能用于实例方法,不能用于static方法或构造函数
--包含一个或多个抽象方法的类必须声明为抽象类,抽象类不能实例化对象
--子类继承抽象类时,必须实现超类中的所有抽象方法。否则,该子类也要定义为抽象类
--接口:以interface声明,抽象方法的集合。接口无法被实例化,但是可以被实现 implements
--除非实现接口的类是抽象类,否则该类要定义接口中的所有方法;一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类
--接口没有构造方法,接口中所有的方法必须是抽象方法,接口支持多继承
--接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
--一个类只能继承一个抽象类,而一个类却可以实现多个接口
3.java面向对象的三个特性--封装、继承和多态
--封装:一种将类的代码和数据结合起来,不被外界干扰滥用的程序设计机制
理解封装的一种方法是将它看作一个保护屏障,防止该类的代码和数据被外部类定义的代码随意访问,而要访问该类的代码和数据,须通过严格的接口控制
封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段
封装优点:减少耦合,类内部结构可自由修改,控制成员变量,隐藏信息,实现细节
java的基本封装单元是类
--继承:继承就是子类继承父类的特征和行为,使得子类对象具有父类的非private实例域和方法,同时子类可对父类进行扩展,重写父类方法
允许创建分等级层次的类
java的继承是单继承,但可以多重继承
提高了类之间耦合性
--多态:多态就是同一个接口,使用不同的实例而执行不同操作
多态性是对象多种表现形式的体现
多态存在的三个必要条件:继承,重写,父类引用指向子类对象
多态实现方式:重写,重载等