Java进阶-面向对象入门

news2024/11/27 23:38:58

1. 面向过程与面向对象

1.1 何谓“面向对象”的编程思想?

首先解释一下“思想”。

先问你个问题:你想做个怎样的人?

可能你会回答:我想做个好人,孝敬父母,尊重长辈,关爱亲朋…… 你看,这就是思想。这是你做人的思想,或者说,是你做人的原则。 做人有做人的原则,编程也有编程的原则。这些编程的原则呢,就 是编程思想。

1.2 面向过程与面向对象

1.2.1 面向过程(POP)与面向对象(OOP)

  • 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程, 强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对 象, 强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

  • 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。

1.2.2 面向对象的三大特征

  • 封装 (Encapsulation)

  • 继承 (Inheritance)

  • 多态 (Polymorphism)

举例:人把大象装进冰箱

image-20221113165147172

2. 类和对象

2.1 类和对象的理解

客观存在的事物皆为对象 ,所以我们也常常说万物皆对象

  • 类的理解
    • 类是对现实生活中一类具有共同属性和行为的事物的抽象
    • 类是对象的数据类型,类是具有相同属性和行为的一组对象的集合
    • 简单理解:类就是对现实事物的一种描述
  • 类的组成
    • 属性:指事物的特征,例如:手机事物(品牌,价格,尺寸)
    • 行为:指事物能执行的操作,例如:手机事物(打电话,发短信)

类和对象的关系

  • 类:类是对现实生活中一类具有共同属性和行为的事物的抽象
  • 对象:是能够看得到摸的着的真实存在的实体
  • 简单理解:类是对事物的一种描述,对象则为具体存在的事物

image-20221113165410970

2.2 类的定义

类的组成是由属性行为两部分组成

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

类的定义步骤:

  1. 定义类

  2. 编写类的成员变量

  3. 编写类的成员方法

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

示例代码:

/*
    手机类:
        类名:
        手机(Phone)

        成员变量:
        品牌(brand)
        价格(price)

        成员方法:
        打电话(call)
        发短信(sendMessage)
 */
public class Phone {
    //成员变量
    String brand;
    int price;

    //成员方法
    public void call() {
        System.out.println("打电话");
    }

    public void sendMessage() {
        System.out.println("发短信");
    }
}

2.3 对象的使用

创建对象的格式:

类名 对象名 = new 类名();

调用成员的格式:

对象名.成员变量;
对象名.成员方法();

示例代码

package com.iflytek.day10;

public class _01_PhoneDemo {

    public static void main(String[] args) {
        //创建对象
        Phone p = new Phone();

        //使用成员变量
        System.out.println(p.brand);
        System.out.println(p.price);

        p.brand = "小米";
        p.price = 2999;

        System.out.println(p.brand);
        System.out.println(p.price);

        //使用成员方法
        p.call();
        p.sendMessage();
    }
}

2.4 学生对象-练习

需求:

首先定义一个学生类,然后定义一个学生测试类,在学生测试类中通过对象完成成员变量和成员方法的使用

分析:

  • 成员变量:姓名,年龄…
  • 成员方法:学习,做作业…

示例代码:

package com.iflytek.day10;

public class _02_Student {
    //成员变量
    String name;
    int age;

    //成员方法
    public void study() {
        System.out.println("好好学习,天天向上");
    }

    public void doHomework() {
        System.out.println("键盘敲烂,月薪过万");
    }
}
package com.iflytek.day10;

/*
    学生测试类
 */
public class _02_StudentDemo {
    public static void main(String[] args) {
        //创建对象
        _02_Student s = new _02_Student();

        //使用对象
        System.out.println(s.name + "," + s.age);

        s.name = "林青霞";
        s.age = 30;

        System.out.println(s.name + "," + s.age);

        s.study();
        s.doHomework();
    }
}

3. 对象内存图【了解】

3.1 JVM数据区域

