面向对象三大特征
- 继承 inheritance
1.子类 父类
2.子类可以从父类继承属性和方法
3.子类可以提供自己单独的属性和方法 - 封装/隐藏encapsulation
1.对外隐藏某些属性和方法
2.对外公开某些属性 - 多态 polymorphism
为了适应需求的多种变化,使代码变得更加通用 - 面向过程只有封装性(功能的封装,而没有数据的封装),没有继承和多态
隐藏/封装(encapsulatio)
- 为什么需要封装?封装的作用和含义?
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩
展性、可维护性 - 我们程序设计要追求“高内聚,低耦合”
1.高内聚 :就是类的内部数据操作细节自己完成,不允许外部干涉
2.低耦合 :仅暴露少量的方法给外部使用
使用访问控制符实现封装
- 成员(成员变量或成员方法)访问权限共有四种
1.public 公共的:可以被项目中所有的类访问。(项目可见性)
2.protected 受保护的:可以被这个类本身访问;同一个包中的所有其他的类访问;被它的子类(同一个包以及不同包中的子类)访问
3.default/friendly 默认的/友好的(包可见性):被这个类本身访问;被同一个包中的类访问
4.private 私有的:只能被这个类本身访问。(类可见性) - 类的访问权限只有两种
1.public 公共的:可被同一项目中所有的类访问。 (必须与文件名同名)
2.default/friendly 默认的/友好的:可被同一个包中的类访问 - 类的属性的处理:
1.一般使用private. (除非本属性确定会让子类继承)
2.提供相应的get/set方法来访问相关属性. 这些方法通常是public,从而提供对属性的读取操作。
(注意:boolean变量的get方法是用:is开头 - 一些只用于本类的辅助性方法可以用private
- 希望其他类调用的方法用public
继承
- 类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模。
- 提高代码的复用性
- extands的意思是“扩展”。子类是父类的扩展
- 不同的叫法:超类、父类、基类、子类、派生类

讯享网 - 子类继承父类的成员变量和成员方法,但不继承父类的构造方法
- java中只有单继承 ,没有像c++那样的多继承
- java中的多继承,可以通过接口来实现
- 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
- 父类方法的重写:
1.“==” :方法名、形参列表相同
2.“≤≤”:返回值类型和异常类型,子类小于等于父类
3.“≥”:访问权限,子类大于等于父类 - 构造方法调用顺序:
1.根据super的说明,构造方法第一句 总是:super(…)来调用父类对应的构造方法
2.先向上追溯到Object,然后再依次向下执行类的初始化块和构造方法,直到当前子类为止
方法的重写
- 在子类中可以根据需要对从基类中继承来的方法进行重写
- 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型
- 重写方法不能使用比被重写方法更严格的访问权限。(由于多态)

Object类
- Object类是所有Java类的根基类
- 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类
- 重写:toString方法
默认返回:包名+类名+@+哈希码 - 具体情况请查看API学习
super关键字
- super是直接父类对象的引用
- 可以通过super来访问父类中被子类覆盖的方法或属性

对象的比较 ==和equals()
- ==:
1.比较两基本类型变量的值是否相等
2.比较两个引用类型的值即内存地址是否相等,即是否指向同一对象 - equals():
两对象的内容是否一致 - 自定义类须重写equals(),否则其对象比较结果总是false
多态 polymorphi
- 多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性
- 引用变量的两种类型:
1.编译时类型(模糊一点,一般是一个父类):由声明时的类型决定
2.运行时类型(运行时,具体是哪个子类就是哪个子类):由实际对应的对象类型决定 - 多态的存在要有3个必要条件
要有继承,要有方法重写,父类引用指向子类对象

引用数据类型的类型转换
- 子类转换为父类:自动转换
1.上转型对象不能操作子类新增的成员变量和方法
2.上转型对象可以操作子类继承或重写的成员变量和方法
3.如果子类重写了父类的某个方法,上转型对象调用该方法时,是调用的重写方法 - 父类转换为子类:强制转换
final关键字
- final可以用来修饰变量,方法,类
- 修饰变量:变量一旦被初始化便不可改变,相当定义了一常量
final int A=123; - 修饰方法:final方法是在子类中不能被覆盖的方法
final void abc() { … } - 修饰类:final类是无法被任何类继承的
final class abcd{ … }
抽象类
- 为什么需要抽象类? 如何定义抽象类?
1.是一种模版模式。抽象类为所有子类提供了一个通用模版,子类可以在这个模版基础上进行扩展
2.通过抽象类,可以避免子类设计的随意性。通过抽象类,我们就可以做到严格限制子类的设计,使子类之间更加通用

- 抽象方法和抽象类均必须用abstract来修饰
- 抽象方法没有方法体,只需要声明不需实现
- 有抽象方法的类只能定义能抽象类
- 相反抽象类里面的方法不一定全是抽象方法,也可能没有抽象方法
- 抽象类可以包含属性、方法、构造方法
- 抽象类不能实例化,及不能用new来实例化抽象类,只能用来被子类调用
- 抽象类只能用来继承
- 抽象方法必须被子类实现。抽象类的子类必须覆盖所有的抽象方法才能被实例化,否则还是抽象类
接口 interface
- 为什么需要接口?接口和抽象类的区别?
1.接口就是比“抽象类”还“抽象”的“抽象类”,可以更加规范的对子类进行约束。全面地专业地实现了:规范和具体实现的分离
2.接口就是规范,定义的是一组规则,体现了现实世界中“如果你是…则必须能…”的思想
3.接口的本质是契约,就像我们的法律一样
4.项目的具体需求是多变的,我们必须以不变应万变才能从容开发,此处的“不变”就是“规范”。因此,我们开发项目往往都是面向接口编程 - 接口相关规则
1.接口中所有方法都是抽象的
2.即使没有显式的将接口中的成员用public标示,也是public访问类型的
3.接口中变量默认用 public static final标示,所以接口中定义的变量就是全局静态常量
4.可以定义一个新接口,用extends去继承一个已有的接口
5.可以定义一个类,用implements去实现一个接口中所有方法
6.可以定义一个抽象类,用implements去实现一个接口中部分方法 - 如何定义接口?
[访问修饰符] interface 接口名 [extends 父接口1,父接口2…] {
常量定义 //总是public static final
方法定义 //总是:public abstract
} - 如何实现接口
1.子类通过implements来实现接口中的规范
2.接口不能创建实例,但是可用于声明引用变量类型
3.一个类实现了接口,必须实现接口中所有的方法,并且这些方法只能是public的
4.Java的类只支持单继承,接口支持多继承 - C++支持多重继承,Java支持单重继承
- C++多重继承的危险性在于一个类可能继承了同一个方法的不同实现,会导致系统崩溃
- Java中,一个类只能继承一个类,但同时可以实现多个接口,既可以实现多重继承的效果和功能,也避免的多重继承的危险性
- 注意:extends 必须位于implements之前。class Student extents A implements B
内部类
- 将一个类定义置入另一个类定义中就叫作“内部类”
1.类中定义的内部类特点
2.内部类作为外部类的成员,可以直接访问外部类的成员(包括private成员),反之则不行
3.内部类做为外部类成员,可声明为private、默认、protected或public
4.内部类成员只有在内部类的范围之内是有效的
5.用内部类定义在外部类中不可访问的属性。这样就在外部类中实现了比外部类的private还要小的访问权限
6.编译后生成两个类: AClass.class 和AClass$BClass.class - 内部类分类
成员内部类 静态内部类 方法内部类 匿名内部类 - 匿名内部类Anonymous
1.可以实现一个接口,或者继承一个父类
2.只能实现一个接口
3.适合创建那种只需要一次使用的类,不能重复使用。比较常见的是在图形界面编程GUI里用得到
4.匿名内部类要使用外部类的局部变量,必须使用final修饰该局部变量
垃圾回收机制
- 对象空间的分配:使用new关键字创建对象即可
- 对象空间的释放:
- 传统的C/C++语言,需要程序员负责回收已经分配内存。显式回收垃圾回收的缺点:
1.程序忘记及时回收,从而导致内存泄露,降低系统性能
2.程序错误回收程序核心类库的内存,导致系统崩溃 - Java语言不需要程序员直接控制内存回收,是由JRE在后台自动回收不再使用的内存,称为垃圾回收机制(Garbage Collection)
1.可以提高编程效率
2.保护程序的完整性
3.其开销影响性能。Java虚拟机必须跟踪程序中有用的对象,确定哪些是无用的
- 关键
- 垃圾回收机制只回收JVM堆内存里的对象空间
- 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力
- 现在的JVM有多种垃圾回收实现算法,表现各异
- 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行
- 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象
- 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定
- 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)
- 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/17538.html