Java面向对象编程基础

发布于:2024-10-15 ⋅ 阅读:(96) ⋅ 点赞:(0)

在这里插入图片描述


一、面向对象完成具体功能的操作的三步流程

步骤1:创建类,并设计类的内部成员(属性、方法)
步骤2:创建类的对象。比如:Phone p1=new Phone();
步骤3:通过对象,调用其内部声明的属性或方法,完成相关的功能

二、对象在内存中的分配

创建类的一个对象给对象赋值
在这里插入图片描述
创建类的2个对象给对象赋值
在这里插入图片描述

在这里插入图片描述

创建类的多个对象时:每个对象在堆空间中有一个对象实体。每个对象实体中保存着一份类的属性。
如果修改某一个对象的某属性值时,不会影响其他对象此属性的值。

强调:
Person p1 = new Person();
Person p3 = p1;
说明:此时p1,p3两个变量指向了堆空间中的同一个对象实体(p1,p3保存的地址值相同)。如果通过其中某一个对象修改属性时,会导致另一个对象的属性值改变。

三、类的成员之一:属性

1.变量的分类:

角度一:按照数据类型来分:基本数据类型(8种)、引用数据类型(数组、类、接口、枚举、注解、记录)
角度二:按照变量在类中声明的位置的不同:成员变量(或属性)、局部变量(方法内、方法形参、构造器内、构造器)

2.成员变量与局部变量

相同点:

变量声明的格式相同:数据类型 变量名=变量值
变量都有其有效的作用域。出了作用域,就失效了。
变量必须先声明,后赋值,再使用。

不同点:
a、类中声明的位置的不同:
属性:声明在类内,方法外的变量
局部变量:声明方法、构造器内部的变量

b、在内存中分配的位置不同(难):
属性:随着对象的创建,存储在堆空间中。
局部变量:存储在栈空间中

c、生命周期:
属性:随着对象的创建而创建,随着对象的消亡而消亡。
局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡。

d、是否可以有权限修饰符进行修饰:
都有哪些权限修饰符:public、protected、缺省、private。(用于表明所修饰的结构可调用的范围的大小)
属性,是可以使用权限修饰符进行修饰的。暂时还未讲封装性,所以大家先不用写任何权限符。
而局部变量,不能使用任何权限修饰符进行修饰的。

e、是否有默认值(重点):
属性:都有默认初始化值;意味着没有给属性进行显示初始化值,则会有默认初始化值
局部变量:都没有默认初始化值。意味着,在使用局部变量之前,必须显示的赋值,否则报错。

注意:对于方法的形参而言,在调用方法时给形式参数赋值。

3.案例

声明员工类Employee,包含属性:编号id、姓名name、年龄age、薪资salary。
声明Employeellst测试类,并在main方法中,创建2个员工对象,并为属性赋值,并打印两个员工的信息。

package com;

public class Exec_Employee {
    int id;  //编号
    String name;  //姓名
    int age;  //年龄
    double salary;  //工资
}

package com;

public class Exec_EmployeeTest {
    public static void main(String[] args) {
        Exec_Employee e1 = new Exec_Employee();
        Exec_Employee e2 = new Exec_Employee();
        e1.id = 1;
        e2.id = 2;
        e1.age = 18;
        e2.age = 20;
        e1.name = "jimmy";
        e2.name = "jimmy1";
        e1.salary = 30000.98;
        e2.salary = 40000.98;

        System.out.println("员工编号为:" + e1.id + "工资为:" + e1.salary);
        System.out.println("员工编号为:" + e2.id + "工资为:" + e2.salary);

    }
}

员工编号为:1工资为:30000.98
员工编号为:2工资为:40000.98

4.案例

package com.exec2;

/**
 * package:com.exec2
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 14:05
 */
public class Mydate {
    String year;
    String month;
    String day;
}

package com.exec2;

/**
 * package:com.exec2
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 14:04
 */
public class Employee {
    int id;
    String name;
    Mydate brithday; //todo 生日

}

package com.exec2;

/**
 * package:com.exec2
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 14:08
 */
public class EmploayTest {
    public static void main(String[] args) {
        Employee e = new Employee();
        e.id = 1;
        e.name = "jimmy";
        //todo
        e.brithday = new Mydate();
        e.brithday.year = "2024";
        e.brithday.month = "08";
        e.brithday.day = "08";

        System.out.println("员工信息为:" + e.name + ",生日:" + e.brithday.year + e.brithday.month + e.brithday.day);


    }
}

员工信息为:jimmy,生日:20240808

四、方法

1 声明举例

