Java 类,对象,方法部分的笔记

第六章 Java_类与对象

java 面向对象的语言

面向对象的三大特征:封装、继承、多态

6.1、面向过程与面向对象编程的区别

面向过程:自己去完成

面向对象:不自己去做,让对象去完成

1)面向过程的思维解决问题:

1.凡事亲力亲为,效率比较低

2.不符合现在企业开发的要求 - 效率

如:数组 for循环输出,手写冒泡排序,选择排序 - 底层实现

2)面向对象的思维解决问题:

1.符合目前人们的思维的习惯。

2.效率比较高,符合企业开发的要求。

3.面向对象,把曾经在过程中的 执行者 ,转变为了对象中 指挥者

如:Arrays.toString() ;Arrays.sort()

6.2、类与对象概述

1)什么是对象?

对象:在现实世界中,实实在在存在的个体,就是对象,万物皆对象。

通过对象的 特征行为 ,来描述该对象

2)什么是类?

定义类:类用来 描述 对象的特征(属性)和行为(方法),是一个抽象的概念

类是对象的抽象(模板),对象是类的具体化

先定义类,然后再创建对象

a)什么是属性?

对象的特征

b)什么是方法?

对象的行为

3)类和对象的关系和区别

区别:

类是抽象的;

类是抽象的概念,仅仅代表事物的模板,比如说“女朋友”、“男朋

友”。

对象是具体的;

对象是一个能够“看得到,摸得着的”具体的实体,比如石榴姐。

关系:

  1. 对象是类在现实世界的体现。类是对象一个抽象描述。

女朋友 这个抽象的概念 具体 来说 : 石榴姐对象

石榴姐 这个 具体的概念 抽象 来说: 女朋友类

  1. 类是对象定义的数据类型;对象是类的实例化,是实际在内存

中保存的类这种类型的一个值。

4)如何定义类

语法:

public class 类名{
    //定义类的属性
    数据类型 属性名;
    //定义类的方法
    public void/返回值类型 方法名(形参){
        //方法体
        return 返回值;
   }
} 

案例:

学生类: 属性: 姓名,年龄,地址,性别,邮箱,班级。

方法:study() sleep() eat()

package demo;

public class Student {
    //学生的特征(属性) - 定义在类中的变量 - 成员变量(全局变量)
    String name;  //姓名
    int age;  //年龄
    String address;  //地址
    char sex;  //性别
    String email;  //邮箱
    String classes;  //班级

    //学生的方法
    public void study(){  //学习
        System.out.println("姓名是:" + name + ",年龄是:" + age + ",地址是:" + address +
                ",性别是:" + sex + ",邮箱地址是:" + email + ",班级是:" + classes);
    }
    public void sleep(){
        System.out.println("学完睡觉了");
    }  //睡觉
    public void eat(){  //吃东西
        //局部变量
        String food;
        food = "狗粮"; //如果不赋值那么输出的话编译器会报异常
        System.out.println("food = " + food);
    }

}

汽车类:

package demo;

//汽车类
public class Car {
    String brand = "兰博基尼"; //品牌
    String color; //颜色
    int num; //轮子数

    public void run(){
        int count = 2; //局部变量
        System.out.println("品牌是" + brand + "的" + num + "个轮子的" + color + "的车在跑");
        System.out.println("可以坐" + count + "个人");
    }
}

5)如何通过类创建对象

创建对象并且使用的步骤:

语法:

1) 创建对象:
   //类是对象定义的数据类型;对象是类的实例化,是实际在内存
中保存的类这种类型的一个值。
   类名 对象名 = new 类名();
2)使用对象【调用】属性和方法
   调用属性: 对象名.属性名;
   给对象属性赋值:对象名.属性名=值;
   调用方法:对象名.方法名();

注意:

  1. 通过类来创建对象,所以肯定是要先定义类,再创建对象

  2. 只要通过new的方式创建,那么就可以创建多个对象,只要new

了,就一个新对象。

  1. 不同的对象,地址值是不一样的,开辟了不同的内存空间!

  2. 不同的对象,是不能重名的!

6)全局变量和局部变量:

全局变量:

1)定义在类中,如果没有给全局变量赋值,那么全局变量(成员变量)会有初始值

2)全局变量的 默认初始值

String - null

int - 0

char - 空字符

float - 0.0

double - 0.0

boolean - false

局部变量:

1)定义在方法中,代码块(for,while)中

