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");
    }
}


相关推荐
KiddoStone3 分钟前
多实例schedule job同步数据流的数据一致性设计和实现方案
java
前端若水7 分钟前
通过 Windows 共享文件夹 + 手机访问(SMB协议)如何实现
windows·智能手机
岁忧24 分钟前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
YuTaoShao27 分钟前
【LeetCode 热题 100】240. 搜索二维矩阵 II——排除法
java·算法·leetcode
考虑考虑1 小时前
JDK9中的dropWhile
java·后端·java ee
想躺平的咸鱼干1 小时前
Volatile解决指令重排和单例模式
java·开发语言·单例模式·线程·并发编程
hqxstudying2 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
·云扬·2 小时前
【Java源码阅读系列37】深度解读Java BufferedReader 源码
java·开发语言
春生野草2 小时前
关于SpringMVC的整理
spring
Bug退退退1233 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq