zoukankan      html  css  js  c++  java
  • day0607_oop

    Java数值传递的时候,到底是引用传递还是值传递?

    Java中既有引用传递,也有值传递

    值传递:基本数据类型 --->方法实际参数传递给形式参数,形式参数拿到相应的数据初始化方法内的存储单元

    引用传递:引用类型(类、数组、接口、String等)

    今日内容:

    • ​ 面向对象
    • ​ 类与对象
    • ​ 三大特征---之封装
    • ​ 构造方法

    学习目标:

    • 理解面向对象编程思想
    • 明确类与对象关系
    • 掌握类的定义格式
    • 掌握创建对象格式,访问类中成员
    • 根据类与对象的关系定义相关事物
    • 理解对象的内存图解
    • 说出成员变量与局部变量的异同
    • 理解private关键字
    • 说出this关键字可以解决的问题
    • 理解构造方法的含义
    • 用封装的思想定义一个JavaBean(标准类)

    面向对象思想概述

    ​ Java语言是一门面向对象的程序设计语言,面向对象是一种程序设计思想。我们在面向对象思想的指引下,使用Java语言去设计程序、开发程序。这里的 【对象】 泛指现实中的一切事物。每种事物都有自己的 【属性特征】 和 【行为特征】 。面向对象思想就是在程序设计过程中,参照现实中的事物,将事物的属性特征、行为特征抽离出来、描述成计算机事件的设计思想。它是区别于面向过程的。

    ​ 【物以类聚、人以群分】

    举例:

    ​ 吃饭:

    ​ 面向过程:到菜市场买菜--->返回家洗菜--->切菜--->炒菜--->吃菜--->洗碗刷锅

    ​ 面向对象:网上点菜--->吃菜

    区别:

    ​ 面向过程:强调步骤

    ​ 面向对象:强调对象,这里的对象就是【app】

    特点:

    ​ 面向对象思想更符合人的思考方式,站在 leader 的角度看问题,它可以将复杂的事情简单化

    ​ 并将我们从事情的执行者变成指挥者。面向对象包含了三大基本特征:封装、多态、继承

    类与对象

    什么是类

    • ​ 类:是一组相关【属性】和【行为】的集合。可以把类看成一类事物的模板,我们使用事物的【属性特征】和【行为特征】来描述该类事物。
    • ​ 现实中,描述一类事物:

    ​ 属性:描述该类事物的一种【状态】信息

    ​ 行为:描述该类事物具备的【功能】,能够做什么

    什么是对象

    • 对象:就是一类事物的具体的体现。对象是类的一个【实例】,必然具备该类事物的【属性特征】和【行为特征】

    类与对象的关系

    • 类是对一类事物的描述,是【抽象的】
    • 对象是一类事物的实例,是【具体的】
    • 类是对象的模板,对象是类的实体

    类的定义

    ​ 事物与类的对比:

    ​ 现实中的一类事物通过属性(事物的状态信息)和行为(事物能够做什么,具备的功能)

    ​ Java中类描述事物也是如此:

    ​ 成员变量(对应事物的属性)、成员方法(对应事物的行为)

    ​ 类的定义格式:

    public class ClassName{
        //成员变量
        //成员方法
    }
    
    • 定义类:定义类的成员,包括成员变量和成员方法
    • 成员变量:和定义局部变量的格式一模一样,只不过【位置】不同,局部变量定义在方法内,成员变量定义在类中、方法外
    • 成员方法:成员方法没有static修饰

    对象的使用

    ​ 对象的创建格式:

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

    ​ 使用对象访问类的成员信息:

    对象名.成员变量名;
    对象名.成员方法名();
    

    成员变量的默认值:

    数据类型 默认值
    整形(byte、short、int、long) 0
    基本类型 浮点型(float、double) 0.0
    字符型(char) "u0000"
    布尔类型(boolean) false
    引用类型 数组、类、接口、String null

    备注:方法内定义的变量没有初始化,不能被使用(相当于局部变量)

    如果成员变量没有进行赋值,系统会自动给一个提前设定好的默认值,默认值规则与数组一样

    对象的内存图解

    ​ 一个对象,调用一个方法的内存图解

    image-20201117142026236

    备注:在栈内存中运行的方法遵循"先进后出、后进先出"的原则,此时变量phone指向堆内存当中的空间,寻找方法信息,执行该方法。

    ​ 两个对象,调用同一个方法的内存图解

    image-20201117143352725

    ​ 当对象调用方法时,根据对象当中的方法标记(地址值),去类中寻找方法信息,这样哪怕是多个对象,方法信息只保存一份,可以节约内存空间

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

    ​ 变量根据定义的【位置不同】,我们给变量取了不同的名字

    public class People{
        	String name = "小明";//成员变量
        	public void eat(){
                String food="面条";//局部变量
                System.out.println(name+"中午吃的是:"+food);
            }
    }
        
    
    • 在类中定义的位置不同【重点】

    ​ 成员变量:类中、方法外

    ​ 局部变量:方法中或者方法声明上(形式参数)

    • 作用范围不同【重点】

    ​ 成员变量:类中

    ​ 局部变量:方法中

    • 初始化值不同【重点】

    ​ 成员变量:有默认值

    ​ 局部变量:没有默认值,必须先初始化才能使用

    • 在内存之中存储的位置不同【了解】

    ​ 成员变量:在堆内存中

    ​ 局部变量:在栈内存中

    • 生命周期不同【了解】

    ​ 成员变量:随着对象的创建而存在,随着对象的消失而消失

    ​ 局部变量:随着方法的调用而存在,随着方法的结束调用而消失

    • 修饰符不同【了解】

    ​ 成员变量:可以使用修饰符

    ​ 局部变量:不可以使用修饰符

    封装特性

    封装的概述

    ​ 面向对象编程语言模拟客观世界,客观世界里的成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以认为是一个保护屏障,防止该类代码和数据被其他类随意访问和修改。要访问该类的数据必须通过指定的特殊方式才可以。适当的封装,可以让我们的代码更容易维护和理解,也加强了代码的安全性。

    ​ 原则:

    ​ 将【属性隐藏】起来,如果想要访问类中的某个属性,提高【公共的方法】对其访问

    ​ 封装步骤:

    1. ​ 使用【private】关键字来修饰成员变量
    2. ​ 对需要访问的成员变量,提供对应的一对getXxx方法和setXxx方法(get、set方法体内可以定义数据访问规范

    封装的操作----private关键字

    ​ private的含义

    1. private是一个关键字,更是一个权限修饰符,代表最小权限
    2. 可以修饰成员变量,也可以修饰成员方法
    3. 被private修饰后的成员变量和成员方法,只能在本类中访问。

    使用外类:

    • 在类中使用外类的时候,如果这个外类和当前类是同一包下,则可以不用导包使用。一个类并不能直接使用,需要根据该类创建一个对象,才能使用。

    • 如果不在同包下,需要导包(把外类在项目中所在的位置引入到当前类中)

      格式:import 包名 . 类名

    private关键字的使用格式

    private 数据类型 变量名;
    
    public class Man{
        //1.使用private关键字修饰成员变量
        private int age;
        private String name;
        //2.提供对应的getXxx方法和setXxx方法,可以访问类中的成员变量
        //getXxx 获取类中的成员变量值
        public String getName(){
            return name;
        }
        //setXxx设置类中的成员变量值
        public void setName(String name){//两个name不在同一个内存区域,无法互相影响
            name = name;
        } 
    }
    

    封装优化一----this关键字

    我们发现在setXxx()方法中不符合我们标识符的命名规范---见名知意,如果修改成和成员变量名字相同,会触发Java程序中的就近原则,会把方法内的变量统统设定为形参变量,导致赋值失败,我们可以使用【this】关键字解决变量重名问题。

    this的含义

    ​ this代表所在类的当前对象的引用(地址值),即对象对自己的引用

    备注:意思是方法被哪个对象调用,方法中的this就代表那个对象。即谁调用,this就是谁。

    ​ this的使用格式:

    this.成员变量名
    
    //使用this关键字修饰方法中的成员变量,来解决成员变量被隐藏的问题
    public class Man{
        //1.使用private关键字修饰成员变量
        private int age;
        private String name;
        //2.提供对应的getXxx方法和setXxx方法,可以访问类中的成员变量
        //getXxx 获取类中的成员变量值
        public String getName(){
            return name;
        }
        //setXxx设置类中的成员变量值
        public void setName(String name){//两个name不在同一个内存区域,无法互相影响
            this.name = name;
        } 
    }
    

    备注:成员方法当中只有一个变量名,默认也是使用this,也可以省略不写

    封装优化二----构造方法

    ​ 当一个对象被创建出来的时候,构造放啊用来初始化对象,给对象的成员变量赋初始值。

    备注:无论你是否在类中定义构造方法,当类被定义出来的时候,系统会自动给该类分配一个构造方法(无参的构造方 法),一旦在类中显式的定义构造方法,Java自动提供的默认无参构造方法就会失效(被收回)。

    构造方法的定义格式:

    修饰符  构造方法名(参数列表){//没有具体返回值,本质上它也有返回值,是当前类对象,默认格式,不需要指定
        //方法体内容
    }//构造方法名和类名完全一致
    

    练习构造方法的使用

    public class Dog{
        private String name;
        private int age;
        private String brand;
        private String color;
        //优化封装  使用构造方法
        public Dog(String name,int age,String brand,String color){
    		//方法体内容
            this.name = name;
            this.age = age;
            this.brand = brand;
            this.color = color;
        }
        //Java提供的默认无参构造方法
        public Dog(){
            
        }
    }
    

    使用构造方法的注意事项:

    • 构造方法名称必须和所在的类名完全一样,就连大小写都要一样

    • 不用声明返回值类型,连void也不需要

    • 不能用return一个具体的返回值

    • 如果定义类时,没有显式定义构造方法,系统会提供一个默认的无参构造方法

    • 一旦自定义了一个构造方法,那么编译器将会收回默认提供的构造方法

    • 构造方法可以重载:方法名称相同,参数列表不同

      Java标准类----JavaBean

      ​ JavaBean是Java语言编写类的一种标准规范。符合JavaBean的类,包含四部分:

      • 所有的成员变量都有使用private修饰

      • 为每一个成员变量提供公共的setXxx、getXxx方法

      • 编写一个无参的构造方法

      • 最好再提供一个全参的构造方法

        这样标准的类就叫做JavaBean

  • 相关阅读:
    Open source cryptocurrency exchange
    Salted Password Hashing
    95. Unique Binary Search Trees II
    714. Best Time to Buy and Sell Stock with Transaction Fee
    680. Valid Palindrome II
    Java compiler level does not match the version of the installed Java project facet.
    eclipse自动编译
    Exception in thread "main" java.lang.StackOverflowError(栈溢出)
    博客背景美化——动态雪花飘落
    java九九乘法表
  • 原文地址:https://www.cnblogs.com/mitoris/p/13995749.html
Copyright © 2011-2022 走看看