java - 面向对象详细解析-内存运行画图演示

面向对象思想

面向谁就是更看重谁
面向过程:当需要实现一个功能的时候,每一个具体步骤都要亲力亲为,详细处理每一个细节.
面向对象:当需要实现一个功能的时候,不关心具体的步骤,而是找一个具有该功能的人,来帮我做事,强调的是谁来帮我做这件事情,谁就是对象

import java.util.Arrays;

public class t1 {
    public static void main(String[] args) {
        int[] array = {10, 20, 45, 50};

        //要求打印格式[10,20,45,50]
        //面向过程:每一个步骤都要因力亲为
        System.out.print("[");
        for (int i = 0; i < array.length; i++) {
            if (i == array.length - 1) {
                System.out.print(array[i] + "]");
            } else {
                System.out.print(array[i] + ",");
            }

        }
        System.out.println("=============");
        //面向对象:找人帮我做事
        //找一个JDK给我们提供好的Arrays类
        //其中有一个toString方法,直接就能把数组变成想要的格式的字符串
        System.out.println(Arrays.toString(array));
    }
}

类的定义

类:是一组相关属性和行为的集合
属性:就是该事物的状态信息
行为:就是该事物能够做什么
举例:小猫
属性(描述信息):名字,体重,年龄,颜色
行为(能做什么):走,跑,叫
我们在java中怎么来实现一个类,我来敲一个小demo,进行演示

import java.util.Arrays;
/*
定义一个类,用来模拟学生,其中就有两部分:
属性(描述性信息,是什么):年龄,姓名
行为(能做什么):吃饭,睡觉.学习
对应到java的类当中:
成员变量(属性):数据类型 变量名称
    String name //姓名
    int age  //年龄
成员方法(行为):
    public void eat(){}  //吃饭
    public void sleep(){} //睡觉
    public void study(){} //学习
 */
public class t1 {
    //成员变量
    String name; //姓名
    int age; //年龄

    //成员方法
    public void eat(){
        System.out.println("吃饭饭!");
    }

    public void sleep(){
        System.out.println("睡觉觉!");
    }

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

}

注意事项:
1.成员变量是直接定义在类当中的,在方法外边
2.成员方法不要写static关键字

对象的创建及其使用

通常情况下,一个类并不能直接使用,需要根据类创建一个对象,才能使用

1.导包:也就是指出需要使用的类,在什么位置.
import 包名称.类名称;
对于和当前类属于同一个包的情况,可以省略导包语句不写.
2.创建:格式: 类名称 对象名 = new 类名称();
Student stu =new Student();
3.使用,分位两种情况:
使用成员变量:对象名.成员变量名
使用成员方法:对象名.成员方法名(参数)
(也就是,想用谁,就要对象点谁)

package demo1;

import demo1.Student;

public class t1{
    public static void main(String[] args) {
        //1.导包:使用的Student类和我自己位于同一个包下,
        //所以可以省略导包语句不写

        //2.创建:类名称 对象名 = new 类名称();
        Student stu = new Student();

        //3.使用
        // 成员变量
        System.out.println(stu.age); //null
        System.out.println(stu.name); //0
        stu.name = "赵丽颖";
        stu.age = 18;
        System.out.println(stu.age);
        System.out.println(stu.name);
        //成员方法
        stu.eat();
        stu.sleep();
        stu.study();
    }

}

手机类练习

创建

package demo1;
/*
定义一个手机类
属性:品牌,价格,颜色
行为:打电话,发短信
对应到java中
成员变量(属性)
    String brand;
    double price;
    String color;
成员方法(行为)
    public void call(String who){}
    public void sendMessage(){}
 */
public class Phone {

