Java基础(七):面向对象编程-类和对象

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 Java基础(七):面向对象编程-类和对象,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

Java基础系列文章

Java基础(一):语言概述

Java基础(二):原码、反码、补码及进制之间的运算

Java基础(三):数据类型与进制

Java基础(四):逻辑运算符和位运算符

Java基础(五):流程控制语句

Java基础(六):数组

Java基础(七):面向对象编程

Java基础(八):封装、继承、多态性

Java基础(九):Object 类的使用

Java基础(十):关键字static、代码块、关键字final

Java基础(十一):抽象类、接口、内部类

Java基础(十二):枚举类

Java基础(十三):注解(Annotation)

Java基础(十四):包装类

Java基础(十五):异常处理

Java基础(十六):String的常用API

Java基础(十七):日期时间API

Java基础(十八):java比较器、系统相关类、数学相关类

Java基础(十九):集合框架

Java基础(二十):泛型

Java基础(二十一):集合源码

Java基础(二十二):File类与IO流

Java基础(二十三):反射机制



一、面向对象编程概述

  • 早期先有面向过程思想,随着软件规模的扩大,问题复杂性的提高
  • 面向过程的弊端越来越明显,出现了面向对象思想并成为目前主流的方式

面向过程的程序设计思想(Process-Oriented Programming),简称POP

  • 关注的焦点是过程:过程就是操作数据的步骤
    • 如果某个过程的实现代码重复出现,那么就可以把这个过程抽取为一个函数
    • 这样就可以大大简化冗余代码,便于维护
  • 典型的语言:C语言
  • 代码结构:以函数为组织单位
  • 是一种“执行者思维”,适合解决简单问题。扩展能力差、后期维护难度较大

面向对象的程序设计思想( Object Oriented Programming),简称OOP

  • 关注的焦点是:在计算机程序设计过程中,参照现实中事物
    • 将事物的属性特征、行为特征抽象出来,用类来表示
  • 典型的语言:Java、C#、C++、Python、Ruby和PHP等
  • 代码结构:以为组织单位。每种事物都具备自己的属性行为/功能
  • 是一种“设计者思维”,适合解决复杂问题。代码扩展性强、可维护性高

类比举例:人把大象装进冰箱

  • 面向过程
1.打开冰箱

2.把大象装进冰箱

3.把冰箱门关住
  • 面向对象:把这些步骤和功能进行封装,封装时根据不同的功能,进行不同的封装
人{
    打开(冰箱){
		冰箱.开门();	
    }
    操作(大象){
             大象.进入(冰箱);
    }
    关闭(冰箱){   
          冰箱.关门();     
    }
}

冰箱{
     开门(){ }  
     关门(){ }
}

大象{
     进入(冰箱){  }
}

二、类和对象

1、类和对象概述

  • 类(Class)对象(Object)是面向对象的核心概念
  • 具有相同特征的事物的抽象描述,是抽象的、概念上的定义
  • 对象实际存在的该类事物的每个个体,是具体的,因而也称为实例(instance)

在这里插入图片描述
可以理解为:类 => 抽象概念的人对象 => 实实在在的某个人

2、成员变量(field)

  • 语法格式:
[修饰符1] class 类名{
    [修饰符2] 数据类型 成员变量名 [= 初始化值]; 
}
  • 数据类型
    • 任何基本数据类型(如int、Boolean) 或 任何引用数据类型
  • 成员变量名
    • 属于标识符,符合命名规则和规范即可
  • 初始化值
    • 根据情况,可以显式赋值;也可以不赋值,使用默认值
  • 示例:
public class Person{
	private int age;             //声明private变量 age
	public String name =Lila;    //声明public变量 name
}

3、成员变量 vs 局部变量

变量的分类:成员变量与局部变量

  • 在方法体外,类体内声明的变量称为成员变量
  • 在方法体内部等位置声明的变量称为局部变量

在这里插入图片描述

成员变量 与 局部变量 的对比

相同点

  • 变量声明的格式相同: 数据类型 变量名 = 初始化值
  • 变量必须先声明、后初始化、再使用
  • 变量都有其对应的作用域。只在其作用域内是有效的

