面向对象
目录
面向对象
1.什么是面向对象
2.方法定义
3.方法调用
4.类与对象的创建
5.构造器详解
6.创建对象内存分析
7.小结类与对象
8.封装
9.继承
10.Super详解
11.方法重写
12.多态
13.instanceof和类型转换
14.static关键字
15.抽象类
16.接口的定义与实现
17.内部类
1.什么是面向对象
2.方法定义
3.方法调用
4.类与对象的创建
5.构造器详解
- 默认会有一个空构造器。
- 构造器必须与类的名字相同。
- 构造器没有返回值类型,也不能写void。
- 使用new 关键字,必须要有构造器
- this关键字
6.创建对象内存分析
7.小结类与对象
- 类是一个模板,对象是类的一个具体的实例
- 引用类型:基本类型(8),对象是通过引用来操作的
- 属性:成员变量,默认初始化。
8.封装
- 高内聚,低耦合。
1.高内聚意思就是支持主体正常运行的各个模块相对独立,相互之间没啥关联,各司其职。比如一台电脑主机,由机箱,CPU,主板,内存,显卡,电源各种部件组成,大家各做各的事有自己的职责,互不干涉,一起支撑主机的运行。
2.低耦合就是这些部件没有很强的关系。
3.低内聚就是模块之间独立性差。比如我开了个小吃店,又要当厨师,又要上菜,又要接客,又要收银,店里就会很乱,忙不过来。但是如果把我分成四份(再招三个人),就会井然有序,一个不干了再找个人顶替上去就好了,不影响其他人。
- 属性私有。
- 通过外部getset方法来对,对象中的属性进行操作。
- 隐藏代码实现细节
- 提高程序的安全性,保护数据
- 统一接口
- 系统可维护性增加
9.继承
10.Super详解
- super:表示父类对象
1.super调用父类的构造方法,必须在构造方法到的第一个
2. super必须只能出现在子类的方法或者构造方法中
3.super和this不同时调用构造方法
两者区别:
- this:表示当前对象
- 代表对象不同:
this:本身调用者这个对象
super:代表父类对象的引用
- 前提:
this:没有继承也可以使用
super:只能在继承条件中使用
- 构造方法:
this:本类的构造
super:父类的构造
11.方法重写
- 重写需要有继承关系,子类重写父类的方法
- 方法名必须相同,参数列表必须相同,修饰符可以扩大范围,不能所有。抛出的异常范围可以缩小,不能扩大。
- 方法的调用只和左边,定义的数据类型有关系。static修饰的方法重写。左边什么类型就调用谁的方法。
- 没有static修饰方法。在子类的方法上加入重写注解 @Override ,则都调用子类的方法。
12.多态
- 父类的引用指向子类。对象能执行哪些方法,主要看左边的对象类型。
- 多态是方法的多态,属性没有多态
- 多态存在的条件:继承关系,方法需要重写,父类引用指向子类对象。
- static方法不能被重写,final类不能被继承
13.instanceof和类型转换
- instanceof(类型转换)引用类型。判断两个类之间是否存在继承关系。
- father instanceof son ; true
14.static关键字
- static 关键字可以用来修饰:属性、方法、内部类、代码块;
- static 修饰的资源属于类级别,是全体对象实例共享的资源;
- 使用 static 修饰的属性,静态属性是在类的加载期间初始化的,使用类名.属性访问
- 修饰代码块
类中用static关键字修饰的代码块称为静态代码,反之没有用static关键字修 饰的代码块称为实例代码块。
实例代码块会随着对象的创建而执行,即每个对象都会有自己的实例代码块,表现出来就是实例代码块的运行结果会影响当前对象的内容,并随着对象的销毁而消失(内存回收);而静态代码块是当Java类加载到JVM内存中而执行的代码块,由于类的加载在JVM运行期间只会发生一次,所以静态代码块也只会执行一次。
因为静态代码块的主要作用是用来进行一些复杂的初始化工作,所以静态代码块跟随类存储在方法区的表现形式是静态代码块执行的结果存储在方法区,即初始化量存储在方法区并被线程共享。
类中用static关键字修饰的成员变量称为静态成员变量,因为static不能修饰局部变量(为什么?),因此静态成员变量也能称为静态变量。静态变量跟代码块类似,在类加载到JVM内存中,JVM会把静态变量放入方法区并分配内存,也由线程共享。访问形式是:类名.静态成员名。
- 修饰成员变量
用static关键字修饰的方法称为静态方法,否则称为实例方法。通过类名.方法名调用,但需要注意静态方法可以直接调用类的静态变量和其他静态方法,不能直接调用成员变量和实例方法(除非通过对象调用)。
- 修饰方法
15.抽象类
- 抽象类和抽象方法必须用abstract修饰
*abstract class 类名()
*public abstract void eat()
*按照多态的方式,由具体的子类实例化,其实这也是多态的一种,抽象类多态
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是抽象接口
- 抽象类不能实例化,那么抽象类如何实例化呢?
*要么是抽象类要么重写抽象类中的所有抽象方法
- 抽象类的子类
抽象类的成员特点*用于子类访问父类数据的初始化
- a:成员变量:既可以是变量也可以是常量,abstract是否可以修饰变量?不可以
- b:构造方法:有
- c:成员方法:既可以是抽象的也可以是非抽象的
- d:抽象类的成员方法特性
*抽象方法,强制子类做事情,执行标准,统一规则,(理解)
*非抽象方法,子类继承的事情,提高代码复用性
16.接口的定义与实现
抽象类(abstract)
- 含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。
- 含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。
- abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。
- 如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)
- interface 可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。
- 接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
- 抽象类可以有构造方法,接口中不能有构造方法。
- 抽象类中可以有普通成员变量,接口中没有普通成员变量
- 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
- 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
- 抽象类中可以包含静态方法,接口中不能包含静态方法
- 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
- 一个类可以实现多个接口,但只能继承一个抽象类。
下面接着再说说两者在应用上的区别:
- 接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。
- 抽象类在代码实现方面发挥作用,可以实现代码的重用.
17.内部类
使用内部类最吸引人的原因是:
每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。——《Think in java》
优点:
- 内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立。
- 内部类并没有令人迷惑的“is-a”关系,他就是一个独立的实体。
- 内部类提供了更好的封装,除了该外围类,其他类都不能访问。
- 创建内部类对象的时刻并不依赖于外围类对象的创建。
成员内部类
- 可以是任何的访问修饰符。
- 内部类的内部不能有静态信息。
- 内部类也是类,该继承继承,该重写重写,该重载重载,this和super随便用。
- 外部类如何访问内部类信息,必须new之后打点访问。
- 内部类可以直接使用外部类的任何信息,如果属性或者方法发生冲突,调用外部类.this.属性或者方法。
静态内部类
- 内部可以包含任意的信息。
- 静态内部类的方法只能访问外部类的static关联的信息。
- 利用 外部类.内部类 引用=new 外部类.内部类(); 然后利用引用.成员信息(属性、方法)调用。
- 访问内部类的静态信息,直接外部类.内部类.静态信息就可以了。
- 静态内部类可以独立存在,不依赖于其他外围类。
局部内部类
- 类前不能有访问修饰符。
- 仅在此方法内使用。
- 无法创造静态信息。
- 可以直接访问方法内的局部变量和参数(有限制,下面详谈),但是不能更改。
- 可以随意的访问外部类的任何信息。
匿名内部类
- 匿名内部类是没有访问修饰符的。
- 使用匿名内部类时,这个new之后的类首先是要存在的,其次我们要重写new后的类的某个或某些方法。
- 匿名内部类访问方法参数时也有和局部内部类同样的限制。
- 匿名内部类没有构造方法。