导图社区 JAVA编程面向对象与面向过程知识框架笔记
这是一篇关于JAVA编辑编程面向对象与面向过程知识框架笔记的结构思维导图,途中阐述了面向对象与面向过程的定义,内部内等所包含的知识点。结构清晰,内容全面,感兴趣的小伙伴可以看看。
编辑于2022-11-03 14:45:04 广东JAVA编程面向对象与面向过程知识框架笔记
面向对象与 面向过程
以面向过程的思想来考虑问题时,以一个具体的流程为单位,考虑它的实现办法。关心的是功能的实现。
以面向对象的思想来考虑问题时,以具体的事物为单位,考虑它的属性(特征)及行为 (动作)。
类与对象区别
类是对一类事物的描述,是抽象的、概念上的定义;
对象是实际存在的该类事物的每个个体,因而也称实例(instance)。
类是模板,是图纸,对象是生产出来的产品.
属性的默认初始化规则
简单数据类型
boolean
false
char
'\u0000'
其他类型
引用数据类型
null
方法声明
形参列表
方法声明时准备接收的参数类型,数量,顺序
实参列表
调用方法时实际传给方法的数据
返回值类型
方法要返回的结果的数据类型
返回值
方法在执行完毕后返还给调用者的数据
创建对象
new关键字
构造方法
显式
隐式(默认)
当类中没有定义任何构造方法时, 系统会提供一个默认无参,public的, 方法体为空的构造方法
作用
创建对象并初始化(属性值)
与普通方法的区别
普通方法是实现特定功能的代码段, 有返回值类型的声明,一般方法名与类名不同
构造方法名与所在类的类名相同, 不声明返回值类型,用于构建对象并初始化
对象属性初始化的步骤
1.默认初始化
2.显式初始化
3.构造方法赋值
引用数据类型
Java语言中除8种基本数据类型以外的数据类型称为引用类型
引用数据类型的变量
引用类型变量的值是某个对象的句柄(对某个对象的引用),而不是对象本身
声明引用类型变量时,系统只为该变量分配引用空间,并未创建一个具体的对象
方法重载 overload
作用
实现相似或相近的功能,方便程序员记忆和使用,实现代码的重用.
格式
一个必须相同:方法名
一个必须不同:形式参数列表
其他的可以相同也可以不同:返回值类型,修饰符,...
java的大原则
最佳匹配性原则
在调用方法传实参时,java会到类里面寻找能够最好地匹配传入的实参类型的方法执行,如果没有完全匹配的,找到能够兼容的方法执行.
最小作用域最强原则
this关键字
四个字:当前对象
在构造方法中指该方法所创建的新对象
在非static的普通方法中指该方法的调用者
this.属性名
访问当前对象的某个属性
this.方法名(...)
用当前对象(本方法的调用者)调用本类中定义的某个方法.
this(..)调用重载的构造方法
只能用在构造方法中,如果要使用,必须放在构造方法的第一句.实现代码的重用
static
应用场景:不想创建某个类的对象,而希望直接访问该类的属性或方法
static关键字可以用来修饰
内部类,属性,方法
static标记的变量由整个类(所有对象)共享,无论该类是否产生了对象, 产生了多少个对象,都有且只有一份.在类加载时,类变量会自动初始化.
类加载
第一次 类名.静态属性名
第一次 类名.静态方法名
第一次创建该类的对象
static修饰的东西的特征:
如访问控制权限允许,可不必创建该类对象 而直接用类名加 “.”调用static属性或方法。
static成员也称类成员或静态成员
static的属性/方法都不依赖于对象存在, 没有用static修饰的属性/普通方法,依赖于对象存在
静态方法中不能使用this
静态方法中只能直接调用本类中的静态成员(变量和方法), 如果要访问非static的属性/方法时,需要用创建对象访问。
属性
全类共享一个值,不依赖对象
方法
可以用类名.方法名调用,不依赖对象
内部类
用host类名.内部类名来访问
方法的参数传递
简单数据类型的参数
传递的是该数据的值本身(变量的副本)
引用数据类型的参数
传递的是这个对象的引用(的副本),而非对象本身
类中的特殊成分
语句块/构造语句块/空语句块
作用:相当于一个无参的构造方法
每次创建对象在构造方法之前执行
如果有多个,按照声明的先后顺序执行
静态语句块
作用:初始化静态属性的
在类被加载的时候会执行一次,且仅执行一次
如果有多个,按照声明的先后顺序执行
打包
作用:分门别类地存放类文件,解决命名冲突
语句:package如果要出现,必须放在源文件正文第一句
语法:package p1.p2....pn;
如果不打包,不能在其他包中被import
导入
作用:使用其他包中的类,接口等
静态导入import static p1.p2....ClassName.staticFieldName|staticMethodName; //JDK5以后的特性,导入静态方法时,不能写()
继承
目的
为了实现代码的重用;在现有类的基础上构建新的类.
为了"扩展"原本类的功能,加强或改进原本类所没有定义的属性及方法
对类的复用,可以通过两种方法
1. 一种方法是将一个类当作另一个类的属性(称为合成/聚合关系).
2. 另一种方法是一个类继承另一个类.
子类也叫派生类,而被继承的类称为父类,也叫超类或基类
通过“继承”一个现有的类,可以使用已经定义的类中的方法和变量。
类的方法和属性可以被继承,但是类的构造器不能被继承
Java类只支持单继承,不允许多重继承
一个子类只能有一个父类
一个父类可以派生出多个子类
特殊:接口可以继承多个父接口
访问控制权限
private:本类中可用
[default/package]:同一个包中可用
protected:不同包中的子类中可用
public:所有类可用
方法的重写
前提:继承(实现)关系
规则
必须相同
方法名,返回值类型,形参列表
可同可不同
修饰符(不能比父类方法更严格)
声明抛出的异常类型(已检查异常),不能比父类方法范围更大
static方法不能覆盖为非静态方法,反之亦然
属性的掩盖
子类新定义了跟父类同名的属性,如果要在子类中调用父类中的同名属性, 需要加上super.属性名
super关键字
super.xxx
super.xxx(...)
super(...)
子类对象实例化过程+static{}+{}
设计模式
单例模式
希望能在类外面得到且仅得到一个该类的实例
应用场景
共享访问点/共享数据;唯一序列号;IO/DB;工具类;应用程序的日志应用;网站的计数器;数据库连接池
Runtime
示例
class Single{ private static Single onlyone = new Single(); private String name; public static Single getSingle() { return onlyone; } private Single() {} } public class TestSingle{ public static void main(String args[]) { Single s1 = Single.getSingle(); Single s2 = Single.getSingle(); if (s1==s2){ System.out.println("s1 is equals to s2!"); } } }
简单工厂模式
也叫静态工厂模式
只需要知道要创建哪个类型的产品就可以了,不需要知道创建对象的艰辛过程,降低模块间的耦合.
可以屏蔽产品类,实现封装.只需要关心产品的接口.
实现了解耦,高层模块(要获取产品对象,调用生产方法的地方)只需要知道产品的抽象类(或接口)
示例
Human接口,WhiteHuman等3个实现类, HumanEnum,HumanFactory用于创建Human对象,场景类FactoryClient
建造者(构建器)模式
用静态内部类实现
java面向对象的特征
继承
封装
多态
多态
静态多态也叫编译时多态,通过方法重载实现
实现相近或相似的功能,方便程序员记忆和使用,代码重用
必须相同
方法名
必须不同
形参列表
形参的数量,顺序,类型至少其中一个不同
可同可不同
返回值类型,修饰符,抛出的异常类型
动态多态也叫运行时多态,通过对象的多态性实现
1.声明的引用是父类(接口)类型,实际指向的是子类(实现类)的对象.
2.声明的形参是父类(接口)类型,实际传入的实参是子类(实现类)类型的对象.
3.声明的返回值类型为父类(接口)类型,实际返回的是子类(实现类)对象的地址
4.声明抛出的异常类型是父类类型,实际抛出的是子类类型对象;
虚方法调用
前提:在多态条件下,子类重写了父类的方法,用一个指向子类对象的父类引用来调用该方法,实际调用的是子类重写后的方法.
instanceof
左边的引用指向的对象的实际类型 是不是 右边的类型(或其子类类型)
对象造型
在多态条件下,为了访问子类新增的属性/方法
限制
Object
public String toString()
public int hashCode()
public Class getClass()
获取一个对象在运行时的实际类型
public boolean equals(Object obj)
==操作符与equals方法
equals比较4类特殊的东西时,只比较类型和内容,不论是否是同一个对象
String,Date,File,封装类
final
属性(全局变量)
不能修改,必须在每个构造方法中显式赋值或声明的同时显式赋值
方法
不能被重写
可以被继承
类(包括内部类)
不能被继承
局部变量
抽象类
应用场景
在定义一个类时,有些方法暂时还不知道该怎么实现, 只能等子类把这些方法都实现后才能使用.
这样的方法应该定义为抽象abstract方法.
含有抽象方法的类必须定义为抽象abstract类.
抽象类不能被实例化,抽象方法必须被全部重写后,才能生成它的子类对象。
如果一个子类没有实现抽象基类中所有的抽象方法,则子类也要声明为一个抽象类。
抽象类不一定包含抽象方法----不想让人直接实例化
可以声明抽象类类型的引用,把它作为方法形参,返回值类型等
在类中没有实现的方法就是抽象方法,抽象方法没有方法体(不同于方法体为空{})
接口
接口(interface)是抽象方法和常量值组成的一个数据结构。
接口中声明的属性默认为public static final的; 也必须是public static final的;可以写public的或者不写,不能写private的或者protected的;
接口中只能定义抽象方法, 而且这些方法默认为public abstract的、也必须是public abstract的,可以缺省,但不能用其它修饰符;
从本质上讲,接口是一种特殊的抽象类, 这种抽象类中只包含常量和方法的定义,而没有方法的实现
多个类可以实现同一个接口
一个类可以实现多个接口
与继承关系类似,接口与实现类之间存在多态性
接口可以继承若干个其它的接口,并添加新的属性和抽象方法
接口里可以没有任何属性,方法.
用实现接口的方式,你可以用接口中的方法指定一个类(其实现类) “必须做什么”,而不是规定它“如何去做”.
何时用接口,何时用抽象类? 子类继承抽象类就不能再继承其他类(java的单继承原则),所以有抽象方法时优先使用接口定义. 如果所有方法都没有实现,优先使用接口. 一些方法已经可以实现,而另一些方法无法或不想实现时,且继承(实现)关系很简单时,考虑用抽象类定义,留给后代去实现。jdk8之后,也可以在接口中定义default方法或static方法来实现.
内部类
定义
一个类可以定义在类的内部,这样的类称为内部类,而包含它的类称为外部类(宿主类Host);内部类与外部类之间存在逻辑上的所属关系
在外部引用它时必须给出完整的名称。
内部类的名字不能与宿主类的类名相同
应用场景
处理宿主类的内部事务,跟其他类没关系,减少类的.java源代码数量. 安卓阶段将大量使用匿名内部类.
格式
[modifiers] class { //外部类的成员 [modifiers] class { //内部类的成员 } }
访问权限(成员/静态内部类)
当内部类声明成public,protected,[default],private等时, 在宿主类之外对其访问的限制与对成员变量和成员方法完全相同
private内部类的private成员,宿主类仍然可以访问到
成员内部类
也叫实例内部类,即没有用static修饰的内部类
其对象依赖于宿主类的对象存在
不能定义static变量,但是可以定义static final的(同时注意初始化)
在编译完成后也会产生.class文件,而文件名称则是”外部类名称$内部类名称.class”
可以使用宿主类的静态和实例成员变量
实例化成员内部类
在宿主类之外例如Client.java中
Outer outer = new Outer();//创建宿主类的对象 Outer.Inner inner = outer.new Inner(); //注意:在宿主类之外创建实例内部类的对象,受到访问权限的影响
在宿主类内部
在静态方法(例如main方法)中
Outer outer = new Outer();//创建宿主类的对象 /*Outer.*/Inner inner = outer.new Inner();//都可以
在非静态方法中
Inner inner = new Inner();//可直接创建成员内部类的对象
同名属性的区分
public class A{ private int s = 111; public class B { private int s = 222; public void mb(int s) { System.out.println(s); // 局部变量s System.out.println(this.s); // 内部类对象的属性s System.out.println(A.this.s); // 外层类对象属性s } } public static void main(String args[]){ A a = new A(); A.B b = a.new B();//等价于A.B b = new A().new B(); b.mb(333); } }
static内部类
在宿主类之外,在权限允许时,可以通过宿主类名.内部类名来访问。
Outer.Inner inner = new Outer.Inner();
静态内部类不会持有外部类的引用,创建时可以不用创建外部类对象.
可以访问外部类的静态变量, 如果要访问外部类的成员变量必须通过外部类的实例访问
创建对象
在host之外
Outer.Inner inner = new Outer.Inner();
在host内部, 无论是否是静态上下文中
/*Demo01.*/StaticInn sti = new /*Demo01.*/StaticInn(); //可以省略host类名
应用场景
WeiXin.java WeiXin(Builder){...}//host的构造方法 static class Builder{//static内部类 Builder setAge(int){...} ... ... WeiXin build(){ return new WeiXin(this); } } Client.java WeiXin weixin = new WeiXin .Builder("tom", "123")//创建静态内部类的对象. .setAge(20) .setSex('男') .setEmail("qq@mail.com") .build();
局部内部类
也叫区域内嵌类
定义在一个方法中,所以类的作用范围仅限于该方法中, 而类生成的对象也只能在该方法中使用
不能加上private,protected,public中的任何一个修饰符
不能包含静态成员
如果局部内部类中要使用宿主方法的局部变量, 该变量必须被声明为final的
匿名内部类
只使用一次,没有名字的内部类
不用声明类名称,而是用new直接产生一个对象。
它可以是继承某个类,或是实现某个接口。
...... Father f = new Father(2){ public void m(){} }; ...... class Father{ public void m(){} public Father(int i){} }
匿名内部类编译后生成的.class文件的命名方式是”外部类名称$编号.class”
匿名内部类中如果要使用所在方法的局部变量,必须把该变量声明成final的
用法
用匿名内部类的对象为父类的引用赋值
匿名内部类的对象 作为方法/构造方法的实参
用匿名内部类的对象 作为方法的返回值
内部类特性
可以声明为抽象类,因此可以被其它的内部类继承
可以声明成abstract static的;也可以声明为final的.
还可以声明内部接口.如java.util.Map.Entry
抽象内部类的宿主类可以不声明成抽象的