不同点

  • 声明位置和方式
    • 实例变量:在类中方法外
    • 局部变量:在方法体{}中或方法的形参列表、代码块中
  • 在内存中存储的位置不同
    • 实例变量:
    • 局部变量:
  • 生命周期
    • 实例变量:和对象的生命周期一样,随着对象的创建而存在,随着对象被GC回收而消亡,而且每一个对象的实例变量是独立的
    • 局部变量:和方法调用的生命周期一样,每一次方法被调用而在存在,随着方法执行的结束而消亡,而且每一次方法调用都是独立
  • 作用域
    • 实例变量:通过对象就可以使用,本类中直接调用,其他类中“对象.实例变量”
    • 局部变量:出了作用域就不能使用
  • 修饰符
    • 实例变量:public,protected,private,final,volatile,transient等
    • 局部变量:final
  • 默认值
    • 实例变量:有默认值
    • 局部变量:没有,必须手动初始化。其中的形参比较特殊,靠实参给它初始化

对象属性的默认初始化赋值

当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值

在这里插入图片描述

三、方法(method)

1、方法的概述

  • 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数过程
  • 将功能封装为方法的目的是,可以实现代码重用,减少冗余,简化代码
  • 声明方法的语法格式
[修饰符] 返回值类型 方法名([形参列表])[throws 异常列表]{
        方法体的功能代码
}
  • 方法通过方法名被调用,且只有被调用才会执行
  • 方法中可以调用类中的方法或属性,不可以在方法内部定义方法

2、方法调用内存分析

  • 方法没有被调用的时候,都在方法区中的字节码文件(.class)中存储
  • 方法被调用的时候,需要进入到栈内存中运行
    • 方法每调用一次就会在栈中有一个入栈动作
    • 即给当前方法开辟一块独立的内存区域
    • 用于存储当前方法的局部变量的值
  • 当方法执行结束后,会释放该内存,称为出栈
    • 如果方法有返回值,就会把结果返回调用处
    • 如果没有返回值,就直接结束,回到调用处继续执行下一条指令
  • 栈结构:先进后出,后进先出

3、方法的重载(overload)

  • 方法重载
    • 在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可
    • 参数列表不同,意味着参数个数类型顺序的不同
  • 重载的特点
    • 与修饰符、返回值类型无关,只看参数列表,且参数列表必须不同
  • 判 断与void show(int a,char b,double c){}构成重载的有:
a)void show(int x,char y,double z){}     // no

b)int show(int a,double c,char b){}      // yes

c) void show(int a,double c,char b){}    // yes

d) boolean show(int c,char b){}          // yes

e) void show(double c){}                 // yes

f) double show(int x,char y,double z){}  // no

g) void shows(){double c}                // no

4、方法的参数传递机制

形参和实参

  • 形参(formal parameter):在定义方法时,方法名后面括号()中声明的变量称为形式参数,简称形参
  • 实参(actual parameter):在调用方法时,方法名后面括号()中的使用的值/变量/表达式称为实际参数,简称实参

参数传递机制:值传递

  • Java里方法的参数传递方式只有一种:值传递。即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
    • 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
    • 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

四、构造器(Constructor)

  • 我们new完对象时,所有成员变量都是默认值,如果我们需要赋别的值,需要挨个为它们再赋值,太麻烦了
  • 我们能不能在new对象时,直接为当前对象的某个或所有成员变量直接赋值呢?
  • 可以,Java给我们提供了构造器(Constructor),也称为构造方法

构造器的作用

  • new对象,并在new对象的时候为实例变量赋值
  • 举例:Person p = new Person(“Peter”,15);

构造器的语法格式

[修饰符] class 类名{
    [修饰符] 构造器名(){
    	// 实例初始化代码
    }
    [修饰符] 构造器名(参数列表){
        // 实例初始化代码
    }
}
  1. 构造器名必须与它所在的类名必须相同
  2. 它没有返回值,所以不需要返回值类型,也不需要void
  3. 构造器的修饰符只能是权限修饰符
    • 不能被其他任何修饰
    • 比如,不能被static、final、synchronized、abstract、native修饰
    • 不能有return语句返回值

使用说明

  • 当我们没有显式的声明类中的构造器时,系统会默认提供一个无参的构造器并且该构造器的修饰符默认与类的修饰符相同
  • 当我们显式的定义类的构造器以后,系统就不再提供默认的无参的构造器了
  • 在类中,至少会存在一个构造器
  • 构造器是可以重载的

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/148567.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!