img

  • 堆 (Heap) ,此内存区域的唯一目的 就是存放对象实例,几乎所有的对象 实例都在这里分配内存 。这一点在 Java虚拟机规范中的描述是:所有的 对象实例以及数组都要在堆上分配。

  • 通常所说的栈 (Stack) ,是指虚拟机栈。虚拟机栈用于存储局部变量等。 局部变量表存放了编译期可知长度的 各种基本数据类型 (boolean 、byte 、 char 、 short 、 int 、 float 、 long 、 double) 、对象引用 (reference类型, 它不等同于对象本身,是对象在堆内 存的首地址) 。 方法执行完, 自动释 放。

  • 方法区 (Method Area) ,用于存储已 被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据。

3.2 单个对象内存图

  • 成员变量使用过程

1

  • 成员方法调用过程

2

3.3 多个对象内存图

  • 成员变量使用过程

3

  • 成员方法调用过程

4

  • 总结:

    多个对象在堆内存中,都有不同的内存划分,成员变量存储在各自的内存区域中,成员方法多个对象共用的一份

4. 成员变量和局部变量

4.1 成员变量和局部变量的区别

  • 类中位置不同:
    • 成员变量(类中方法外)
    • 局部变量(方法内部或方法声明上)
  • 内存中位置不同:
    • 成员变量(堆内存)
    • 局部变量(栈内存)
  • 生命周期不同:
    • 成员变量(随着对象的存在而存在,随着对象的消失而消失)
    • 局部变量(随着方法的调用而存在,随着方法的调用完毕而消失)
  • 初始化值不同:
    • 成员变量(有默认初始化值)
    • 局部变量(没有默认初始化值,必须先定义,赋值才能使用)
成员变量局部变量
声明的位置直接声明在类中方法形参或内部、代码块内、构造器内等
修饰符private、public、static、final等不能用权限修饰符修饰,可以用final修饰
初始化值有默认初始化值没有默认初始化值,必须显式赋值,方可使用
内存加载位置堆空间 或 静态域内栈空间

5. 封装

5.1 封装思想

  1. 封装概述

