栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 面向对象

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 面向对象

目录
  • 1.类和对象
  • 2.单个对象内存图
  • 3.两个对象内存图
  • 4.两个引用指向同一对象内存图
  • 5.成员变量和局部变量
  • 6.private 关键字
  • 7.this 关键字
  • 8.this 内存原理
  • 9.封装
  • 10.构造方法

面向过程编程(POP, Procedure Oriented Programming)是一种以过程为中心的编程思想,功能的每一步都是自己实现的。

面向对象编程(OOP, Object Oriented Programming)是一种以对象为中心的编程思想,通过指挥对象实现具体的功能。

1.类和对象

类是对现实生活中一类具有共同属性和行为的事物的抽象。

对象是能够看得到摸得着的真实存在的实体(万物皆对象)。

类是对象的描述,对象是类的实体。

类的组成:

  1. 属性:事物的各种特征,在代码中通过成员变量来体现(类中方法外的变量)
  2. 行为:事物存在的功能(能够做的事情),在代码中通过成员方法来体现(和前面学的方法相比,去掉 static 关键字即可)

示例:Student.java

package com.qdu.object1;

public class Student {
    String name;
    int age;
    
    public void study() {
        System.out.println("学习");
    }
}

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

使用成员变量:对象名.成员变量

使用成员方法:对象名.成员方法();

示例:TestStudent.java

package com.qdu.object1;

public class TestStudent {
    public static void main(String[] args) {
        Student stu = new Student();
        
        System.out.println(stu.name);  // null
        System.out.println(stu.age);   // 0

        stu.name = "张三";
        stu.age = 23;

        System.out.println(stu.name);  // 张三
        System.out.println(stu.age);   // 23
        
        stu.study();
        
        System.out.println(stu); // com.qdu.object1.Student@b4c966a
        // @:分隔符
        // b4c966a:十六进制内存地址
        // com.qdu.object1.Student:全类名(即包名+类名)
    }
}

示例:定义一个手机类,然后定义一个手机测试类,在手机测试类中通过对象完成成员变量和成员方法的使用。

Phone.java

package com.qdu.test1;

public class Phone {
    String brand; // 品牌
    int price; // 价格
    
    public void call(String name) {
        System.out.println("给"+name+"打电话");
    }

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

TestPhone.java

package com.qdu.test1;

public class TestPhone {
    public static void main(String[] args) {
        Phone p = new Phone();
        p.brand = "大米";
        p.price = 2999;
        System.out.println(p.brand + "..." + p.price);
        
        p.call("阿强");
        p.sendMessage();
    }
}
2.单个对象内存图

3.两个对象内存图

4.两个引用指向同一对象内存图

注意:在堆内存中,对象或数组产生的地址通过任何方式都不能被找到时,就会被判定为内存中的“垃圾”,垃圾会被 Java 垃圾回收器在空闲的时候自动进行清理。

5.成员变量和局部变量

成员变量:类中方法外的变量。

局部变量:方法中的变量。

6.private 关键字

private 是一个权限修饰符。private 可以修饰成员(成员变量和成员方法)。被 private 修饰的成员只能在本类中才能访问。

针对 private 修饰的成员变量,如果需要被其他类使用,应提供相应的操作:

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

Student.java

package com.qdu.test2;

public class Student {
    private String name;
    private int age;

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

TestStudent.java

package com.qdu.test2;

public class TestStudent {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("张三");
        stu.setAge(23);

        System.out.println(stu.getName());
        System.out.println(stu.getAge());

        int age = stu.getAge();

        for(int i = 1; i <= age; i++){
            System.out.println("生日快乐");
        }

        stu.show();  // 仅仅是对数据做展示
    }
}
7.this 关键字

局部变量和成员变量如果重名,Java 使用的是就近原则。

this 关键字的作用:可以调用本类的成员(成员变量和成员方法),解决局部变量和成员变量的重名问题。

package com.qdu.test2;

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);
    }
}
package com.qdu.test2;

