【Java基础】面向对象

一、面向对象概念

面向对象编程: OOP

C语言: 面向过程编程语言

C++语言: 半面向过程半面向对象

Java语言: 完全面向对象编程


面向: 是指针对,关于的意思

面向过程: 针对过程设计代码

  • 举例: 玩五子棋游戏,吃饭

  • 设计棋盘,设计规则,设计棋手,判断胜负

  • 面粉,和面,做面条,做羊肉,下锅,放料,吃

面向对象: 针对对象设计代码

  • 设计棋盘对象, 设计棋手对象

  • 设计厨师对象


面向对象编程,针对对象设计代码,不去过多的考虑细节

面向对象最后,肯定是有面向过程的

二、面向对象编程

面向对象编程OOP

类: java中的类是class,

  • 类是一个统称,是一系列具有相同特征和行为的对象的集合

  • 人类,手机类

特征: 就是属性

  • 属性就是描述类的

  • 人类的特征(属性)

    • 姓名 性别 身高 体重 年龄 国籍 肤色

  • 手机类的特征(属性)

    • 品牌 价格 颜色 内存 电池容量

行为: 就是动作

  • 动作就是功能,即函数.方法

  • 人类的方法(功能,动作)

    • 吃饭,睡觉,工作,学习

  • 手机类的方法(功能,动作)

    • 打电话,发短信,玩游戏,砸核头

对象:

  • 是类的具体体现

  • 人类的对象

    • 现在的同桌

  • 手机类的对象

    • 手里的手机

类,属性,方法,对象 之间的关系

  • 类里面有属性和方法

  • 对象是类创建出来的

  • 对象中拥有具体的属性,能执行的方法

三、第一个类: 人类

java中的类就是class,就是天天见的class,现在创建类的时候要

  • 类名 见名知意

  • 首字母大写,不要特殊符号,数字不要放开头

public class People{
    
}

类中有属性和方法

  • 属性,就是变量,使用 数据类型 属性名;

    • 位置: 放在类中,方法外

  • 方法,就是之前的方法(返回值,方法名,参数)

public class People{
    int age;// 年龄属性
    String name;// 姓名属性
    
    // 吃饭的方法
    public void eat(String food){
        System.out.println("吃"+food);
    }
}

练习: 手机类

  • 属性 价格,颜色,款型

  • 方法: 打电话,玩游戏

public class Phone {
​
    String brand;// 品牌
    String color;// 颜色
    double price;// 价格
​
    public void call(String num){
        System.out.println("给"+num+"打电话" );
    }
​
    public String play(String game){
        System.out.println("玩 《"+game+"》" );
        return "Victory";
    }
}

四、创建对象

4.1 创建一个对象

类是模板,对象需要由类创建出来,语法

  • 类名 对象名 = new 类名();


为什么创建对象?

  • 因为类是模板,无法使用,需要创建出对象,才能具体体现出属性,以及执行方法

  • 即创建对象的目的是为了使用属性和方法

创建对象

public class Test1OOP {
​
    // 执行代码
    public static void main(String[] args) {
        // 创建对象的语法
        // 类名 对象名 = new 类名();
        People people = new People( );
    }
}

对象使用属性

        String name = people.name;
        int age = people.age;
        String sex = people.sex;
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
​
        // 属性赋值
        people.name = "刘备";
        people.age = 38;
        people.sex = "男";
​
        // 再次取值查看属性
        System.out.println(people.name);
        System.out.println(people.age);
        System.out.println(people.sex);

使用方法        

people.eat("烩面");
String result = people.sleep( );
System.out.println("睡得如何? " + result );

image-20240523113437185

完整代码

public class Test1OOP {
​
    // 执行代码
    public static void main(String[] args) {
        People people = new People( );
        String name = people.name;
        int age = people.age;
        String sex = people.sex;
        System.out.println("name = " + name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
​
        // 属性赋值
        people.name = "刘备";
        people.age = 38;
        people.sex = "男";
​
        // 再次取值查看属性
        System.out.println(people.name);
        System.out.println(people.age);
        System.out.println(people.sex);
        people.eat("烩面");
​
        String result = people.sleep( );
        System.out.println("睡得如何? " + result );
    }
}

4.2 类创建多个对象

  • 一个类是可以创建多个对象

  • 由类创建出的每个对象中都有属于自己的属性和方法

  • 对象和对象之间的属性和方法互不影响

public static void main(String[] args) {
        People p1 = new People( );
        p1.name = "刘备";
        System.out.println(p1.name );// 刘备

        People p2 = new People( );
        System.out.println(p2.name );// null
		p2.age = 40;
        
        People p3 = new People( );
        System.out.println(p3.name );// null
        System.out.println(p3.age );// 0
    }

4.3 多个引用指向同一对象

引用其实就是地址值

通过地址值引用内存中的对象

通过引用传递,将引用地址值赋值给了另外一个变量p2

即p1和p2指向同一个对象

public static void main(String[] args) {
        People p1 = new People( );
        p1.name = "刘皇叔";

        People p2 = p1;

        System.out.println(p2.name);// 皇叔
        p2.age = 40;

        System.out.println(p1.age );// 40
}

五、内存图

5.1 创建一个对象的内存图

  • 方法执行进栈

  • 每次new都会进堆,开辟空间,分配地址值


创建对象时,属性会初始化

image-20240523144445469

5.2 创建多个对象图

  • 一个类是可以创建多个对象

  • 由类创建出的每个对象中都有属于自己的属性和方法

  • 对象和对象之间的属性和方法互不影响

image-20240523145543513

5.3 多个引用指向同一个对象

image-20240523150448477

六、成员变量和局部变量

成员变量局部变量
位置类中方法外方法内
使用范围类中所有方法都可使用只能在当前方法内使用
初始值在new的时候自动赋默认值手动主动赋值
内存位置在堆中在栈中的方法栈帧中
生命周期随着创建对象出现在堆中 随着使用引用被垃圾回收而消失随着方法被调用而进栈出现 随着方法执行完弹栈而消失

public class Dog {
    String name;// 姓名
    int age; // 年龄
    String type;// 品种
    public void eat(String food){
        int num = 2;
        // name是使用外部的成名变量
        System.out.println(name+"狗吃"+food+",吃了"+num+"份" );
    }

    public void play() {
        // name是使用外部的成名变量
        // 成员变量可以被所有方法使用
        System.out.println(name+"玩耍" );
    }
}

特殊情况: 成员变量和局部变量会重名

  • 允许成员变量和局部变量重名

  • 重名时默认使用局部变量, (就近原则)

    • 因为成员变量在堆中,局部变量在方法栈帧,方便调用

  • 当重名时,可以使用this.属性来特指调用成员变量

public void jiao(){
        String name = "小黑";
        System.out.println(name+"小狗会叫" );
        System.out.println(this.name+"小狗会叫" );
        System.out.println("this -->" +this );
    }

image-20240523161015653

七、构造方法

7.1 什么是构造方法?

构造方法,又称构造函数,又称构造器(constructor)

是类中的一个方法,作用是

  • 用来构造/创建对象

  • 属性赋初始值

    • 无参构造属性初始化默认值

    • 有参构造属性初始化指定值

7.2 怎么写?

构造方法,虽然是方法,但是与之前的方法有些区别

  • 构造方法没有返回值,连void也没有

  • 方法名必须是当前类的类名

    public class People{
        // 构造方法
        public People(){
    ​
        }
        // 普通方法
        public void eat(){
    ​
        }
    }

7.3 如何用?

构造方法的作用是创建对象,当然要在创建对象时使用

  • 创建对象的语法

    • 类名 对象名 = new 类名();

    • 类名 对象名 = new 构造方法();

    • 类名 对象名 = new 构造方法(参数1,参数2);

7.4 构造方法特点

  • 每个类默认都有一个无参构造方法,默认是隐藏的

  • 也可以显式的写出

  • 但是,显式的写出任何一个构造方法,默认的构造方法不再提供

7.5 有参构造

但是现在有个问题,通过构造方法创建出的对象的属性都是默认初始值,后续还要自己再单独给属性赋上指定值; 那么能不能像创建数组一样,在创建对象时,直接指定属性,即创建出来的对象属性就有指定值

---> 当然可以,那就是 有参构造方法

有参构造就是有参数的构造方法,目的就是在创建对象时可以指定属性

语法

public People(int age){
 this.age = age;
}

7.6 有参无参构造的区别

有参构造,无参构造都是为了创建对象

  • 无参构造创建出的对象,属性值是默认值

  • 有参构造创建出的对象,属性值是指定的

八、重载

重载,overload

重载就是在同一类内,方法名一样,参数列表不一样的多个方法

参数列表一样是指,参数的个数,类型,顺序任意不一样都是

重载和返回值没有关系

public class Test2OOP {
​
    public static void main(String[] args) {
​
        System.out.println( );
        System.out.println(1);
        System.out.println(1.1);
        System.out.println("A");
        System.out.println(new People( ));
        System.out.println(new int[3]);
​
        // =========多个构造方法也是重载关系============
        new People( );
        new People(19, "关羽");
        new People(19);
        new People("黄盖");
        new People("黄盖",50);
    }
​
    /**
     * 以下几个都是重载
     * 他们的方法名一样,参数的个数,类型,顺序任意不一样都是重载
     * 与返回值类没有关系
     */
    public static void test() {
    }
​
    public static void test(int a) {
    }
​
    public static void test(String a) {
    }
​
    public static void test(int b, String a) {
    }
​
    public static void test(String a, int b) {
    }
}
People.class中设计重载的构造方法
public class People {
​
    int age;
    String name;
​
    /**
     * 构造方法没有void,方法名必须是类名
     */
    // 无参构造方法,创建对象是默认值
    public People(){
    }
​
    // 有参构造,调用时传入参数,创建对象出的属性是指定值
    public People(int age,String name) {
        this.age = age;
        this.name = name;
    }
​
    public People(String name,int age) {
        this.age = age;
        this.name = name;
    }
​
    public People(int age) {
        this.age = age;
    }
​
    public People(String name) {
        this.name = name;
    }
​
    // 普通方法
    public void eat(){
        System.out.println("人吃饭" );
    }
​
}
 

九、对象创建的过程

调用构造方法创建对象

  • 先对属性初始化

  • 再执行构造方法

package com.qf.pdf.pdf5t8;
​

class ClassA {
    public ClassA() {
        System.out.println("ClassA()");
    }
}
​
class ClassB {
    public ClassB() {
        System.out.println("ClassB()");
    }
}
​
class ClassC {
    ClassA a = new ClassA( );
    ClassB b;
​
    public ClassC() {
        System.out.println("ClassC()");
        b = new ClassB( );
    }
}
​
public class TestConstructor {
    // main开始执行
    public static void main(String args[]) {
        // 先调用构造创建对象
        /**
         * 创建对象的过程
         * - 先属性初始化
         * - 再执行构造
         */
        ClassC cc = new ClassC( );
        // 结果是A C B
    }
}

十、封装

面向对象编程的三个核心知识

  • 封装

  • 继承

  • 多态

5.1 什么是封装?

生活中的封装? 快递封装,将物品封装空间里面

代码的封装?

  • 方法算是封装

  • 类的封装(今天要学的)

    • 主要指的对属性封装

5.2 为什么封装?

快递为例: 封装的目的1)方便传输2)隐藏一些东西

类的封装:

  • 为什么要对属性封装? 可以封装在方法内,可以再方法内实现复杂的逻辑

  • 总结: 隐藏实现的细节,对外提供一些访问的方式

5.3 类如何封装

类的封装,两大步骤

  • 属性私有 --> private修饰属性

  • 提供setXxx,getXxx方法


特殊的,set get方法是固定写法,一定是setXxx getXxx,Xxx是属性名,首字母大写

属性name, ----> void setName(String name){} 返回值 getName(){}

手机类

public class Phone {

    private String brand;// 品牌
    /**
     * private 私有的
     * 一旦被private修饰的属性,方法只能在本类中调用
     */
    private double price;// 价钱

    public void setBrand(String brand){
        this.brand = brand;
    }

    public String getBrand() {
        return brand;
    }

    // 设计方法,给价钱赋值
    public void setPrice(double price){
        if (price > 0) {
            this.price = price;
        } else {
            System.out.println("设置价钱有误!" );
            this.price = 999999999;
        }

    }

    // 设计方法,能获取属性值
    public double getPrice() {
        return price;
    }

    public void play() {
        System.out.println(price+"元,手机玩游戏");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值