Java面向对像编程OOP


🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法

💫个人格言:"没有罗马,那就自己创造罗马~"

文章目录

OOP

java 复制代码
class MyDog{
public String name;
public String color;
public int age;

// --> 行为
public void barks(){
    System.out.println(name+":旺旺叫~");
}

public void wag(){
    System.out.println(name+":摇尾巴~");
}

    }

    //有public修饰的就是公共类
    //在 Java 中,public 修饰符通常用于声明公共类型和公共成员,它们的主要特点是可以被其他类(包括不同包中的类)直接访问。
    // 如果没有特殊的访问控制需求,public 成员允许程序的所有部分都可以自由调用和操作这些类型或成员。
    //因此,你可以简单地说,public 修饰的类型被称为公共类型,而 public 修饰的成员(如方法、字段)被称为公共成员。
    public class OOP {

        public static void main(String[] args) {

            //--> 通过关键字new可以实例化多个对象
            MyDog mydog1 = new MyDog();
            mydog1.name = "大黄";
            mydog1.age=20;
            mydog1.color = "white";

            //通过对象访问属性
            System.out.println("姓名:"+mydog1.name);
            System.out.println("年龄:"+mydog1.age);
            System.out.println("颜色:"+mydog1.color);

            //通过对象调用方法
            mydog1.barks();
            mydog1.wag();
// -----------------------------------------------------------------------------------------
            MyDog mydog2 = new MyDog();
            mydog2.name = "大白";
            mydog2.age = 23;
            mydog2.color = "black";

            System.out.println("姓名:"+mydog2.name);
            System.out.println("年龄:"+mydog2.age);
            System.out.println("颜色:"+mydog2.color);

            //通过对象调用方法
            mydog2.barks();
            mydog2.wag();

// ----------------------------------------------------------------------------------------- 
//我们可以通过new  关键字  实例化  多个对象
            MyDog dog3 = new MyDog();
            MyDog dog4 = new MyDog();
            MyDog dog5 = new MyDog();
            
        }
}

总结:

|---|---|---|---|---|---|---|---|---|---|
| new关键字用于创造一个对象的实例。 使用.来访问对象中的属性或方法。 同一个类可以创建多个实例。 ||||||||||


类和对象的说明

  • 👏思考

  • 1.引用可以指向引用吗?

  • 2.一个引用能不能同时指向多个对象?

  • 3.MyDog mydog1 = null代表mydog1这个引用指向一个null对象?

    • 1.不正确,引用只能指向对象(这里是两个引用同时指向一个对象)
    • 2.不可以,我们可以尝试给dog3这个引用创建多个对象,结果我们可以发现dog3这个引用是一个非常专注的宝子捏,它只能储存一个对象的地址呢。

    • 3.不正确,MyDog mydog1 = null代表mydog1这个引用不指向任何对象。

由于Java中基本数据类型无法直接进行交换,所以我们可以通过引用数据类型进行数据交换

java 复制代码
//1.创建数值这个类
class  MyValue{
    //2.赋予其对应的属性
    public  int val;

}

public class SwapTwoValue {

    public  static  void swap(MyValue value1,MyValue value2){//6.接收调用所传的参数
        //7.交换过程
        int temp = value1.val;
        value1.val = value2.val;
        value2.val = temp;

    }

    public static void main(String[] args) {
        //3.实例化两个MyValue的对象
        MyValue val1 = new MyValue();
        MyValue val2 = new MyValue();

        //4.设置已实例化的属性值
        val1.val = 666;
        val2.val = 999;

        //8.交换前的结果
        System.out.println("交换前:"+val1.val);
        System.out.println("交换前:"+val2.val);

        //5.调用方法,并将两个对象的引用作为参数传入方法
        swap(val1,val2);//两个对象的引用val1和val2分别作为参数传入到上面的swap方法里面

        //9.打印调用后的结果
        System.out.println("交换后"+val1.val);
        System.out.println("交换后"+val2.val);
    }
}

Java中有无static修饰的方法的使用区别:

✅️有static修饰的方法:

|------------------------------------|
| ⚠️可以通过类名直接调用,也可以通过对象调用,但推荐使用类名来调用。 |

  • ClassName.方法名()

❎️无static修饰的方法:

|------------------|
| ⚠️必需通过对象实例来调用方法。 |

  • 对象名.方法名()

总结:


java 复制代码
public class Date {
    public int year;//年
    public int month;//月
    public int day;//日

    //创建一个给年月日赋值的方法:
    public void SetDate(int y,int m,int d) {
        year = y;
        month = m;
        day = d;

    }

    //创建一个打印年月人的方法:
    public void PrintDate(){
            System.out.println("年:"+ year +"月:"+ month + "日:"+ day);
        }
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.SetDate(2024,9,12);
        date1.PrintDate();
    }

    }

java 复制代码
public class Date {
    //成员变量
    public int year;//年
    public int month;//月
    public int day;//日
    //____________________________________________________________
    //创建一个给年月日赋值的方法:
    public void SetDate(int year,int month,int day) {
        //局部变量优先使用
        year = year;
        month = month;
        day = day;

    }
    //创建一个打印年月人的方法:
    public void PrintDate(){
            System.out.println("年:"+ year +"月:"+ month + "日:"+ day);
        }
        