2)局部变量 必须要赋初始值 ,才能使用,否则会出异常。

案例

1、创建学生对象,并给对象属性赋值,然后调用属性和方法。

//学生类的测试类
package demo;

public class StuTest {
    public static void main(String[] args) {
        //创建对象s1
        Student s1 = new Student();
        //调用属性赋值
        s1.name = "胡巴";
        s1.age = 21;
        s1.sex = '男';
        s1.address = "湖北";
        s1.email = "56565@163.com";
        s1.classes = "计科1903班";
        //调用方法
        s1.study();
        s1.sleep();
        System.out.println("s1 = " + s1); //打印的是一个地址值  demo.Student@14ae5a5
        //创建对象s2
        Student s2 = new Student();
        s2.name = "张三"; //调用属性赋值
        s2.study(); //姓名是:张三,年龄是:0,地址是:null,性别是: ,邮箱地址是:null,班级是:null
        s2.eat(); //food = 狗粮
        System.out.println("s2 = " + s2); //打印的是一个地址值  demo.Student@7f31245a

    }
}

2、创建汽车对象,并给对象属性赋值,然后调用属性和方法。

//汽车类的测试类
class CarTest{
    public static void main(String[] args) {
        //创建对象
        Car car = new Car();
        //调用属性赋值
        car.color = "红色";
        car.num = 4;
        //调用方法
        car.run();
    }
}

7)对象的内存图解

栈内存(stack) : 连续的存储空间,栈内存的原则:先进后出(手枪),

后进先出,一般存储是局部变量。

堆内存(heap):不连续的存储空间,一般存储是new出来的对象,

是类的实例化对象。

方法区(method) : 在堆内存中,存储的是1、类的代码信息 。

基本数据类型在栈内存中,引用数据类型都在堆内存中:数组、类

...

基本数据类型的默认值:

整型: 0

浮点型:0.0

布尔类型:false

char类型:\u0000 空字符

引用数据类型的默认值:null

示意图:

image

特点:

1)定义在类中属性 - 成员变量(全局变量) - 有默认初始值

2)成员变量保存在堆内存中

3)修改成员变量,实际上,修改的是成员变量在堆内存中的值。

4)局部变量定义在方法中,或者代码块中。

5)局部变量必须要给初始值才能使用!!!

6)局部变量保存在栈内存中!

8)UML类图

UML (Unified Modeling Language) : 统一模型构建语言,用来

对面向对象的系统产品进行说明,可视化,编辑文档的统一语言。

UML类图作用:可视化的来描述类的信息。

示意图

image

修饰符的说明

public :    +
protected : #
default :   ~
private :   -

定义属性的方式:

修饰符 属性名  : 属性类型 [=默认值]
    
[]: 表示可有可无

定义方法的方式:

修饰符 方法名(参数列表) : 返回值类型

9)包的使用和定义方式

(1)包的定义

使用包来对 java 类进行管理

(2)包名命名方式

一般使用反域名法来定义包名

百度域名:www.baidu.com

反域名:com.baidu.demo.user.xx.xxx

规范:包名全部小写

IDEA 包名逐层显示

image

(3)包的访问

package com.xunfang.demo;//当前类所在的路径

(4)import 导包

import java.util.Scanner;//导入包路径

10)对象数组

数组 :

double [] scores = new double[5]; : 基本类型的数据

String [] xx = new String[5]; : 字符串类型

对象类型: 类是对象这种数据的类型!!!

对象数组:数组中保存的是 对象

数组的类型:类名

6.3、方法

1、方法概念

方法(函数):解决java中的问题的方式和方法。

2、方法的好处

方法的好处1:使用方法来对某些问题进行封装操作来解决问题

方法的好处2:就是面向对象的体现,封装了操作,那么我们只需要通过对象去调用方法,就能解决问题,大大提高了代码的质量和维护效率

在 java 程序中,设计代码的规则:高内聚,低耦合

3、方法如何定义

1)语法

public 返回值类型 方法名(形参类型1 形参名1, 形参类型2 形参名2......){
	//方法名
	return 返回值;
}

2)解释语法

访问修饰符:public(公共的,公有的),private(私有的),protected(受保护的),default(默认的)