是面向对象三大特征之一(封装,继承,多态

对象代表什么,就得封装对应的数据,并提供数据对应的行为

  1. 封装代码实现

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

5.2 private关键字

private是一个修饰符,可以用来修饰成员(成员变量,成员方法)

被private修饰的成员,只能在本类进行访问,针对private修饰的成员变量,如果需要被其他类使用,提供相应的操作

  • 提供“get变量名()”方法,用于获取成员变量的值,方法用public修饰
  • 提供“set变量名(参数)”方法,用于设置成员变量的值,方法用public修饰

示例代码:

package com.iflytek.day10;

/*
    学生类
 */
class _03_Student {
    //成员变量
    String name;
    private int age;

    //提供get/set方法
    public void setAge(int a) {
        if (a < 0 || a > 120) {
            System.out.println("你给的年龄有误");
        } else {
            age = a;
        }
    }

    public int getAge() {
        return age;
    }

    //成员方法
    public void show() {
        System.out.println(name + "," + age);
    }
}

/*
    学生测试类
 */
public class _03_StudentDemo {
    public static void main(String[] args) {
        //创建对象
        _03_Student s = new _03_Student();
        //给成员变量赋值
        s.name = "林青霞";
        // s.age = 30;
        s.setAge(30);
        //调用show方法
        s.show();
    }
}

5.3 private的使用

需求:

定义标准的学生类,要求name和age使用private修饰,并提供set和get方法以及便于显示数据的show方法,测试类中创建对象并使用,最终控制台输出 林青霞,30

示例代码:

package com.iflytek.day10;

/*
    学生类
 */
class _04_Student {
    //成员变量
    private String name;
    private int age;

    //get/set方法
    public void setName(String n) {
        name = n;
    }

    public String getName() {
        return name;
    }

    public void setAge(int a) {
        age = a;
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}

/*
    学生测试类
 */
public class _04_StudentDemo {
    public static void main(String[] args) {
        //创建对象
        _04_Student s = new _04_Student();

        //使用set方法给成员变量赋值
        s.setName("林青霞");
        s.setAge(30);

        s.show();

        //使用get方法获取成员变量的值
        System.out.println(s.getName() + "---" + s.getAge());
        System.out.println(s.getName() + "," + s.getAge());

    }
}

5.4 this关键字

this修饰的变量用于指代成员变量,其主要作用是(区分局部变量和成员变量的重名问题)

  • 方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
  • 方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量
public class Student {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}

6. 构造方法

6.1 构造方法概述

构造方法是一种特殊的方法

  • 作用:创建对象 Student stu = new Student();

  • 格式:

    public class 类名{
    	修饰符 类名( 参数 ) {
    
    	}
    }
    
  • 功能:主要是完成对象数据的初始化

示例代码:

class _05_Student {
    private String name;
    private int age;

    //构造方法
    public Student() {
        System.out.println("无参构造方法");
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    测试类
 */
public class _05_StudentDemo {
    public static void main(String[] args) {
        //创建对象
        _05_Student s = new _05_Student();
        s.show();
    }
}

6.2 构造方法的注意事项

  • 构造方法的创建

    如果没有定义构造方法,系统将给出一个默认的无参数构造方法
    如果定义了构造方法,系统将不再提供默认的构造方法

  • 构造方法的重载

    如果自定义了带参构造方法,还要使用无参数构造方法,就必须再写一个无参数构造方法

  • 推荐的使用方式

    无论是否使用,都书写无参数构造方法

  • 重要功能!

    可以使用带参构造,为成员变量进行初始化

    示例代码

package com.iflytek.day10;

/*
    学生类
 */
class _06_Student {
    private String name;
    private int age;

    public _06_Student() {}

    public _06_Student(String name) {
        this.name = name;
    }

    public _06_Student(int age) {
        this.age = age;
    }

    public _06_Student(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}
/*
    测试类
 */
public class _06_StudentDemo {
    public static void main(String[] args) {
        //创建对象
        _06_Student s1 = new _06_Student();
        s1.show();

        //public Student(String name)
        _06_Student s2 = new _06_Student("林青霞");
        s3.show();

        //public Student(int age)
        _06_Student s3 = new _06_Student(30);
        s5.show();

        //public Student(String name,int age)
        _06_Student s4 = new _06_Student("林青霞",30);
        s5.show();
    }
}

6.3 标准类制作

  1. 类名需要见名知意

  2. 成员变量使用private修饰

  3. 提供至少两个构造方法

    • 无参构造方法

    • 带全部参数的构造方法

  4. get和set方法

    ​ 提供每一个成员变量对应的setXxx()/getXxx()

  5. 如果还有其他行为,也需要写上

6.4 练习1

需求:

​ 定义标准学生类,要求分别使用空参和有参构造方法创建对象,空参创建的对象通过setXxx赋值,有参创建的对象直接赋值,并通过show方法展示数据。

示例代码:

package com.iflytek.day10;

class _07_Student {
    //成员变量
    private String name;
    private int age;

    //构造方法
    public _07_Student() {
    }

    public _07_Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //成员方法
    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void show() {
        System.out.println(name + "," + age);
    }
}

/*
    创建对象并为其成员变量赋值的两种方式
        1:无参构造方法创建对象后使用setXxx()赋值
        2:使用带参构造方法直接创建带有属性值的对象
*/
public class _07_StudentDemo {
    public static void main(String[] args) {
        //无参构造方法创建对象后使用setXxx()赋值
        _07_Student s1 = new _07_Student();
        s1.setName("林青霞");
        s1.setAge(30);
        s1.show();

        //使用带参构造方法直接创建带有属性值的对象
        _07_Student s2 = new _07_Student("林青霞", 30);
        s3.show();
    }
}

6.4 练习2

需求:

根据下图,分析设计出用户类。

111

示例代码:

_08_User.java

package com.iflytek.day10;

/**
 *   1.私有化全部的成员变量
 *   3.空参构造
 *   5.带全部参数的构造
 *   5.针对于每一个私有化的成员变量都要提供其对应的get和set方法
 *   5.如果当前事物还有其他行为,那么也要写出来,比如学生的吃饭,睡觉等行为
 */
public class _08_User {

    private String username;//用户名
    private String password;//密码
    private String email;//邮箱
    private char gender;//性别
    private int age;//年龄

    //空参构造方法
    public _08_User() {
    }

    //带全部参数的构造
    public _08_User(String username, String password, String email, char gender, int age) {
        this.username = username;
        this.password = password;
        this.email = email;
        this.gender = gender;
        this.age = age;
    }

    //get和set

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void eat(){
        System.out.println(username + "在吃饭");
    }
}

_08_UserDemo.java

package com.iflytek.day10;

public class _08_UserDemo {
    public static void main(String[] args) {
        //利用空参构造创建对象
        _08_User u1 = new _08_User();
        //如果利用空参创建对象,还想赋值只能用set方法赋值
        u1.setUsername("zhangsan");
        u1.setPassword("1234qwer");
        u1.setEmail("zhangsan@sina.cn");
        u1.setGender('男');
        u1.setAge(23);
        //获取属性的值并打印
        System.out.println(u1.getUsername() + ", " + u1.getPassword()
                + ", " + u1.getEmail() + ", " + u1.getGender() + ", " + u1.getAge());
        u1.eat();

        System.out.println("=============================");

        //简单的办法
        //利用带全部参数的构造来创建对象
        _08_User u2 = new _08_User("lisi", "12345678", "lisi@sina.cn", '女', 24);
        System.out.println(u3.getUsername() + ", " + u3.getPassword()
                + ", " + u3.getEmail() + ", " + u3.getGender() + ", " + u3.getAge());
        u3.eat();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/528845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年Android开发者路线-第2部分

2023年Android开发者路线-第1部分 2023年Android开发者路线-第2部分 2023年Android开发者路线-第3部分 2023年Android开发者路线-第4部分 2023Android开发者路线-第2部分 在上一篇文章中&#xff0c;我们讨论了 Android 架构的重要元素&#xff0c;包括主要的 Android 语言…

探索iOS之AVFoundation框架

AVFoundation框架的业务层主要是AVKit和UIKit&#xff0c;内核层包括CoreVideo、CoreAudio、CoreMedia、VideoToolBox等。AVFoundation作为iOS的音视频框架&#xff0c;提供音视频播放、录制、编辑、编解码、音效设置等。接下来&#xff0c;让我们看一下整体的框架图。 一、AVK…

ANR基础篇 - Trace.txt文件分析

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、trace.txt文件示例二、日志分析2.1 CPU 负载2.2 内存信息2.3 堆栈信息schedst…

Mybatis 案例

文章目录 Mybatis 案例一、 准备工作1.1 数据库表1.2 Restfull规范1.3 封装结果类1.4 实体类 二、部门管理2.1 查询全部部门信息2.2 删除部门2.3 新增部门 三、员工管理3.1 分页查询3.2 分页查询 - PageHelper插件3.3 分页查询 - 条件查询3.4 批量删除员工3.5 新增员工3.6 修改…

蓝桥杯模块学习3——蜂鸣器与继电器

第一章 硬件部分 1.1 电路的组成部分 1.1.1 译码器和锁存器 具体可回顾之前LED灯的文章&#xff1a; https://blog.csdn.net/weixin_63568691/article/details/130660096 1.1.2 ULN2003达林顿管 原理图&#xff1a; 功能&#xff1a; &#xff08;1&#xff09;改变电路特性…

使用Spring初始化器创建Spring Boot项目

注&#xff1a;初始化向导需要联网创建Spring Boot项目 new project 项目创建完成 resources 文件夹中目录结构&#xff1a; static &#xff1a;保存所有的静态资文件&#xff0c; js css images templates &#xff1a;保存所有的模板页面&#xff08;Spring Boot默认j…

python3 爬虫相关学习1:安装requests模块

目录 1 安装前&#xff1a;避免python2 python3 引起的问题 2 如何安装python3 2.1 直接上python3 官网下载 2.2 或者windows的话&#xff0c;microsoft store 里也可以下载 2.3 查看python版本 3 安装requests模块 3.1 很可能安装requests模块之前会遇到报错&#xff…

linux0.12-8-11-vsprintf.c

[383页] 1、 这一小节可以不看代码如何实现&#xff0c;因为标准的C库函数&#xff1b; 2、 等自己看完的这本书&#xff0c;有兴趣过来研究研究也是可以的。 8-11 vsprintf.c程序 8-11-1 功能描述 该程序主要包括vsprintf(),用于对参数产生格式化的输出。由于该函数是C函数…

SOME/IP 草稿

SOME/IP 名词解释 SOME/IP 全称是 Scalable service-Oriented MiddlewarE over IP。也就是基于 IP 协议的面向服务的可扩展性通信中间件协议。 面向服务 SOA基于 IP 协议之上的通信协议中间件 SOME/IP 功能 服务发现 (Service Discovery)远程服务调用 &#xff08;RPC,rem…

React面试题汇总 --2

1. 何为 redux &#xff0c;解决什么问题 操作流程 使用场景 优缺点 &#xff1f; Redux使用详解(一) Redux的核心思想与基本使用__聪明勇敢有力气的博客-CSDN博客Redux使用详解(一) Redux的核心思想与基本使用https://blog.csdn.net/weixin_65402230/article/details/128193…

全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略

全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略 准备阶段部署网站腾讯云注册与解析添加API和密码更换域名的配置多密码管理密码更换密码批量生成 本教程收集于&#xff1a;AIGC从入门到精通教程汇总 全免费开源&#xff0c;仅需一个域名就可以部署国内的ChatGPT镜像版本。…

ConvTranspose2d 的简单例子理解

文章目录 参考基础概念简单例子&#xff1a; stride2step1step2step3 参考 逆卷积的详细解释ConvTranspose2d&#xff08;fractionally-strided convolutions)nn.ConvTranspose2d的参数output_padding的作用 基础概念 逆卷积&#xff0c;也叫反卷积或者转置卷积&#xff0c;…

故障分析 | OceanBase 频繁更新数据后读性能下降的排查

本文摘要 本文分析并复现了 OceanBase 频繁更新数据后读性能下降现象的原因&#xff0c;并给出了性能改善建议。 背景 测试在做 OceanBase 纯读性能压测的时候&#xff0c;发现对数据做过更新操作后&#xff0c;读性能会有较为明显的下降。具体复现步骤如下。 复现方式 环…

部门新来一00后,给我卷崩溃了...

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

NFT数字藏品平台

在 NFT &#xff08;非同质化代币&#xff09;发行和交易中&#xff0c;数字藏品交易平台&#xff08;以下简称“交易平台”&#xff09;的运营模式和法律地位至关重要。本文对数字藏品交易平台的运营方式进行梳理&#xff0c;并对其中可能存在的法律风险进行分析。 2021年以来…

NFS服务器搭建(案例)

目录标题 第一个问题1.安装软件包2.进入配置文件进行定义&#xff0c;并创建对应的资源文件3.客户端进行挂载&#xff0c;并查看挂载信息&#xff0c;修改挂载权限4.客户端查看挂载的信息 第二个问题1.服务端配置文件进行定义&#xff0c;并创建对应资源文件2.客户端进行挂载3.…

电子邮件是最有效的营销方式吗?解析邮件营销的优势和劣势

互联网的快速发展&#xff0c;使得新媒体营销、短视频营销、微信营销等新型营销方式渗入到大家的生活中。很多人会认为邮件营销已经落后。但事实上&#xff0c;邮件营销仍然有着广泛的市场需求&#xff0c;特别是对于出海或者做跨境电商的企业来讲&#xff0c;邮件营销仍然发挥…

深度学习笔记(续)——数值稳定性、模型初始化与激活函数

深度学习笔记[续]——数值稳定性、模型初始化与激活函数 引言回顾&#xff1a;没有激活函数参与&#xff0c;输入输出分布的变化情况 Xavier \text{Xavier} Xavier方法 存在激活函数的情况假设激活函数是线性函数激活函数的底层逻辑 总结 引言 继续上一节介绍激活函数在神经网…

Google IO 2023推出Android Studio官方AI工具Studio Bot

Google推出Android Studio官方AI工具Studio Bot Studio Bot 简介 在2023 Google I/O大会上&#xff0c;Google 宣布在 Android Studio 中推出了一款名为 Studio Bot 的新 AI 功能&#xff0c;它将为开发者提供更高效、智能的开发体验。Studio Bot 是一个基于机器学习的助手&a…

想要快速进入车载测试?这份车载面试题集锦送给你,建议收藏!

1.道路测试流程 测试场地 1.测试场地有哪些&#xff1f; 对于一些要求不太高/简单的测试场景可以找一些封闭的场地&#xff0c;如断头路或者是城市所在地当地政府提供的诸如智能网联专用道路之类的测试道路&#xff0c;对于复杂或相对要求高一些的测试场景可以到专业的国家智…