    //成员变量
    String brand;
    double price;
    String color;
    //成员方法
    public void call(String who){
        System.out.println("给"+who+"打电话");
    }

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

调用

package demo1;
public class t1{
    public static void main(String[] args) {
        Phone phone = new Phone();
        System.out.println(phone.brand); //null
        System.out.println(phone.color); //null
        System.out.println(phone.price); //0.0

        phone.brand = "苹果";
        phone.color = "黑色";
        phone.price = 8888.0;

        System.out.println(phone.brand);
        System.out.println(phone.price);
        System.out.println(phone.color);

        phone.call("特朗普");
        phone.sendMessage();


    }

}

一个对象的内存图

在这里插入图片描述

两个对象使用同一个方法的内存

package demo1;
public class t1{
    public static void main(String[] args) {
        Phone phone = new Phone();
        System.out.println(phone.brand); //null
        System.out.println(phone.color); //null
        System.out.println(phone.price); //0.0

        phone.brand = "苹果";
        phone.color = "黑色";
        phone.price = 8888.0;

        System.out.println(phone.brand);
        System.out.println(phone.price);
        System.out.println(phone.color);

        phone.call("特朗普");
        phone.sendMessage();

        Phone phone1 = new Phone();
        System.out.println(phone1.brand); //null
        System.out.println(phone1.color); //null
        System.out.println(phone1.price); //0.0

        phone1.brand = "三星";
        phone1.color = "红色";
        phone1.price = 5999.0;

        System.out.println(phone1.brand);
        System.out.println(phone1.price);
        System.out.println(phone1.color);

        phone.call("欧巴");
        phone.sendMessage();


    }

}

在这里插入图片描述

两个引用指向同一个对象

package demo1;
public class t1{
    public static void main(String[] args) {
        Phone phone = new Phone();
        System.out.println(phone.brand); //null
        System.out.println(phone.color); //null
        System.out.println(phone.price); //0.0

        phone.brand = "苹果";
        phone.color = "黑色";
        phone.price = 8888.0;

        System.out.println(phone.brand);
        System.out.println(phone.price);
        System.out.println(phone.color);

        phone.call("特朗普");
        phone.sendMessage();
        
        //将phone中的地址值赋值给phone1
        Phone phone1 = phone;
        System.out.println(phone1.brand);
        System.out.println(phone1.color);
        System.out.println(phone1.price);

        phone1.brand = "三星";
        phone1.color = "红色";
        phone1.price = 5999.0;

        System.out.println(phone1.brand);
        System.out.println(phone1.price);
        System.out.println(phone1.color);

        phone.call("欧巴");
        phone.sendMessage();


    }

}

在这里插入图片描述

使用对象类型作为方法的参数

package demo1;
public class t1{
    public static void main(String[] args) {
        Phone phone = new Phone();
        phone.brand = "苹果";
        phone.price = 8388.0;
        phone.color = "土豪金";
        method(phone); //传递进去的是地址值

    }
    public static viod method(Phone param){

    }

}

在这里插入图片描述

使用对象类型作为方法的返回值

package demo1;
public class t1{
    public static void main(String[] args) {
        Phone two = getPhone();
        System.out.println(two.brand); //苹果
        System.out.println(two.color); //玫瑰金
        System.out.println(two.price); //8388.0
    }
    public static Phone getPhone(){
        Phone one = new Phone();
        one.brand = "苹果";
        one.price = 8388.0;
        one.color = "玫瑰金";
        return one;

    }

}

在这里插入图片描述

成员变量和局部变量的区别

1.定义的位置不一样
局部变量:在方法的内部
成员变量:在发法的外部,直接写在类当中
2.作用范围不一样
局部变量:只有方法当中才可以使用,出了方法就不能再用
成员变量:整个leukemia全都可以通用
3.默认值不一样
局部变量:没有默认值,如果要想使用,必须手动进行赋值
成员变量:如果没有赋值,会有默认值,估值和数组一样
4.内存的位置不一样
局部变量:位于栈内存
成员变量:位于堆内存
5.生命周期不一样
局部变量:随着方法进栈而诞生,随着方法出栈而消失
成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失

package demo1;
public class t1 {
    public static void main(String[] args) {
    }
    String name;
    public void mehodA(){
        int num = 20; //局部变量
        System.out.println(num);
        System.out.println(name);
    }
    public void methodB(int param){ //方法的参数就是局部变量
        //参数在方法调用的时候,鼻炎会被赋值的
        int age;
        //System.out.println(age); 没有赋值得变量是不能使用的
        //System.out.println(num); 错误写法
        System.out.println(name);
    }
}

面向对象三大特征之封装性

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

封装性在java当中的体现:

1.方法就是一种封装
2.关键字private也是一种封装
什么是封装哪?
封装就是将一些细节信息隐藏起来,对于外界不可见

package demo1;
public class t1 {
    public static void main(String[] args) {
        int[] array ={5,20,15,54};
        int max = getMax(array);
        System.out.println(max);
    }
    public static int getMax(int[] array){
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (array[i]>max){
                max = array[i];
            }
        }
        return max;
    }


}

private关键字定义

定义Person类

package demo1;

public class Person {
    String name; //姓名
    int age; //年龄
    public void show(){
        System.out.println("我叫:"+name+"年龄:"+age);
    }
}