public void eat() {
public void play(String hobby) 
public String sleep(int hour) 
public int getAge()

2 方法声明的格式

权限修饰符 [其他修饰符] 返回值类型 方法名(形参列表){
		方法体
}

a、权限修饰符

四种:private、缺省、protected、public

b、返回值类型

描述当调用完此方法时,是否需要返回一个结果。

  • 无返回值类型:使用void

  • 有返回值类型:需要指明返回的数据类型,可以是基本数据类型,也可以是引用数据类型。

    • 需要在方法内部配合“return”+返回值类型的变量或者常量。
  • 我们在在声明方法时,要不要提供返回值类型呢?具体问题具体分析。

c、方法名

属于标识符。需要满足见名知义

d、形参列表

属于局部变量,可以有多个。
分类:无形参列表、有形参列表

3 案例

创建Person类的对象,设置该对象的name、age和gender属性,
调用study方法,输出字符串"studying";
调用showAge()方法,返回age值;
调用addAge(int addAge)方法给对象的age属性值增加addAge岁。比如:2岁。

package com.method.exec1;

/**
 * package:com.method.exec1
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 16:27
 */

public class Exec1 {
    String name;
    int age;
    char gender;

    public void study() {
        System.out.println("sudying");
    }

    public int showAge() {
        return age;
    }

    public void addAge(int addAge) {
        age += addAge;
        System.out.println(age);
    }


}

package com.method.exec1;

/**
 * package:com.method.exec1
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 16:32
 */
public class Exec1Test {
    public static void main(String[] args) {
        Exec1 e = new Exec1();
        e.study();
        System.out.println(e.showAge());

        e.addAge(5);

    }
}

五、方法的重载

1、定义

在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。满足这样特征的多个方法,彼此之间构成方法的重载。

总结为:“两同一不同”
两同:同一个类、相同的方法名
一不同:参数列表不同。①参数个数不同②参数类型不同
注意:方法的重载与形参的名、权限修饰符、返回值类型都没有关系。

2、如何判断两个方法是相同的呢?

方法名相同,且形参列表相同。(形参列表相同指的是参数个数和类型都相同。
要求:在一个类中,允许存在多个相同名字的方法,只要他们的形参列表不同即可。

package com.method_more;

/**
 * package:com.method_more
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 17:25
 */
public class OverloadTest {
    public static void main(String[] args) {

    }

    public void add(int i, int j, int k) {

    }

    public void add(String s1, String s2) {

    }

    public void add(int i, String s) {

    }

    public void add(String s, int i) {

    }
}

在这里插入图片描述

在这里插入图片描述

六、可变个数形参的方法

1、使用场景

在调用方法时,可能会出现方法形参的类型是确定的,但是参数的个数不确定。此时,我们就可以使用可变个数形参的方法。

格式 : (参数类型 … 参数名)

a、可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为:0个、1个或多个。
b、可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载。
c、特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载。
d、可变个数的形参必须声明在形参列表最后
e、可变个数的形参最多再一个方法的形参列表中出现1次

package com.method_more;

/**
 * package:com.method_more
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 17:56
 */
public class ArgsTest {
    public static void main(String[] args) {
        ArgsTest test = new ArgsTest();
        test.print();
        test.print(1);
        test.print(1, 2);
        test.print(1, 2, 4);
    }

    public void print(int... nums) {
        System.out.println("1111");
    }

    public void print(int i) {
        System.out.println("2222");
    }

    public void print(int i, int j) {
        System.out.println("3333");
    }
}

七、方法的值传递机制

如果是基本数据类型的变量,则将此变量保存的数据值传递出去。
如果是引用数据类型的变量,则将此变量保存的地址值传递出去。

package com.method_more;

/**
 * package:com.method_more
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 18:26
 */
public class ValueTransferTest {
    public static void main(String[] args) {
        //todo 1、基本数据类型的局部变量
        int m = 10;
        int n = m;

        System.out.println("m=" + m + ",n=" + n); //10 10

        m++;

        System.out.println("m=" + m + ",n=" + n);//11 10

        //todo 2、引用数据类型的局部变量

        // 2.1数组类型
        int[] arr1 = new int[]{1, 2, 3, 4, 5};
        int[] arr2 = arr1;    //todo 传递的是地址值

        arr2[0] =10;
        System.out.println(arr1[0]);  //10

        //todo 2.2、对象类型
        Order order1 = new Order();
        order1.orderId=1001;


        Order order2 = order1;
        System.out.println(order2.orderId);  //1001

    }

}


class Order{
    int orderId;
}

m=10,n=10
m=11,n=10
10
1001

规则:实参给形参赋值的过程
如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参。
如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参。

package com.method_more;

/**
 * package:com.method_more
 *
 * @Author jimmy-yan
 * @Create 2024/10/14 18:52
 */
public class ValueTransferTest1 {

    int age;
    public static void main(String[] args) {

        ValueTransferTest1 test = new ValueTransferTest1();
        //1、对于基本类型的数据变量
        int m = 10;

        test.method1(m);

        System.out.println("m=" + m); //10
        

    }
    public void method1(int m) {
        m++;
    }

}

面试题:Java中的参数传递机制是什么?值传递

在这里插入图片描述

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到