Java面向对象基础(二)

Updated on in Java with 0 views and 0 comments

面向对象基础

类和对象

什么是类

  1. 类是现实生活中一类具有共同属性和行为的事物的抽象。

  2. 类的特点

    • 类是对象的数据类型
    • 类是具有相同属性和行为的一组对象的集合

什么是对象的属性

  1. 属性:对象具有的各种特征,每个对象的每个属性都拥有特定的值。

什么是对象的行为

  1. 行为:对象能够执行的操作。

类和对象的关系

  1. 对象:是能够看得到摸得着的真实存在的实体。
  2. 关系:类是对象的抽象,对象是类的实体

类的定义

  1. 类的重要性:类是Java程序的基本组成单位。

  2. 类的组成:属性行为

    • 属性:在类中通过成员变量来体现(类中方法外的变量)
    • 行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
  3. 类的定义格式

    public class 类名{
        //成员变量
        变量1的数据类型 变量1;
        变量2的数据类型 变量2;
        ...
        //成员方法
        方法1;
        方法2;
        ...
    }
    

对象的使用

  1. 创建对象

    • 格式:

      类名 对象名 = new 类名();
      
  2. 使用对象

    • 使用成员变量

      • 格式:

        对象名.变量名
        
    • 使用成员方法

      • 格式:

        对象名.方法名();
        

成员变量和局部变量

成员变量

  • 类中方法外的变量

局部变量

  • 方法中的变量

成员变量与局部变量的区别

区别成员变量局部变量
类中位置不同类中方法外方法内或者方法声明上
内存中位置不同堆内存栈内存
生命周期不同随着对象的存在而存在,随着对象的消失而消失随着方法的调用而存在,随着方法的调用完毕而消失
初始化值不同有默认的初始化值没有默认的初始化值,必须先定义,赋值,才能使用

方法

方法概述

  1. 什么是方法

    • 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集。
  2. 注意:

    • 方法必须先创建才可以使用,该过程称为方法定义
    • 方法创建后并不是直接运行的,需要手动使用后才执行,,该过程称为方法调用

方法的定义和调用

  1. 方法定义

    • 格式:

      public [static] 返回值类型 方法名(数据类型1 变量名1,数据类型2 变量名2,...){
          //方法体
          return 数据;
      }
      
    • 注意:方法定义时后面的返回值与方法定义上的返回值类型要匹配,否则程序将报错。

  2. 方法调用

    • 格式:

      数据类型 变量名 = 方法名(变量名/常量值);
      
    • 注意:方法调用时,参数的数量和类型必须与方法定义中设置相匹配,否则程序将报错。

方法注意事项

  • 方法不能嵌套定义
  • void表示无返回值,可以省略return,也可以单独的写return,后面不加数据。

方法重载

  1. 概述:方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载。

    • 多个方法在同一个类中
    • 多个方法具有相同的方法名
    • 多个方法的参数不相同,类型不同或者数量不同
  2. 注意:

    • 重载与返回值无关
    • 在调用的时候,Java虚拟机会通过参数的不同来区分同名的方法

构造方法

概述

  1. 构造方法是一种特殊的方法。

  2. 作用:创建对象

  3. 格式:

    public class 类名{
        修饰符 类名(参数){
            //构造方法内书写的内容
        }
    }
    
  4. 功能:主要是完成对象数据的初始化

注意事项

  1. 构造方法的创建
  • 如果没有定义构造方法,系统将给出一个默认的无参构造方法。
  • 如果定义了构造方法,系统将不再提供默认的构造方法。
  1. 构造方法的重载
    • 如果自定义了带参数构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法。
  2. 推荐的使用方式
    • 无论是否使用,都手工书写无参数构造方法。

标准类原则

  1. 成员变量

    • 使用private修饰
  2. 构造方法

    • 提供一个无参构造方法
    • 提供一个带多个参数的构造方法
  3. 成员方法

    • 提供每一个成员变量对应的setXxx()/getXxx()
    • 提供一个显示对象信息的show()
  4. 创建对象并为其成员变量赋值的两种方式

    • 无参构造方法创建对象后使用 setXxx() 赋值
    • 使用带参构造方法直接创建带有属性值的对象

封装