返回值类型:

  1. 定义了方法的返回值的类型(基本类型,引用类型(对象,String,对象数组,集合......) ),注意:只是定义类型,不是具体的值!

  2. 返回值类型,只有有返回值时,才定义。

  3. 返回值类型和返回值,一定是成对出现的!

    void :表示没有返回值,不能写 return

    方法名:方法的名字,遵循标识符的写法,驼峰命名法

    形参类型:形式参数类型,定义了形参的类型(基本数据类型,引用类型(对象,String,对象数组,集合......)),不是具体的值

    return:返回的关键字,用来结束方法

    返回值:是一个具体的值(表达式,变量...)

4、方法的分类

a)无参无返回值方法

语法

public void 方法名(){
	//方法体
	//说明:完全依靠方法体来进行操作和输出
}

其他类中,如何调无参无返回值的方法

  1. 创建对象
  2. 对象名.方法名()

b)有参无返回值的方法

语法

public void 方法名(形参类型1 形参名1,形参类型2 形参名2){
    //方法体
}

形式参数和实际参数的概念

形式参数:定义在方法的 () 中,用来接收实际参数传递的值的类型,不能设置具体的值。

​ 参数型的范围:基本类型,引用类型(对象,对象数组,String...)

实际参数,定义在调用方法时的方法()中,用来传递实际的参数,

形参和实参注意问题:

1、实际参数和形式参数的类型,必须保持一致!

2、实际参数和形式参数的个数,也要保持一致!

3、实际参数和形式参数的顺序,也要保持一致!

其他类中,如何调用有参无返回值的方法:

  1. 创建对象

  2. 对象名.方法名(实参的值...)

c)无参有返回值的方法

语法:

public 返回值类型 方法名(){
    //方法体
    return 返回值; 
} 

注意问题:

1.return返回的结果(值,变量,表达式,对象数组,对象)

2.如果方法有返回值类型,那么必须要写return 返回值;

3.调用有返回值的方法时,方法的返回值必须要接收,如果不接收,那么方法调用就没有意义了!

其他类中,如何调用无参有返回值的方法:

1.创建对象

2.返回值类型 返回值名称 = 对象名.方法名();

d)有参有返回值的方法

语法:

public 返回值类型 方法名(形参类型1 形参名1,形参类型2 形参名2){
    //方法体
    return 返回值; 
}

其他类中,如何调用有参有返回值的方法:

1.创建对象

2.返回值类型 返回值名称 = 对象.方法名(参数的值...);

5、定义和调用方法的注意事项

1)形参和实参的类型,个数,顺序要保存一致!

2)如果方法有返回值,必须接收返回值!

3)返回值必须和返回值类型保存一致!

4)形参不能设置具体的值,实参要设置具体的值!

5)如果方法有返回值,那么必须要写return;

6、形参和实参的区别

1、出现位置不同:

形参:写在方法的定义的()中

实参:写在方法调用的()中

2、赋值不同:

形参:接收实参传递的值,只是定义类型

实参:实际给方法的形参传递的值

7、方法重载

1)为什么重载

问题:首先,这些方法的作用类似,方法名称每个都不一样,这样,再调用的时候,容易记不住,使用起来不方便

2)方法重载的规则

1、方法重载必须在同一个类中

2、方法的名称 必须一样 ,但是方法的参数的 个数,类型,顺序 只要有1个不同,就可以实现重载

3、方法的返回值类型对方法重载没有影响

3)案例

package com.xunfang.demo;

import java.util.Scanner;

public class User {
    //调用方法,验证用户是否登录成功。根据登录结果提示对应的消息
    public String userName = "admin1";
    public String pwd = "111111";
    public boolean login(String inputUserName,String inputPwd){
        if (inputUserName.equals(userName) && inputPwd.equals(pwd)){
            return true;
        }
        return false;

    }
}

class UserTest {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        User user = new User();
        System.out.println("请输入用户名:");
        String inputUserName = input.next();
        System.out.println("请输入密码:");
        String inputPwd = input.next();
        boolean login = user.login(inputUserName,inputPwd);
        if (login){
            System.out.println("登录成功");
        }else {
            System.out.println("登录失败");
        }
    }
}

8、全员变量与局部变量的区别

1)概念

全局变量:定义在类中,方法的外面,也叫做成员变量

​ 作用范围:类中的任何位置都可以使用

局部变量:定义在方法中, 方法的形参中 ,代码块中({} , for, if...)

​ 作用范围:只在当前方法或者代码块中有效

2)区别

初始值不同:

成员变量:默认有初始值,可以直接使用,具体参考之前的笔记

局部变量:需要程序员手动赋初始值才能使用,否则编译异常。

定义的位置不同:

成员变量:定义在类中,方法的外面

