Java 基础:面向对象

目录:

一、 面向对象和面向过程
二、 类和对象的关系
三、 成员变量和局部变量
四、 引用类型的兼容性
五、 单一职责原则
六、 代码块
七、 类的访问控制权限
八、 Packaging Classes


一、 面向对象和面向过程

1. 概述

  • 什么是面向对象?:关注现实存在的事物的各方面的信息,从对象的角度出发,根据事物的特征进行程序设计

  • 面向过程,是遇到一件事时,思考 我该怎么做 ,然后一步步实现的过程

  • 面向对象,是遇到一件事时,思考 我该让谁来做 ,然后那个“谁”就是对象,他要怎么做这件事是他自己的事,反正最后一群对象合力能把事就好就行了。

  • 总结

  • 面向过程:自己该怎么做

  • 面向对象:找人帮我们做

  • 对象:用来描述客观事物的一个实体

  • :具有 相同属性和方法 的一组对象的集合

  • 是一个模子,用以确定对象将会拥有的特征和

  • 这里的特征和行为可以称之为属性和方法

  • 属性:就是对象所具有的各种静态特征,通俗理解为对象有什么特点

  • 方法:就是对象具有的各种动态行为,通俗理解为对象能做什么

  • 总结类是对象的类型、对象是类的实例化表现

2. 面向对象的一般步骤:

  • 先按照名词提炼问题领域中的对象
  • 对象 进行描述,其实就是在明确对象中应该具备的属性和行为
  • 通过 new 的方式,创建该事物的具体对象(对象实例化)
  • 通过该对象调用它以后的功能
面向对象
  • 创建对象的内存图:
创建对象

二、 类和对象的关系

1. 概述

  • ,用于描述多个对象的共同特征,它是对象的模板
  • 对象,用于描述现实中的个体,它是类的实例

比如:可以将玩具模型看作是一个类,将一个个玩具看作对象,从玩具模型和玩具之间的关系便可以看出类与对象之间的关系

2. 创建对象举例:

创建对象

三、 成员变量和局部变量

1. 变量的作用域 {}:

  • 一对大括号,就是一个作用域
  • 同一作用域中,不能出现同名变量

2. 成员变量和局部变量的区别

  • 定义的位置不同

  • 定义在类中的变量是成员变量

  • 定义在方法中或者{}语句里面的变量是局部变量

  • 在内存中的位置不同

  • 成员变量存储在堆内存的对象中

  • 局部变量存储在栈内存的方法中

  • 声明周期不同

  • 成员变量随着对象的出现而出现中,随着对象的消失而从堆中消失

  • 局部变量随着方法的运行而出现中,随着方法的弹栈而消失

  • 初始化不同

  • 成员变量因为在堆内存中,所以有默认的初始化值,还可以用构造方法初始化

  • 局部变量没有默认的初始化值,必须手动的给其赋值才可以使用,不赋值不能使用

成员属性的初始值

3. 对象数组:存储对象

  • 数组中可以存储基本数据类型的变量,同时我们的数组中还可以存储对象
public class Demo {
    public static void main(String[] args) {
        //这个数组就是一个用来存储Obj类型的对象的数组
        Obj[] b = new Obj[2]; //声明一个存储对象的数组

        b[0] = new Obj();
        b[1] = new Obj();

        b[0].show();
    }
}

class Obj {
    public void show() {
        System.out.println("show");
    }
}

  • 对象数组内存图:
对象数组

4. 方法参数

  • 对于基本类型形式参数改变不会影响到实际参数
  • 对于引用类型形式参数改变会影响到实际参数
  • 方法参数内存图:
方法参数

四、引用类型的兼容性

赋值兼容性规则:

  • 对引用类型的变量进行赋值操作时,赋值号 右边 的表达式的类型必须与赋值号 左边 的对象引用类型 相同或是其子类型 (陪同赋值赋值类型兼容)
  • 方法的 return 语句返回的结果的类型,必须与方法声明中的返回类型 相同 或是其子类型 (返回值的类型兼容)
  • null 值与所有的引用类型兼容,所有引用类型的变量都可被赋值为 null

五、单一职责原则

  • 也叫:单一功能原则

  • 定义:一个类有且只有一个引起功能变化的原因,即一个类有且只有一个功能

  • 如果在一个类中,承载的功能越多,交融和耦合性会越高,被复用的可能性越低;

  • 同时,因为耦合性较高,当类中其中一个职责发生变化时,有可能引发同类中其他职责的变化,进而影响整个程序的运行。