    public static void main(String[] args) {
        Date date1 = new Date();
        date1.SetDate(2024,9,12);
        date1.PrintDate();
    }
    }


在编程过程中会出现形参名和成员变量名一致的情况,局部变量会优先使用,因为int类型的默认值是0,所以调用PrintDate方法打印出来的结果是成员变量的默认值,即年:0月:0日:0,所以为了区分成员变量和局部变量,我们在Java中引入关键字this,这样我们的成员变量就能正确的被赋值为当前对象的值。


Java中关键字this引用的特性

this:表示当前对象的引用。

java 复制代码
public class Date {
    //成员变量
    public int year;//年
    public int month;//月
    public int day;//日
    //____________________________________________________________
    //创建一个给年月日赋值的方法: 谁调用当前这个方法 谁就是this
    public void SetDate(int year,int month,int day) {
        //局部变量优先使用
        this.year = year;
        this.month = month;
        this.day = day;

    }
    //创建一个打印年月人的方法:
    public void PrintDate(){
            System.out.println("年:"+ this.year +"月:"+ this.month + "日:"+ this.day);
        }

    public static void main(String[] args) {
        Date date1 = new Date();
        date1.SetDate(2024,9,12);
        date1.PrintDate();
    }
    }

this的特性

this的使用



Java构造方法

创建快捷键:fn+alt+insert

java 复制代码
public class Date {
    //成员变量 --> 定义在方法外面类里面
    public int year;//年
    public int month;//月
    public int day;//日

    //______普通方法的创建__________________________________________________
    //创建一个给年月日赋值的方法: 谁调用当前这个方法 谁就是this
    public void SetDate(int year,int month,int day) {
        //局部变量优先使用
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //创建一个打印年月人的方法:
    public void PrintDate(){
            System.out.println("年:"+ this.year +"月:"+ this.month + "日:"+ this.day);
//            this.haha();
        }

    public void haha(){
        System.out.println("haha!");
    }

    //______构造方法(Constructor)的创建__________________________________________________
    //fn+alt+insert生成构造方法的快捷键
    //构造方法的使用在创建对象那一刻就被调用了,是最先执行的
    public Date() {
        this(2020,8,6);
        this.year = 2024;
        this.month = 9;
        this.day = 13;
        System.out.println("执行了不带参数的构造方法....................");
    }
    //含三个参数的构造方法
    public Date(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("执行了带三个参数的构造方法...................");
    }

    public static void main(String[] args) {
        Date date1 = new Date();
    }
    }

救急不救穷,一旦你有构造方法编译器就不会再给你提供。


对比项 方法重载(Overloading) 方法重写(Overriding)
发生位置 同一个类中(比如说构造方法的创建) 子类对父类的方法进行重写
参数列表 (参数类型、数量或顺序)必须不同 必须相同
返回类型 可以相同或不同 必须相同
访问修饰符 无要求 子类的访问修饰符不能比父类更严格
静态/非静态方法 可以应用于静态方法和非静态方法 只能应用于非静态方法(静态方法不能被重写,但可以被隐藏)
注解 不需要 可以使用@Override注解以显式说明

1. 方法重载(Overloading)

  • 定义 :在同一个类中,可以定义 多个方法名相同但参数不同(参数类型、数量或顺序不同)的方法
  • 发生位置:发生在同一个类中。
  • 条件:方法名相同,但参数列表不同。返回值类型可以相同或不同。
  • 目的:提供同一操作的不同方式,允许根据不同的输入参数来执行不同的逻辑。
  • 例子
java 复制代码
class Example {
    // 重载方法,参数列表不同
    void print(int a) {
        System.out.println("Integer: " + a);
    }

    void print(String a) {
        System.out.println("String: " + a);
    }

    void print(int a, int b) {
        System.out.println("Two Integers: " + a + ", " + b);
    }
}

2. 方法重写(Overriding)

  • 定义 :在子类中 对从父类继承的方法进行重新定义(修改),使子类能够提供自己的实现。
  • 发生位置:发生在子类中,重写父类的方法。
  • 条件:子类方法必须与父类方法具有相同的方法名、相同的参数列表和相同的返回值类型。方法的访问修饰符不能比父类方法更严格(可以相同或更宽松),并且重写的方法不能比父类的方法抛出更多的受检异常。
  • 注解 :可以使用 @Override 注解来明确表示这是一个重写方法。
  • 目的:提供子类特定的实现,允许子类根据自己的需求修改父类的行为。
  • 例子
java 复制代码
class Animal {
    // 父类方法
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    // 子类重写父类方法
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}


相关推荐
xlsw_3 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹4 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫4 小时前
泛型(2)
java
超爱吃士力架4 小时前
邀请逻辑
java·linux·后端
南宫生4 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石5 小时前
12/21java基础
java
李小白665 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp5 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶5 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb