一、类和对象的关系
类是对象的抽象,不占用内存,表示群体概念,它是一组具有相同属性和方法的对象的集合;
对象是类的具体实例,用来描述客观事物的一个实体,由一组属性和方法构成,表示个体概念,具有唯一性和独立性,占用存储空间。
二、面向对象和面向过程
两者都是软件开发思想,先有面向过程,后有面向对象。在大型项目中,针对面向过程的不足推出了面向对象开发思想。
①编程思路不同: 面向过程以实现功能的函数开发为主,而面向对象要首先抽象出类、属性及其方法,然后通过实例化类、执行方法来完成功能。
②封装性:都具有封装性,但是面向过程是封装的是功能,而面向对象封装的是数据和功能。
③面向对象具有继承性和多态性,而面向过程没有继承性和多态性,所以面向对象优势是明显。
三、方法重写与重载的关系
方法重载:同一个类中,方法名相同,参数列表不同,与修饰符、返回值、抛出异常都无关。
方法重写:存在继承关系的两个类中,方法名相同,参数列表相同,修饰符不能严于父类,返回值、抛出的异常要么和父类相同、要么是其(父类的)子类。
四、类的构造方法
构造方法:专门用于构造对象,通常和new搭配使用。构造方法在形式上没有返回值(实质上返回this),方法名和类名一致。构造方法分为有参构造方法和无参构造方法。
1、若在类中没有显示的定义无参构造方法,jvm默认给该类分配一个无参构造。无参构造方法用于在构造对象时给对象赋值默认的初始值。
2、若类提供了有参构造,jvm不在给该类分配无参构造。因此,我们需要为类提供无参构造。
五、this和super
1、this是对象内部指代自身的引用,本身是一个地址
①this可以调用成员变量,通常用于解决成员变量和局部变量同名冲突
② this可以调用成员方法
③ this可以在构造方法中调用重载的构造方法,且必须是构造方法的第一条语句。
2、super代表对当前对象的直接父类对象的引用,本身无含义
①super可以调用直接父类的成员变量(注意权限修饰符,比如不能访问private成员)
②super可以调用直接父类的成员方法(注意权限修饰符,比如不能访问private成员)
③super可以调用直接父类的构造方法,只限构造方法中使用,且必须是第一条语句
六、static关键字(修饰变量、方法、代码块和内部类)
1、static属性属于这个类所有,即由该类创建的所有对象共享同一个static属性。对象名.属性名和类名.属性名(推荐)来访问。
static变量和非static变量的区别(都是成员变量,不是局部变量)
①不管有多少个对象,static变量只有1份。对于每个对象,非static变量都会有单独的一份
②静态变量存在方法区中, 实例变量存在堆内存中
③静态变量:对象名.属性名和类名.属性名(推荐)来访问,实例变量: 对象名.变量名访问
④静态变量:当jvm加载字节码时在方法区分配空间,实例变量:创建对象的时候在堆区分配空间。
2、static方法也可以通过对象名.方法名和类名.方法名(推荐)两种方式来访问。
①静态方法不能访问实例变量、this、实例方法(静态成员比实例成员先分配空间)
②实例方法可以访问静态变量或者静态方法
3、static代码块。当jvm加载字节码时执行静态代码块,且只被执行一次,主要作用是实现static属性的初始化。
4、static内部类:属于整个外部类,而不是属于外部类的每个对象。不能访问外部类的非静态成员(变量或者方法),可以访问外部类的静态成员
七、代码块
代码块{ } 在java中可以分为普通代码块、构造代码块、静态代码块、同步代码块。
1、普通代码块就是作用域块。作用域嵌套和作用域链。
2、构造代码块在类的内部,构造方法的外部定义。通过{ }定义。构造代码块先于构造方法执行;构造代码块构造一个对象,执行一次。
3、静态代码块在类的内部,方法的外部定义。通过static{ }定义。静态代码块在类加载时只执行一次; 静态代码块先于构造代码块、构造方法执行;静态代码块不能访问实例成员。