主程序

package demo1;
public class t1 {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();

        person.name = "赵丽颖";
        person.age = -20;
        person.show();
    }

}

问题描述:定义Person的年龄时,无法阻止不合理的市值被设置进来
解决方案:用private关键字将需要保护的成员变量进行修饰
一旦使用了peivate进行修饰,那么本类当中仍然可以随意访问,但是!超出了本类范围之外就不能再直接访问了.

间接访问private成员变量,就是定义一堆Getter/Setter方法
对于Setter:有参数无返回
对于Getter:有返回无参数

修改Person类

package demo1;

public class Person {
    String name; //姓名
    private int age; //年龄
    public void show(){
        System.out.println("我叫:"+name+"年龄:"+age);
    }
    //这个成员方法,专门用于向成员变量age设置数据
    //必须有参数无返回
    public void setAge(int num){
        if (num<100 && num>=9){
            age = num;
        }
        else {
            System.out.println("数据不合理!");
        }

    }
    //这个成员方法,专们用于获取成员变量age的数据
    //必须有返回,无参数
    public int getAge(){
        return age;
    }
}

修改后的主程序

package demo1;
public class t1 {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();

        person.name = "赵丽颖";
        //person.age = -20;
        //间接访问
        person.setAge(-20);
        person.setAge(20);
        person.show();
    }

}

练习使用private关键字定义

定义Student类,新添加了boolean值,得pervate使用方式

package demo1;

public class Student {

    private String name; //姓名
    private int age;
    private boolean male;

    public void setMale(boolean male){
        this.male = male;
    }
    //布尔值的Getter方法是一个特例
    public boolean isMale(){
        return male;
    }

    private  void setName(String name){
        this.name = name;
    }
    private String getName(){
        return name;
    }
    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }

}

主程序,调用Student创建实例

package demo1;
public class t1 {
    public static void main(String[] args) {
        Student stu = new Student();
        stu.setName("大张伟");
        stu.setAge(28);
        stu.setMale(true);
        System.out.println("姓名:"+stu.getName());
        System.out.println("年龄:"+stu.getAge());
        System.out.println("性别:"+stu.isMale());
    }
}

this关键字的作用

当方法的局部变量和类的成员变量重名的时候,根据"就近原则",优先使用局部变量
如果需要访问本类当中的成员变量,需要使用格式:
this.成员变量名
谁调用的方法,谁就是this
如果你学过python,this.name = name赶紧等同于python的self.name = name

定义一个Person类

package demo1;

public class Person {

    String name;
    //参数name是对方的名字
    //成员变量name是自己的名字
    public void sayHello(String name){
        System.out.println(name +",你好"+this.name);
    }
}

构造方法

构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法

格式:
public 类名称(参数类型 参数名称) {
方法体
}

注意事项:

1.构造方法的名称必须和所在的类名称完全一样,就在这里插入代码片连大小写也要一样
2.构造方法不要写返回值类型,连void都不写
3.构造方法不能return一个具体的返回值
4.如果没有编写任何构造方法,那么编译器就会默认赠送一个构造方法,没有参数,方法体什么事情都不做
public Studeng(){}
5.一旦编写了至少一个构造方法,那么编译器将不再赠送
6.构造方法也是可以重载的
重载:方法名称相同,参数列表不同

构造方法等同于python的 __init__初始化方法

创建一个Student类

package demo1;

public class Student {
    private String name;
    private int age;
    //无参数构造方法
    public Student(){}

    //全参构造方法
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }
    public void setAge(){
        this.age = age;
    }
    public int getAge(){
        return age;
    }

}

主程序调用

package demo1;
public class t1 {
    public static void main(String[] args) {
        Student stu1 = new Student(); //无参构造
        Student stu = new Student("赵丽颖",20); //全参构造
        
        System.out.println("姓名:"+stu.getName()+"年龄:"+stu.getName());
    }

}

定义一个标准的类

一个标准的类通常要满足下面四个组成部分:

1.所有的成员变量都要使用private关键字修饰
2.为每一个成员变量编写一对Getter/Setter方法
3.编写一个无参数的构造方法
4,编写一个全参数的构造方法

这样的标准的类也叫做Java Bean

选择code菜单,Generate或者快捷键Alt+insert
在这里插入图片描述
通过选择Constructor 选择无参数,和使用Shift全选,生成全参数构造,以及Getter/Setter方法的生成
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值