JAVASE——深入认识JAVA面向对象
【摘要】 前言今天总结的是JAVASE的Java面向对象,Java面向对象这部分内容相比之下算是比较重要的。@[toc] NO.1 面向过程 && 面向对象面向过程思想步骤清晰简单,第一步做什么,第二步做什么面向过程适合处理一些较为简单的问题面向对象思想物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的搜索面向对象适合处...
前言
今天总结的是JAVASE的Java面向对象,Java面向对象这部分内容相比之下算是比较重要的。
@[toc]
NO.1 面向过程 && 面向对象
- 面向过程思想
- 步骤清晰简单,第一步做什么,第二步做什么
- 面向过程适合处理一些较为简单的问题
- 面向对象思想
- 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的搜索
- 面向对象适合处理复杂的问题,适合处理需要多人协作的问题
- 对于描述复杂的问题,为了从宏观上把握,从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理
- 什么是面向过程
- 概述:自上而下的编程模式
- 将我们所需要的问题(需求)拆分成一个个步骤,把每个步骤使用函数进行实现,再根据解决问题的步骤逻辑将函数依次调用即可。
- 可以通俗的理解成为,再进行面向过程的编程过程中,我们不需要去考虑复杂的逻辑问题,而是先定义一个函数,再使用类似于if-else,for-each等方式方法进行代码的实现,逐步分解解题逻辑以达到解决问题的最终方法。
- 什么是面向对象
- 概述:将事物高度抽象化的编程模式
- 将问题分解成一个个的步骤,对每个步骤进行相应的抽象,形成对象,通过不同对象之间的调用,组合解决问题。通俗一点讲,在进行面向对象的编程过程中,要把属性、行为等封装成为对象,而后基于这些对象及对象的能力进行业务逻辑的实现。
- 优劣对比:
- 面向对象:占用资源比重较高,速度相对较慢。易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统
- 面向过程:占用资源比重较低,速度相对较快,没有面向对象易维护、易复用、易扩展。
NO.2 面向对象
- 面向对象编程(Object-Oriented Programming,OOP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据
- 抽象
- 三大特性
- 封装
- 继承
- 多态
- 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
- 从代码运行角度考虑是先有类后有对象,类是对象的模板。
NO.3 类与对象的关系
- 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物
- 动物、植物、手机、电脑。。。
- Person类、Pet类、Car类等,这些类都是用来描述/定义某一类具体的事物应该具备的特点和行为
- 对象是抽象概念的具体事例
- 张三就是人的一个具体实例,张三家里的旺财就是狗的一个具体实例
- 能够体现出特点,展现出功能的是具体的事例,而不能是一个抽象的概念
NO.4 创建与初始化对象
- 使用new关键字创建对象
- 使用new关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
- 类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下两个特点
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
NO.5构造方法(构造器)
-
语法:Person children = new Person();
- 在右侧Person后面出现的小括号, 就是在调用构造方法
-
作用:用于对象初始化。
-
执行时机:在创建对象时,自动调用
-
特点:
- 所有的Java类中都会至少存在一个构造方法
- 如果一个类中没有明确的编写构造方法, 则编译器会自动生成一个无参的构造方法, 构造方法中没有任何的代码!
- 如果自行编写了任意一个构造器, 则编译器不会再自动生成无参的构造方法。
NO.6 封装
- 该露的露,该藏的藏
- 我们程序设计要追求"高内聚,低耦合"
- 高内聚:类的内部数据操作细节自己完成,不允许外部干涉
- 低耦合:仅暴露少量的方法给外部使用
- 封装(数据的隐藏)
- 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
- 重点记住:属性私有,get/set
- 封装的作用
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
NO.7 继承
- 继承的本质是对某一批的抽象,从而实现对现实世界更好的建模
- extands的意思是"扩展",子类是父类的扩展
- JAVA中类只有单继承,没有多继承!
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖、组合、聚合等
- 继承关系的两个类,一个是子类(派生类),一个是父类(基类),子类继承父类,使用关键字extands来表示
- 子类和父类之间,从意义上讲应该具有“is a”的关系
- 重点:Object类、super、方法重写
- super注意点
- super调用父类的构造方法,必须在构造方法的第一个
- super必须只能出现在子类的方法或者构造方法中!
- super和this不能同时调用构造方法
- super和this的对比
- 代表的对象不同
- this:本身调用这个对象
- super:代表父类对象的应用
- 前提
- this:没用继承也可以使用
- super:只用在继承条件下才可以使用
- 构造方法
- this():本类的构造
- super():父类的构造
- 代表的对象不同
- 方法重写
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大但不能缩小(public>protected>default>private)
- 抛出的异常:范围可以被缩小,但不能被扩大(ClassNotFoundException --> Exception(大))
- 重写中子类的方法和父类必须一致,方法体不同
- 为什么要重写:父类的功能,子类不一定需要,或者不一定满足!(ALT + INSERT :override)
NO.8 多态
-
即同一方法可以根据发送对象的不同而采用多种不同的行为方式
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多
-
多态中成员的特点
- 多态成员变量:编译运行看左边
- Fu f=new Zi();
- System.out.println(f.num);//f是Fu中的值,只能取到父中的值
- 多态成员方法:编译看左边,运行看右边
- Fu f1=new Zi();
- System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。
- 多态成员变量:编译运行看左边
-
多态存在的条件
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
-
多态注意事项
- 多态是方法的多态,属性没有多态
- 父类和子类,有联系
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转换
- 方便方法的调用,减少重复的代码
- 存在条件:继承关系,方法需要重写,父类引用指向子类引用!father f1 = new son();
- static方法属于类,不属于实例
- final属于常量
- private方法
-
多态的转型
- 向上转型
- 多态本身就是向上转型过的过程
- 使用格式:父类类型 变量名=new 子类类型();
- 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。
- 向下转型
- 一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型
- 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
- 适用场景:当要使用子类特有功能时。
- 向上转型
NO.9 INSTANCEOF
-
作用:判断某个对象是否是指定类的实例,则可以使用instanceof关键字
-
格式:实例化对象 instanceof 类 //此操作返回boolean类型的数据
NO.10 抽象类
- abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法,如果修饰类,那么该类就是抽象类
- 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类
- 抽象类,不能使用new关键字来创建对象,它是用来让子类来继承的
- 抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的
- 子类继承抽象类,那么就必须要实现抽象类,没有实现的抽象方法,否则该子类也要声明为抽象类
NO.11 接口
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范!自己无法写方法==专业的约束!约束和实现分离:面向接口编程
- 接口就是规范,定义的是一组规则,体现在现实世界中"如果你是。。。则必须能。。。"的思想。
- 接口的本质是契约,就像我们人间的法律一样,制定好后大家都遵守
- OO的精髓是对对象的抽象,最能体现这一点的就是接口。为什么我们讨论设计模式都只针对具备了抽象能力的语言(比如c++、Java、c#等),就是因为设计模式所研究的,实际上就是如何合理地去抽象
- 接口的作用
- 约束
- 定义一些方法,让不同的人实现
- public abstract
- public static final
- 接口不能被实例化,接口中没有构造方法
- implements可以实现多个接口
- 必须重写接口中的方法
interface 接口名称{
全局常量 ;
抽象方法 ;
}
//接口的定义
class 子类 implements 父接口1,父接口2...{ }
//以上的代码称为接口的实现。则按照以下的格式编写即可:
class 子类 extends 父类 implements 父接口1,父接口2...{ }
//如果一个类即要实现接口,又要继承抽象类的话
interface C extends A,B{ }
//接口的继承
NO.12 内部类
- 内部类就是一个类的内部在定义一个类,比如,A类中定义一个B类,那么B类相对于A类来说就称为内部类,而A类相对于B类来说就是一个外部类
- 成员内部类
- 成员内部类是最普通的内部类,它的定义为位于另一个类的内部
public static void main(String[] args){
//外部使用成员内部类
Outer outter = new Outer(100);
Outer.Inner inner = outter.new Inner();
inner.say();
}
class Outer {
private double x = 0;
public Outer(double x) {
this.x = x;
}
class Inner {
private double x=200;
//内部类
public void say() {
System.out.println(x);
System.out.println(Outer.this.x);
}
}
}
- 静态内部类
- 静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。
- 静态内部类是不需要依赖于外部类对象的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法。
public static void main(String[] args) {
Book.Info info = new Book.Info();
info.say();
}
class Book {
static class Info {
public void say(){
...
}
}
- 局部内部类
- 局部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。
- 匿名内部类
- 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪。匿名内部类创建出来只能使用一次,和匿名对象类似。
interface Person{
public void say();
}
public static void main(String[] args){
//匿名内部类
Person p=new Person(){
public void say(){
...
}
}
}
最后
每一篇博客记录了一天或者几天的学习与总结,日积月累,希望这个寒假有所收获。创作不易,希望大家支持一下。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)