private关键字

  1. private关键字
    • 是一个权限修饰符
    • 可以修饰成员(成员变量成员方法
    • 作用是保护成员不被别的类使用,被private修饰的成员只在本类中才能访问。
  2. 针对private修饰的成员变量,如果需要被其他类使用,可以设置相应的操作
    • 创建”get变量名()“方法,用于获取成员变量的值,方法用public修饰
    • 创建”set变量名(参数)“方法,用于设置成员变量的值,方法用public修饰

this关键字

  1. this关键字

    • this修饰的变量用于指代成员变量,代表所在类的对象引用,方法被哪个对象调用,this就代表哪个对象
    • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
    • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
  2. this的作用

    • 解决局部变量成员变量同名的问题

封装概述

  • 是面向对象三大特征之一(封装继承多态
  • 是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的

封装原则

  • 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来事项对隐藏信息的操作和访问成员变量private,提供对应的getXxx()/ setXxx() 方法。

封装好处

  • 通过方法来控制成员变量的操作,提高了代码的安全性
  • 把代码方法进行封装,提高了代码的复用性

继承

概述

  • 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性方法

  • 格式:

    public class 子类名 extends 父类名{}
    
    • 父类,也称为基类超类
    • 子类,也称为派生类
  • 继承中子类的特点:

    • 子类可以有父类的内容
    • 子类还可以有自己特有的内容
  • 继承的用途:一般用于多个类中具有相同的特征(属性和方法),将相同的特征提取出来作为父类,然后多个类再继承父类相同的特征。

继承的好处和弊端

  • 好处:

    • 提高了代码的复用性(多个类相同的成员可以放在同一个类中)
    • 提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
  • 弊端:

    • 继承让类与类之间产生了关系,类的耦合性增强,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性。

继承中变量的访问特点

  • 在子类方法中访问一个变量(自内向外)
    • 子类局部范围找
    • 子类成员范围找
    • 父类成员范围找
    • 继续往上找(若父类也有自己的父类)

super

  • super关键字的用法和this关键字的用法相似

    • this:代表本类对象的引用
    • super:代表父类存储空间的标识(可以理解为父类对象的引用)
    关键字访问成员变量访问构造方法访问成员方法
    thisthis.成员变量访问本类成员变量this(...)访问本类构造方法this.成员方法(...)访问本类成员方法
    supersuper.成员变量访问父类成员变量super(...)访问父类构造方法super.成员方法(...)访问父类成员方法

继承中构造方法的访问特点

  • 子类中所有的构造方法默认都会访问父类中的无参构造方法

  • 原因:

    • 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
    • 每一个子类构造方法的第一条语句默认是:super();
  • 当父类中没有无参构造方法,只有带参构造方法时,有两种解决方案:

    • 通过super关键字在子类构造方法中调用父类的带参构造方法
    • 在父类中自己提供一个无参构造方法

继承中成员方法的访问特点

  • 通过子类对象访问一个方法
    • 子类成员范围找
    • 父类成员范围找
    • 继续往上找(若父类也有自己的父类)

方法重写

  • 概述

    • 子类中出现了和父类一模一样的方法声明(包括返回值和参数类型,但不包括权限符)。
  • 应用

    • 当子类需要父类的功能,而功能主体子类有自己特有的内容时,可以重写父类中的方法。这样,即继承了父类的功能,又定义了子类特有的内容。
  • @Override

    • 是一个注解
    • 可以帮助我们检查重写方法的方法声明的正确性
  • 重写方法格式一般为:

    public class Fu{
        public void show(){
            int f = 0;
            System.out.println("f的值为:" + f);
        }
    }
    
    public class Zi extends Fu{
        public void show(){
            System.out.println("调用子类的show方法");
            super();   // 当子类重写方法是在父类方法上添加功能时,可以在添加功能后直接调用super();
        }
    }
    

方法重写的注意事项

  • 私有方法不能被重写(父类私有成员子类是不能继承的)
  • 子类方法访问权限不能比父类的低(public > 默认 > 私有)

继承的注意事项

  • Java中类只支持单继承,不支持多继承
  • Java中类支持多层继承

多态

概述

  • 同一个对象,在不同时刻表现出来的不同形态。
  • 多态的前提和体现
    • 有继承/实现关系
    • 有方法重写
    • 有父类引用指向子类对象

多态中成员访问特点

  • 成员变量:编译看边,执行看

  • 成员方法:编译看边,执行看

  • 成员变量与成员方法访问特点不一样原因

    • 因为成员方法有重写,而成员变量没有

多态的好处和弊端

  • 好处:提高了程序的扩展性

    具体体现:定义方法的时候,使用父类型作为参数,将来在使用的时候,使用具体子类型参与操作

  • 弊端:不能使用子类的特有功能

多态中的转型

  • 向上转型

    • 从子到父

    • 父类引用指向子类对象

    • 格式:

      Fu f = new Zi();
      
  • 向下转型

    • 从父到子

    • 父类引用转为子类对象

    • 格式:

      Zi z = (Zi) f;
      

package

  • 概述:包其实就是文件夹

  • 作用:对类进行分类管理

  • 包的定义格式:

    package 包名;  (多级包用.分开)
    
  • 带包的Java类编译和执行

    • 手动建包

      1. cmd里编译java文件(javac xxx.java
      2. 手动创建包(建立包相应的文件夹)
      3. 把class放在包的最里面
      4. 带包执行(java 包名.xxx
    • 自动建包

      1. javac -d . xxx.java
      2. 带包执行(java 包名.xxx

导包

  • 概述:使用不同包下的类时,使用时要写类的全路径,为了简化带包操作,Java提供了导包功能。

  • 格式:

    import 包名.类名;
    

修饰符

权限修饰符

修饰符同一个类中同一个包中子类、无关类不同包的子类不同包的无关类
private
默认
protected
public

状态修饰符

final

  • 概述:final关键字是最终的意思,可以修饰成员方法成员变量

  • final修饰的特点

    • 修饰方法:表明该方法是最终方法,不能被重写
    • 修饰变量:表明该变量是常量,不能再次被赋值
    • 修饰类:表明该是最终类,不能被继承
  • final修饰局部变量

    • 变量是基本类型final修饰指的是基本类型的数据值不能发生改变
    • 变量是引用类型final修饰指的是引用类型的地址值不能发生改变

static

  • 概述:static关键字是静态的意思,可以修饰成员方法成员变量

  • static修饰的特点

    • 被类的所有对象共享
    • 可以通过类名调用,也可以通过对象名调用
  • static访问特点

    • 非静态的成员方法
      • 能访问静态的成员变量
      • 能访问非静态的成员变量
      • 能访问静态的成员方法
      • 能访问非静态的成员方法
    • 静态的成员方法
      • 能访问静态的成员变量
      • 能访问静态的成员方法

标题:Java面向对象基础(二)
作者:wangdj
地址:https://www.dblog.cool/articles/2024/10/23/1729694648661.html