六、 代码块

1. 概述

  • 在Java中,使用 {} 括起来的代码被称为代码块
  • 根据其 位置和声明 的不同,可以分为局部代码块构造代码块静态代码块同步代码块(多线程讲解)。

2. 局部代码块

  • 局部代码块是定义在 方法或语句中,方法和类都是以代码块的方式划定边界的
  • 优点:在方法中出现,限定变量生命周期,及早释放,提高内存利用率
  • 缺点:会使得代码可读性很差,实际开发中不会用

3. 构造代码块

  • 定义在类中 成员位置,方法之外 的代码块

  • 特点:

  • 优先于 构造方法执行,构造代码块用于执行 所有对象 均需要的初始化动作

  • 每创建一个对象均会执行一次构造代码块

4. 静态代码块

  • 静态代码块是定义在成员位置,方法之外,使用 static 修饰的代码块。

  • 特点

  • 优先于 主方法执行、优先于 构造代码块执行,在 类加载时 执行。

  • 该类不管创建多少对象,静态代码块 只执行一次

  • 可用于给 静态变量 赋值,用来给类进行初始化。

七、 类的访问控制权限

1. 概述

  • 通过访问控制修饰符 (access modifiers)可以限制 成员 在类或对象外部的可见性

  • 对于类而言,只有两种权限修饰符:

  • public

  • 不写,默认

2. 公有的:public

  • 访问限定范围最大,可以在 任何位置 被访问
  • 只要能正确加载 public 成员所在的类型,就可以通过类型访问 public 成员。

3. 私有的:private

  • 访问限定范围最小,只允许在 本类中 进行访问

4. 受保护的:protected

  • 只允许 当前类同包任意类跨包子类 可以访问

5. 默认 (不加任何访问修饰符)

  • 只允许 当前类同包任意类 可以访问

注意:如果类用 public 修饰,则 类名必须与文件名相同。一个文件中 只能有一个 public 修饰的类。

6. 访问权限图:

访问权限

八、 Packaging Classes

1. 类的完全限定名(全类名)

  • 类的完全限定名(全类名):在类名前面加上类所属的包名,中间用句点“.”分隔,称为类的完全限定名(Full Qualified Name),简称类的限定名

2. 我们如何唯一确定操作系统上的文件呢?

  • 通过文件在操作系统上的 绝对路径,来唯一的确定一个文件

3. java 类比于 操作系统唯一确定一个文件的方式,如何唯一确定java中的一个类呢?

  • 通过一个类的所属包的包名 + 类名 唯一确定 java 中的一个类
    ImportDemo: 简单类名 --> 全类名 com.cskaoyan.packages.ImportDemo;

4. 当在类体中使用了与当前类不同包的类名时,编译器编译时因为无法找到该类的定义而失败,有两个解决办法:

  • 使用不同包类的完全限定名
  • 使用 import 声明,为编译器提供该类的定义信息 (简单来讲,就是,将其他包的类型导入到当期的Java文件)

5. import 关键字

  • import 声明一般紧跟在 package 声明之后,必须在类声明之前,其基本语法如下:
    import <类的完全限定名>;
  • Java语言核心包 java.lang 包中的类将被隐式导入,可以直接使用其中的类
  • import <包名>.*; 含义就是在当前java文件中,导入某个包下的 所有类(没有嵌套导入的功能)

6. package

  • 在Java源程序文件的第一行使用 package 声明: 可以使文件中定义的类成为指定包的成员(java类是由包组织起来的)

  • package声明的语法如下:
    package <包名>; 常规的命名的方式,域名反转的形式

  • 包名通常由多个名字字符串构成,中间用句点“.”分隔,每个名字表示的包称为其前面的名字表示的包的子包,

  • 通常以组织机构的域名反转形式作为其所有包的通用前缀,如

com.cskaoyan.packages
com.cskaoyan.packages 称之为 com.cskaoyan子包

7. 包的用途:

  • 将相关的类和接口分组,包名通常表示包中各个类和接口的 用途 (分类组织java代码,方便管理我们的代码)
  • 包创建了不同的 命名空间(Namespace),从而有效地解决了 类型命名 冲突问题
  • 包提供了对应用程序内部实现机制的保护域 default 权限修饰符 protected 权限修饰符
  • 如果有一个java文件,没有写 package 关键字,这些类都被认为,属于java中的默认包的成员

你可能感兴趣的:(Java 基础:面向对象)