第五章、对象
类:
类是创建对象的模板
是客观存在的事物在人脑中的主管反应
是大量对象共性的抽象
静态代码块
public class A{
//静态代码块,在类加载将类加载到虚拟中时直接执行
static{}
//动态代码块,在创建对象时先构造方法执行
{}
}
类修饰符
只能使用public和不写(默认)修饰类,且一个类中只能将一个类得权限修饰符定义为public且此类名要与文件名一致
动态代码块
静态方法(使用static修饰的方法):
类特有的方法,通过类名调用
对象:
万物皆对象,万物皆依赖对象
成员:
属性(属性类型可以是常见和引用类型,例如数组、对象,也可以是八种基本数据类型)、方法
方法重载:
方法名相同,但是参数(类型,个数,顺序)不同
可变参数:
参数使用(类型 … 变量名)表示
构造方法(无返回值类型的方法):
使用(修饰符 类名)构造,可以重载,可以私有化
特点:
没有创建构造方法时,系统自动创建一个无参构造方法
当创建了构造方法时,系统不会自动创建构造方法
在构造方法中可以调用其他的构造方法(使用this()调用,但是只能调用一次,且此调用必须放在最前面)
作用:
创建对象,并为对象赋初始值,如果在构造方法里面要调用构造方法,只能使用this调用且只能放在第一行
this:
当属性和局部变量冲突时,使用this可以避免冲突
关键字
static:
特性:
一旦成员被static修饰,则此成员为类成员(静态成员)
使用:
静态成员只能访问静态成员
非静态成员可以访问所有成员
final:
特性:
final修饰变量或是属性名
一旦使用fianl修饰,则变为了常量
一定要初始化,
全部字母大写
一般使用final修饰的成员也是用static修饰
final修饰方法
被修饰的方法不能重写,不可以修饰抽象方法
final修饰类
被修饰的类不能可以被继承,不可以修饰抽象类和接口
extends
特性:
继承关键字,在前面的为子类,在后面的为父类(子类继承父类)
可以继承父类的成员(除了构造方法和私有成员)
一个子类只能由一个父类,一个父类可以有多个子类
如果没有显示继承,默认继承java.lang.Object类
注意
(虽然属性无法继承,但是可以通过父类的get,set方法取访问这些属性)
四种权限修饰符的访问、继承范围
权限修饰符(public>protected>default>private)
public:
访问范围:任何地方都可以访问。
继承范围:任何子类都可以继承。
protected:
访问范围:本类内部、同包下的其他类可以访问,非同包下的其他类无法访问。
继承范围:任何子类都可以继承。
(default:)
访问范围:本类内部,同包下的其他类可以访问,非同包下的其他类无法访问。
继承范围:同包下子类可以继承,非同包下的子类无法继承。
private:
访问范围:本类内部可以访问。
继承范围:任何子类都无法继承。
本类 | 本包 | 子类 | 其他包 | |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
访问范围 | 继承范围 | |
---|---|---|
private | 本类内部 | 不能继承 |
default | 本类和本包 | 本包的子类 |
protected | 本包和子类 | 子类都可以继承 |
public | 所有范围 | 所有范围 |
super
调用父类的成员,调用父类的构造方法super();(给父类初始化对象的属性)
调用父类的其他成员使用super.成员
方法重写:
使用@Override(给电脑看的注释)
必须和父类的返回类型、方法名、参数一致,
权限修饰符可以不同但是一定要扩大范围(例父类是default,则子类的修饰符只能为Protected或是public)
多态
发消息给这个对象,让对象自己决定采用哪种方式相应这个消息
将子类自动向上转型,
子类对象赋值给父类引用
只能调用父类的方法
前提
发生了继承
方法进行了重写
类型向上转换
作用
提高代码的可重用性,降低模块间的耦合度
抽象
如果是不具体的时候可以定义为抽象的,使用abctract修饰,不需要方法体
public abstract area();
如果一个类中有抽象方法,那么这个类一定要定义成抽象类
但是抽象类可以没有抽象方法
抽象类不可以创建对象,但可以作为引用
Person per = new Student();//Person为抽象类,Student为具体子类
抽象类如果被继承,那么子类想要实例化则必须重写父类的抽象方法,不然为抽象类,无法实例化
抽象类和抽象方法不可以被final修饰
属性不可以被abstract修饰
抽象类有构造方法
接口
接口中的方法都是抽象方法
接口中方法的abstract修饰符可以省略不写
接口中的权限修饰符只能是public或是default
接口中的属性为静态常量,static和final可以省略不写
接口使用interface类型,
接口使用implements实现使用
接口可以单继承多实现
接口间可以多继承
接口不能有构造方法
jdk8之后
接口中可以有静态方法
接口中不能有静态代码块
可以有默认方法
jdk9之后
可以有普通和静态私有化方法
默认方法
使用default修饰的方法,default修饰符要写出来,可以在接口里面写方法体的方法
default void add(){}
instanceof判断真实类
shape instanceof Circle
如果后面是一个范围更大的类或是接口,即(父类或是父接口)则也为真
public class A extends M implements B,C{}
A a = new A();
if(a instanceof M){}
if(a instanceof B){}
if(a instanceof C){}
//都为真
例如学生类是人类的子类,是微生物的子类(但是instanceof后跟的是学生类、人类、微生类也为真)