JavaSe基础(6)-- 方法

day06 方法

  • 访问权限
  • 方法
  • setter getter this
  • 构造方法
  • 方法的重载

访问权限

面向对象编程三大特征之一 封装

  • 什么是封装?

    对象的一种保护机制,隐藏对象的属性和实现细节,仅对外提供公共访问方式。

    白话: 该露的露,该藏的藏

    专业: 我们程序设计要追求“高内聚,低耦合”。

    高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉;

    低耦合:仅暴露少量的方法给外部使用

    耦合: 程序的一部分对另一部分的依赖关系

  • 目的:

    隐藏一个类的实现细节, 便于调用者调用

    防止对封装数据的未经授权的访问,有利于保证数据的完整性

    便于修改,增强代码的可维护性

  • 封装原则:

    将不需要对外提供的内容都隐藏起来。

    把属性都隐藏,提供公共方法对其访问

  • 示例:

    /*
    人:
    属性:
        年龄。
    
    行为:
        说话。
    
    */
    class Person
    {
        int age;
    
        void speak()
        {
            System.out.println("age="+age);
        }
    }
    
    class  PersonDemo
    {
        public static void main(String[] args) 
        {
            Person p = new Person();
    //        p.age = 20;  //可以
    
              p.age = -20;   //???
        }
    }
    

    p.age = -20;这个是不是不太合适啊。

    我们在对事物进行描述的时候,要符合事物的特点?年龄没有负数的啊

    那为什么会发生这种现象?我们只用到了这种类型中的一部分。

    那么该怎么办?

    我们要对这样的数据进行控制?

    出现这种现象是因为,这个age在被其他程序创建对象后,直接访问了,这样造成了安全隐患。
    那么就不让他访问?我们使用private(私有的意思)关键字进行限定

    class Person
    {
        private /*私有*/int age;
    
        public void live(int a)
        {
            if(a>0 && a<130)
            {
                age = a;
                speak();
            }
            else
                System.out.println("错误的数据");
        }
    
        void speak()
        {
            System.out.println("age="+age);
        }
    }
    
    class Person
    {
        private /*私有*/int age;
    
        public void setAge(int a)//setXxx getXxx
        {
            age = a;
        }
        public int getAge()
        {
            return age;
        }
    
        void speak()
        {
            System.out.println("age="+age);
        }
    }
    
  • private:私有,是一个权限修饰符。用于修饰成员。
  • 私有的内容只在本类中有效。
  • 注意:私有仅仅是封装的一种体现而已。

修饰符(modifier)

  • 在类、类的属性以及类的方法前面加修饰符可限定其访问权限,实现其在一定范围内的信息隐藏。

default不是一个修饰符,而是表示一种不加任何修饰符时的状态
Protected
同一个包的正常类,可以直接用他的实例进行访问 
不同包的正常类,无法访问任何属性和方法 
不同包的子类,不能使用父类实例的属性和方法 
不同包的子类,不能使用其它包的子类实例的属性和方法 
不同包的子类,可以直接使用父类的属性和方法 
总之,不同包的子类就规规矩矩的在自己的代码里用父类的属性就行了。其它的使用都是不允许的。

方法

  • 什么是函数?

    函数就是定义在类中的具有特定功能的一段独立小程序。

    函数也称为方法。

  • 函数的格式:

    饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,)
    {
            执行语句;
            return 返回值;
    }
    
  • 返回值类型:函数运行后的结果的数据类型。跟返回值的数据类型有关系。 如果没有返回值的话,则使用void

  • 方法名称:其实就是功能的名称, 那么名称可以根据功能来定义。不要使用aaa、bbb等不明确的名称
  • 参数类型:是形式参数的数据类型。
  • 形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。

    当在逻辑中 含有未知的数据参与 运算的时候 才需要参数列表

    (实际参数:传递给形式参数的具体数值。)
  • return:用于结束函数, 将返回值 返回给调用者。

    当没有返回值的时候 ,我们可以直接写 return ; 即可,但是此种情况 通常可以省略不写。
  • 返回值:该值会返回给调用者。
  • 案例:
  • 用于计算两数之和,两个数是否相等,乘法表
  • 定义方法用于输出换行

