类与对象
1 概述
Java是一门面向对象的语言,大致意思就是Java是由一个个对象调用一个个对象所属类的属性,方法来达到执行任务的目的。
Java面向对象三大特征:封装性、继承性、多态性
一个Java程序要运行大致包括以下几块:
1.1 需要一个或多个Java类以及类的成员
包括:属性、方法、构造器、代码块、内部类
1.2 通过所提供类的构造器来创建类的对象
如果类的内部没有构造器,则默认为空参构造器,如果构造器需要形参,则需要传入对应的形参
1.3 用创建的对象去调用类的属性、方法
当你成功创建了一个对象之后,你就获得了一个对象。但是注意,你不仅仅获得的只是这个对象,你还获得了这个对象对应的所有属性,方法,代码块,内部类。并且你每创建一个对象,都会获得与其他对象独立的属性,方法,代码块,内部类。正是因为你获得了这些,你才可以去调用这个对象的内部结构。
2 属性
2.1 概述
定义属性的格式:权限修饰符 数据类型 变量名 = 变量值;
属性是Java类内部定义的,可以由public,protected,缺省,private权限修饰符修饰,一般由private修饰的属性只能在当前类内部调用,所以一般会提供get,set方法以便外部调用,缺省和protected不常用,public是权限最大的权限修饰符号,可以在整个工程文件下进行调用。
2.2 初始化值
类的属性,根据其类型,都默认初始化值。
整型(byte、short、int、long : 0)
浮点型(float、double : 0.0)
字符型(char : 0 )
布尔型(boolean : false)
引用数据类型(类、数组、接口 : null)
2.3 和局部变量的区别
区别于局部变量(声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量),局部变量是没有默认初始化值的,所以在创建时就要进行显示赋值。
属性在内存中创建时是加载到堆空间中的,而局部变量则是加载在栈空间中的
3 方法
4 构造器
4.1 构造器的作用
构造器主要是用来初始化对象信息的,但是在单例模式中,构造器还可以创建对象
4.2 使用说明
定义构造器的格式:权限修饰符 类名(形参列表){
}
一个类中至少会有一个构造器,如果没定义类的构造器的话,则系统默认提供一个空参的构造器,但是一旦我们定义了类的构造器之后,系统就不再提供默认的空参构造器
5 类的继承性
5.1 概述
类的继承减少了代码的冗余,提高了代码的重复利用性,并且为多态性的使用提供了前提
5.2 继承性的格式
class A extends B{}
A:子类
B:父类
5.3 子类
一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只因为封装性的影响,使得子类不能直接调用父类的结构而已。子类继承父类以后,还可以声明自己特有的属性或方法,从而实现功能的拓展。
5.4 Java继承性的说明
一个类可以被多个子类继承,但是一个类只能继承一个父类。(类的单继承性)
Object类是所有类的跟父类,如果我们在创建一个类时没有写出继承与什么类,则默认继承Object类,即所有Java类都拥有Object类的属性(Object类没有定义属性)和方法,常用的有 equals()、toString()、getclass()、hashCode()
5.5 方法的重写
子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。重写以后,当创建子类对象以后,通过子类对象调用父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
5.6 方法重写的规则
5.6.1 方法的声明
方法的声明: 权限修饰符 返回值类型 方法名(形参列表) throws 异常的类型{方法体}
5.6.2 重写的规则
子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同;
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符;
子类不能重写父类中声明为private权限的方法;
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型;
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void;
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类;
父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须也是double);
子类和父类中的同名同参数的方法要么都声明为非static的,如果都是,则不属于重写
6 接口
6.1 概述
Java中,接口是一种规范的定义,接口使用interface来定义,接口和类是并列结构,接口中不能定义构造器,即接口不能实现实例化
6.2 使用说明
接口中可以定义全局常量和抽象方法
全局常量:public static final 写的时候可以省略
抽象方法:public + 抽象方法 写的时候可以省略public
在JDK8中:接口可以定义静态方法和默认方法
如果一个类继承了接口A,并且重写了接口A中所有的抽象方法,则该类就可以实例化,若没有全部重写,则该类还是一个抽象类,不能实例化
Java类可以实现多接口
接口和接口直接可以相互继承,且可以多继承
接口中的静态方法只能通过接口来调用,不能通过实例化对象调用,这一点和工具类十分相似
通过实现类的对象可以调用接口中的默认方法,如果重写了默认方法,则调用时会调用重写之后的
如果一个类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没重写此方法的情况下,报错。即接口冲突
在子类中也可以调用父类和接口中的默认方法
6.3 代理模式
通过接口可以实现代理模式
包括静态代理和动态代理
动态代理中会用到Class的应用