public class Test2Student {
    public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("张三");
        s1.setAge(23);

        s1.show();
    }
}

在使用成员变量的时候,系统会默认自动加上 this. 。

this 代表所在类的对象引用。方法被哪个对象调用,this 就代表哪个对象。

示例:

package com.qdu.mthis;

public class Student {
    private String name;

    public void setName(String name){
        System.out.println("[方法中打印this]");
        System.out.println(this);
        this.name = name;
    }
}
package com.qdu.mthis;

public class TestStudent {
    public static void main(String[] args) {
        Student s1 = new Student();
        System.out.println("[打印对象名]-->s1"); // com.qdu.mthis.Student@b4c966a
        System.out.println(s1); // com.qdu.mthis.Student@b4c966a
        s1.setName("张三");

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

        Student s2 = new Student();
        System.out.println("[打印对象名]-->s2"); // com.qdu.mthis.Student@2f4d3709
        System.out.println(s2); // com.qdu.mthis.Student@2f4d3709
        s2.setName("李四");
    }
}
8.this 内存原理

9.封装

面向对象三大特征:封装,继承,多态。

隐藏实现细节,仅对外暴露公共的访问方式。

问:封装指的就是私有吗?

答:私有仅仅是封装的一种体现。

封装常见的体现:

  1. 私有成员变量,提供 setXxx 和 getXxx 方法
  2. 将代码抽取到方法中,这是对代码的一种封装
  3. 将属性抽取到类当中,这是对数据的一种封装

封装的好处:

  1. 提高了代码的安全性
  2. 提高了代码的复用性
10.构造方法

构造方法,即构建/创造对象的时候所调用的方法。

格式:

  1. 方法名与类名相同,大小写也要一致。
  2. 没有返回值类型,连 void 都没有。
  3. 没有具体的返回值(不能由 return 带回结果数据)。

执行时机:

  1. 创建对象的时候调用,每创建一次对象,就会执行一次构造方法。
  2. 不能手动调用构造方法。
public class Student {
    //构造方法
    public Student() {
        System.out.println("我是Student类的构造方法");
    }
}

public class TestStudent {
    public static void main(String[] args) {
        //创建对象
        Student stu1 = new Student(); // 输出:我是Student类的构造方法
        Student stu2 = new Student(); // 输出:我是Student类的构造方法
        Student stu3 = new Student(); // 输出:我是Student类的构造方法
        stu1.Student(); // 报错,不能手动调用构造方法
    }
}

构造方法可用于给对象的数据(属性)进行初始化。

无参数构造方法:所有 Student 对象的 age 都是 18,不合理。

带参数构造方法:

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

如果定义了构造方法,系统将不再提供默认的构造方法。

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

建议:无论是否使用,都手动书写无参数构造方法和带参数构造方法。

package com.qdu.constructor;

public class Student {
    private String name;
    private int age;
    
    public Student(){}
    
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("我是Student类的构造方法");
    }

    public void show() {
        System.out.println(name + "..." + age);
    }
}
package com.qdu.constructor;

public class TestStudent {
    public static void main(String[] args) {
        Student stu1 = new Student("张三",23);
        stu1.show();

        Student stu2 = new Student();
    }
}

示例:JavaBean类,用于封装数据。

package com.qdu.test3;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public void show(){
        System.out.println(name + "..." + age);
    }
}
package com.qdu.test3;

public class TestStudent {
    public static void main(String[] args) {
        // 1.无参数构造方法创建对象,通过setXxx方法给成员变量进行赋值
        Student stu1 = new Student();
        stu1.setName("张三");
        stu1.setAge(23);
        stu1.show();

        // 2.通过带参数构造方法直接给属性进行赋值
        Student stu2 = new Student("李四",24);
        stu2.show();
    }
}

在 IDEA 中快速生成默认无参数构造方法及带参数构造方法:

在 IDEA 中快速生成 setXxx 和 getXxx 方法:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/462882.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号