需求1: 定义一个功能,完成两个整数的和的获取。

思路:既然定义功能,就是可以用函数来体现。
    如何定义一个函数呢?
    通过两个明确来完成。
明确一:这个功能的结果是什么?
    是和。是功能的结果,所以该功能的返回值类型是int 。
    其实就是在明确函数的返回值类型。

明确二:这个功能实现过程中是否需要未知内容参与运算?
    有,加数和被加数。这就是函数的参数列表(参数的个数,参数的类型)
    其实就是在明确参数列表。

注意:返回值类型和参数类型没有直接关系。

*/
public static int add(int a,int b)
{
    int sum = a+b;
    return sum;
}

需求2: 定义一个功能,比较两个数是否相等。

明确一:这个功能的结果是什么?
        有,boolean.
明确二:这个功能实现过程中是否需要未知内容参与运算?
        有,两个整数。

    public static boolean equals(int a,int b)
    {
        /*
        if(a==b)
            return true;
        else
            return false;


        boolean x ;
        if(a==b)
            x = true;
        else
            x = false;
        return x;

        */
//      return (a==b)?true:false;

        return a==b;

}

需求3: 定义功能,打印99乘法表。

public static void print99()
{
    for(int x=1; x<=9; x++)
    {
        for(int y=1; y<=x; y++)
        {
            System.out.print(y+"*"+x+"="+y*x+"\t");
        }
        System.out.println();
    }
}

注意问题:

  1、方法要定义在类中
  2、和顺序无关 
  3、不可以在方法里 再定义方法
  4、可以在方法里  调用其他的方法

局部变量与全局变量,this关键字的作用

局部变量

  • 定义在类的方法内或代码块内的变量
  • 局部变量只在定义它的方法体内或代码块内有效
  • 局部变量在使用之前,必须先初始化

全局变量(成员变量)

  • 一个类中既不在方法体内也不在程序块内定义的变量
  • 类中所有的方法和代码块都可以访问成员变量
  • 对于没有初始化的成员变量,系统会指定默认的值

成员变量的默认初值

this关键字

  • 当成员变量和局部变量重名,可以用关键字this来区分。//仅仅是this的一个表现形式

  • this : 代表对象。代表哪个对象呢?当前对象。

    this就是所在函数所属对象的引用。

    简单说:哪个对象调用了this所在的函数,this就代表哪个对象

  • this也可以用于在构造函数中调用其他构造函数。

    注意:只能定义在构造函数的第一行。因为初始化动作要先执行。

  • 凡是被对象调用的东西 比如属性或函数 它们都持有一个this引用

重载(overload)

  • 重载的概念

    在同一个类中,允许存在一个以上的同名函数,只要它们的参数个数或者参数类型不同即可。
  • 重载的特点:

    与返回值类型无关,只看参数列表。
  • 重载的好处:

    方便于阅读,优化了程序设计。
  • 重载示例:

    //返回两个整数的和
     int add(int x,int y){return x+y;}
    
    //返回三个整数的和
    int add(int x,int y,int z){return x+y+z;}
    
    //返回两个小数的和
    double add(double x,double y){return x+y;}
    

总结:重载特点,两同三不同

构造器(构造方法)

  • 通过构造器用于构造该类的对象。Java通过new关键字来调用构造器,从而返回该类的对象。是一种特殊的方法:

    [修饰符]  类名 (参数列表){
            //n条语句
    }   
    
  • 1、构造器没有返回值类型

  • 2、方法名称要和类名保持一致
  • 3、一个类中可以有多个构造器,但是参数列表不同:参数的顺序不同、参数的类型不同、参数的个数不同
  • 4、构建类的对象 通过new关键字 例:Mobile stu=new Mobile();
  • 5、系统会自动添加一个无参的构造器
  • 6、当含有有参的构造器时 会把默认的无参的构造器干掉

你可能感兴趣的:(JavaSe基础(6)-- 方法)