局部变量:定义在方法中, 方法的形参中 ,代码块中({} , for, if...)

在内存中位置不同:

成员变量:保存在堆内存的对象中

局部变量:保存在栈内存中的方法中

生命周期的不同:

成员变量:随着对象的销毁,就没有了

局部变量:方法弹栈,局部变量就销毁了

使用范围不同:

全局变量:

作用范围:类中的任何位置都可以使用

局部变量:

作用范围:只在当前方法或者代码块中有效

3)推荐方法

根据实际的需求来:

全局变量: 用在,如果这个变量,需要全局使用,定义成全局的

局部变量:用在,如果该变量,只在当前方法中用,定义成局部的。(推荐)

4)提醒

成员变量和局部变量可以重复定义

当成员变量和局部变量同名的时候,优先使用局部变量

如果全局变量和局部变量都定义成同一个变量名称,调用谁?

结论:优先调用局部变量!!

9、匿名对象

普通创建对象: 类名 对象名 = new 类名();

匿名对象:new 类名().调用方法();

class Test05{
    public static void main(String[] args) {
        //匿名对象:
        //1) 匿名对象也是有名字的:java提供Test05$1,用完之后,会销毁该名字,只能使用一次
        //2) 匿名对象只能使用1次
        //Test05$1
        new TestDemo().showInfo();
        new TestDemo().showInfo();
   }
}

10、练习

1、对象数组做参数

需求说明:定义学员类,存储学员信息(属性:姓名、成绩;方法:显示个人成绩)。编写修改成绩类,使用学员对象数组作为参数,实现学员成绩修改,条件为:如果学员成绩小于60,集体提高2分。最终输出修改成绩后每个学员的成绩,

package homework;

import java.util.Scanner;

public class Student {
    //定义学员类,存储学员信息(属性:姓名、成绩;方法:显示个人成绩)。
    // 编写修改成绩类,使用学员对象数组作为参数,实现学员成绩修改,
    // 条件为:如果学员成绩小于60,集体提高2分。最终输出修改成绩后每个学员的成绩
    String name;
    double score;
    public void show(String name,double score){
        System.out.println(name + "的成绩是:" + score);
    }
}


class UpdateScore{
    public void update(Student[] students){
        for (int i = 0; i < students.length; i++) {
            if (students[i].score < 60){
                for (int j = 0; j < students.length; j++) {
                    students[j].score += 2;
                }
            }
        }

    }
}


class Test01{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Student[] students = new Student[3];
        for (int i = 0; i < students.length; i++) {
            Student student =new Student();
            System.out.print("请输入学生姓名:");
            student.name = input.next();
            System.out.print("请输入学生成绩:");
            student.score = input.nextDouble();
            students[i] = student;
            System.out.println();
        }
        new UpdateScore().update(students);
        for (int j = 0; j < students.length; j++) {
            students[j].show(students[j].name,students[j].score);
        }
    }
}

2、带多个参数的方法

需求说明:正确使用带参方法实现学员信息管理,增加学员姓名;在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功

package homework;

import java.util.Scanner;

public class Students {
    //正确使用带参方法实现学员信息管理,增加学员姓名;
    // 在保存了多个学生姓名的数组中,指定查找区间,查找某个学生姓名并显示是否查找成功
    String[] stuNames;
    public void showInfo(){
        for (int i = 0; i < stuNames.length; i++) {
            System.out.print(stuNames[i] + "    ");
        }
    }
    public boolean find(int start,int end,String findname){
        for (int j = start - 1; j < end; j++) {
            if (findname.equals(stuNames[j])){
                return true;
            }
        }
        return false;
    }
}


class Tset05{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Students students = new Students();
        String[] stuNames = new String[5];
        students.stuNames = stuNames;
        for (int i = 0; i < stuNames.length; i++) {
            System.out.print("请输入学生姓名:");
            stuNames[i] = input.next();
        }
        System.out.println("本班学生列表:");
        students.showInfo();
        System.out.print("\n\n请输入开始查找的位置:");
        int start = input.nextInt();
        System.out.print("请输入结束查找的位置:");
        int end = input.nextInt();
        System.out.print("请输入查找的姓名:");
        String findname = input.next();
        System.out.println("\n*****查找结果*****");
        if (students.find(start,end,findname)){
            System.out.println("找到了!");
        }else {
            System.out.println("没找到!");
        }
    }
}
posted @   Thecong  阅读(68)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示