java04 方法、面向对象、封装

1方法的概念

抽取提纯某一动作的即可为方法,若干语句的功能集合

public class Hello{
    public static void main(String[] args){
        //男人
        System.out.println("买房");
        //女人
        System.out.println("结婚");


    }
}

需要注意定义格式  参数和返回值


2如何定义它的格式

定义方法的完整格式:

修饰符  返回值类型  方法名称(参数类型 参数名称,参数类型 参数名称。。。。){

     方法体

      return 返回值;//  参数如果有多个,用逗号分隔

}

格式 

         public  static void 方法名称(){

                 方法体

          }

方法名称: 使用小驼峰 xiaoMiFeng

方法体:使用大括号当中可以包含任意条语句

程序入口:

public static void main(String[] args){

     方法名称();

}

调用格式:方法名称();

注意事项:

1 方法定义的先后顺序,不重要;

2 方法定义不可以嵌套或包含的关系;不可嵌套定义。

3 方法定义OK,不会执行,如果想执行,一定要进行调用(执行方法);也就是在main或其他地方进行调用中进行调用。

public class Hello{
    public static void main(String[] args){
        //男人 调用女人方法
        woMen(args);
        System.out.println("买房");
        //女人
    }
    public static void woMen(String[] args)    {
        System.out.println("结婚");


    }
}
结果
买房
结婚


3如何使用(调用)

方法其实就是若干语句的集合,好比是一个工厂。

参数 就是进入方法的数据

返回值 就是从方法中出来的数据,也就是产物

-----------------

定义方法的完整格式:

修饰符  返回值类型  方法名称(参数类型 参数名称,参数类型 参数名称。。。。){

     方法体

      return 返回值;//  参数如果有多个,用逗号分隔

}


修饰符 现阶段的固定写法  public  static

返回值类型  也就是方法最终产生的数据结构是什么类型

方法名称 : 方法的名字,规则和变量一样,小驼峰;

参数名称: 进入方法的数据对于的变量名称;

return :两个作用

             1 停止当前方法

              2 将后面的返回值还给调用处;

举例 : 定义一个两个int 类型数字相加的方法

三要素考虑  返回值类型 int  方法名称 sum  参数列表 int a  int b



2)调用方法的三种格式: 单独调用(结果无法使用) 打印调用  赋值调用(给变量)

1 单独调用: 方法名称(参数);void 只能单独调用类型

public class HelloWorld2 {
    public static void main(String[] args){
        //单独调用
        int c = sum(10,20);
  // 打印调用
        System.out.println(c);
    }
    public static int sum(int a ,int b){
        int result1 = a + b;
        return result1;
    }
}
结果 30

2、打印调用:System.out.println();

public class HelloWorld2 {
    public static void main(String[] args){
        //单独调用
        int c = sum(10,20);  // 赋值调用
  // 打印调用
        System.out.println(c);
    }
    public static int sum(int a ,int b){
        int result1 = a + b;
        return result1;
    }
}
结果 30

3 赋值调用  数据类型  变量名称 = 方法名称(参数);

public class HelloWorld2 {
    public static void main(String[] args){
        //单独调用
        int c = sum(10,20);
  // 打印调用
        System.out.println(c);
    }
    public static int sum(int a ,int b){
        int result1 = a + b;
        return result1;
    }
}
结果 30

3)整个程序执行过程

image

4) 对比参数方法 有参数和无参数

有参数: 当一个方法需要一些数据条件 ,才能完成任务的时候,就是有参数。

              例如方法是计算两个数据的和


下面是有参数:

public class HelloWorld2 {
    public static void main(String[] args){
        method1(10,20);
        //两个数字相乘,做乘法,得知道两个数据的值,否则无法计算

    }
    public static void method1(int a ,int b){
        //void 类型,可以使用打印println(结果)
        int result2 = a + b;
        System.out.println("结果是" + result2);
    }
}
结果30

无参数:小括号中留空,一个方法不需要任何数据条件,自己就能独立完成任 

              务,就是无参数。例如定义一个方法,打印固定10次的helloworld。

下面是无参数(你只需调用我这个方法,不需要传参数据,直接执行)

public class HelloWorld2 {
    public static void main(String[] args) {
        method2();
    }

    public static void method2() {
        for (int i = 0; i < 5; i++) {
            System.out.println("爱我中华");
        }
    }
}
结果
爱我中华
爱我中华
爱我中华
爱我中华
爱我中华

5)有无返回值案例:

原始题目 定义一个方法,用来计算两个数字的和(你帮我算,算完把结果给我)

有返回值的 可以单独调用  打印调用 或者赋值调用

无返回值的  也就是 void 只能单独调用。不可以打印调用或者赋值调用。

public class HelloWorld2 {
    public static void main(String[] args) {
        //我是main方法,我来调用你,你来帮我算一下,算完结果给我
        int num2 = getSum(10, 20);
        System.out.println(num2);
        }
    //我是一个方法,我负责两个数字相加
    //我有返回值int,谁调用我,我就把计算结果告诉谁。
    public static int getSum( int a,int b) {
        int sum1 = a + b;
        return sum1;
        }
}

结果30

变形题目 定义一个方法,用来打印两个数字的和(你帮我算,自己负责算完把结果打印)


public class HelloWorld2 {
    public static void main(String[] args) {
        //我是main方法,我来调用你,你来帮我算一下,算完结果给我
        int num2 = getSum(10, 20);
        System.out.println(num2);
        System.out.println("----------");
        getSum1(10,20);
        }
    //我是一个方法,我负责两个数字相加
    //我有返回值int,谁调用我,我就把计算结果告诉谁。
    public static int getSum( int a,int b) {
        int sum1 = a + b;
        return sum1;
        }
    //我是一个方法,我负责两个数字相加
    //我没有返回值,不会把计算结果告诉任何人。
    public static void getSum1( int a,int b) {
        int sum1 = a + b;
        System.out.println(sum1);
    }
}
结果
30
----------
30

整体效果如下:

E6F10F43-61B4-49ef-844E-BAAB97107DB7

定义一个方法,用来判断两个数字是否相同
//定义一个方法,用来判断两个数字是否相同
public class HelloWorld2 {
    public static void main(String[] args) {
        //方法的三要素  返回值类型 boolean    方法名称 isNum 参数列表 int a int b
        boolean issame2 = isSame(10,20);
        System.out.println(issame2);
    }
    public static boolean isSame(int a, int b){
        boolean same;
        if(a == b){
            same = true;

        }else {
            same = false;
        }
        return same;
    }
}
结果
false
定义一个方法,用来判断两个数字是否相同
//定义一个方法,用来判断两个数字是否相同
public class HelloWorld2 {
    public static void main(String[] args) {
        //方法的三要素  返回值类型 boolean    方法名称 isNum 参数列表 int a int b
        boolean issame2 = isSame(10,20);
        System.out.println(issame2);
    }
    public static boolean isSame(int a, int b){
        boolean same;
        if(a == b){
            same = true;

        }else {
            same = false;
        }
        return same;
    }
}

结果 false
定义一个方法,求出1-100之间的和
//定义一个方法,求出1-100之间的和
public class HelloWorld2 {
    public static void main(String[] args) {
        System.out.println(getSum1());
    }
        //返回值 int
        //参数列表 i++
        //方法名称getSum
    public static int getSum1 () {
        int sum1 = 0;
        for (int i = 1; i < 100; i++) {
            sum1 = sum1 + i;
        }
        return sum1;
        }
}
结果 4950

5 使用方法的注意事项

  • 方法应该定义在类当中,不可以在方法中再定义一个方法。
  • 方法定义的前后顺序无所谓
  • 方法定义之后不会执行,如果希望执行,一定要调用;
  • 如果方法有返回值,必须写上return 返回值;不能没有
  • return 后面的返回值类型,必须和方法的返回值类型一一对应;
  • 对于一个void没有返回值的方法,不能写return后面的返回值,只能return自己。也就是return;语句
  • 对于方法中最后一行的return可以省略不写。
  • 一个方法中,可以有多个return,但不可以同时执行2个,只能1个。


方法的重载

    假设一个方法 实现多个数字相加,可能两个 ,可能三个,可能四个,但是调用时候可能调用选择困难,对于功能类似的方法,那么如何减少调用选择而快速实现相加方法的执行,因此方法的重载,方便撰写方法,也方便调用

定义:多个方法的名称一样,但参数列表不一样,而方法遵守小驼峰原则

1585655480(1)



方法的重载的关键点

  • 1.参数个数不同,上图已演示;
  • 2.参数个数相同但参数的类型不同,return可强壮类型
  • 3.参数个数相同的多类型顺序不同
  • 4.与方法的返回值类型无关

1585655799(1)


2.面向对象


    面向对象也就是面向谁开发,面向过程就是每个过程每个细节进行开发,而面向对象就是当实现某个功能的时候,找具备该功能的进行即可。

     面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为

     可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

       如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

      可以明显地看出,面向对象是以功能来划分问题,而不是步骤。两者之间的优缺点

  • 面向过程:
  • 优点:性能比面向对象高,因为面向对象时的类调用时需要实例化,开销较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要因素。
    缺点:没有面向对象易维护、易复用、易扩展
  • 面向对象
  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
    缺点:性能比面向过程低

  1 package cn.itcast.day04.demo01;
  2 import java.util.Arrays;
  3 
  4 public class HelloWorld {
  5 
  6     public static void main(String[] args) {
  7         int[] array = {10, 20, 30, 40, 50};
  8         System.out.print("[");//面向过程
  9         for (int i = 0; i < array.length; i++) {
 10             if (i == array.length - 1) {
 11                 System.out.println(array[i] + "]");
 12             } else {
 13                 System.out.print(array[i] + ",");
 14             }
 15         }
 16         System.out.println("==========");//分割线,找个Arrays类,tostring现成的方法
 17         System.out.println(Arrays.toString(array));//面向对象
 18     }
 19 }

2.1.面向对象的特点与组成部分: 成员属性(也叫成员变量(是什么))与成员方法(能干啥)

 

成员变量(属性)

   数据名称 变量名称; int num = 10;

成员方法(行为):成员方法特殊的地方就是没有static 即     public void eat();

  写在方法内部的叫局部变量

  写在类中间叫成员变量。

类定义: public class 类名(){

                        成员变量;

                        成员方法;

} 其中public可写可不写;

  1 package cn.itcast.day04.demo01;
  2 public class HelloWorld {
  3     int name; //成员变量,写在类当中,而不是方法中
  4     public void eat(){
  5         int age;// 写在成员方法中的局部变量
  6         System.out.println("吃饭饭");
  7     }
  8 // 成员方法没有static的,跟返回值和参数类型无关
  9     public void sleep() {
 10         System.out.println("睡觉");
 11     }
 12 }

2.2.类的使用步骤:

1.导包,也就是导入正常需要使用的类,在什么位置;导包语句格式

import 包名称.类名称 假设导上面HelloWorld类

import cn.itcast.day04.demo01.HelloWorld;

2.创建格式

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

Student stu  =  new Student();

3.使用:成员变量和成员方法的使用方法

    对象名.成员变量 HelloWorld.name;

   对象名.成员方法(参数)HelloWorld.eat(参数);

  1 package cn.itcast.day04.demo01;
  2 import cn.itcast.day04.demo01.HelloWorld;
  3 public class Demo02 {
  4     public static void main(String[] args) {
  5         HelloWorld hw = new HelloWorld();
  6         hw.eat();
  7         hw.sleep();
  8     }
  9 }
  1 package cn.itcast.day04.demo01;
  2 public class HelloWorld {
  3     int name; //成员变量,写在类当中,而不是方法中
  4     public void eat(){
  5         int age;// 写在成员方法中的局部变量
  6         System.out.println("吃饭饭");
  7     }
  8 // 成员方法没有static的,跟返回值和参数类型无关
  9     public void sleep() {
 10         System.out.println("睡觉");
 11     }
 12 }

如果成员变量未给值,则是默认值,规则和数组一样

int 为0;float为0.0,String是null,Boolean 为false,引用类型none


当我们创建一个对象,调用了成员方法和成员变量,那么内存中发生了什么变化。

01-只有一个对象的内存图

      通常运行main方法之前,方法区有数据-方法区保存的是.class数据

栈 Stack,含义书架,也就是先进后出

  • 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
  • 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  • 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

堆 Heap 许多 也就是先进先出

  • 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
  • jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

方法区 Method Area

  • 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  • 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

image

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

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

03-两个引用指向同一个对象的内存图

image

      使用对象对方法进行参数传递。带static的方法是普通方法,不需要用对象点即可调用,直接使用。实际上传递的是地址值。

格式  public satatic void 方法名称(类名 对象名){

                对象名.成员变量;

                对象名.成员方法;

            }

  1 package cn.itcast.day04.demo01;
  2 import cn.itcast.day04.demo01.HelloWorld;
  3 public class Demo02 {
  4     public static void main(String[] args) {
  5         HelloWorld hw = new HelloWorld();
  6         System.out.println(hw.name);
  7         hw.eat();
  8         hw.sleep();
  9         hw.dd();
 10         Method(hw);
 11     }
 12     public static void Method(HelloWorld HH){
 13         System.out.println(HH.name);
 14     }
 15 }
  1 package cn.itcast.day04.demo01;
  2 public class HelloWorld {
  3     Boolean  name; //成员变量,写在类当中,而不是方法中
  4     public void eat(){
  5         int age;// 写在成员方法中的局部变量
  6         System.out.println("吃饭饭");
  7     }
  8 // 成员方法没有static的,跟返回值和参数类型无关
  9     public void sleep() {
 10         System.out.println("睡觉");
 11     }
 12     public static void dd(){
 13         System.out.println("跑步");
 14     }
 15 }
 16 
image


       使用对象对方法进行参数传递。带static的方法是普通方法,不需要用对象点即可调用,直接使用。实际上传递的是地址值。

格式  public satatic 类名 方法名称(){

               类名  对象名 = new 类名;

               方法体(对象名.成员变量  赋值)

               return 对象名; 此处返回地址值

         }

而接收方 需要进行赋值调用。

image

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

1.定义的位置不一样

局部变量:在方法内部

成员变量:在方法的外部;

2.作用范围不一样

局部变量:只有方法当中才可以使用,出了方法就不能再用

成员变量:整个类都已可以通用

3.默认值不一样

局部变量:没有默认值,如果要使用,需赋值,方法的参数也是局部变量。

成员变量:如果没有赋值,有默认值,和数组一样。

4.内存的位置不一样

局部变量 :位于栈内存

成员变量:位于堆内存

5.生命周期不一样

局部变量:随着方法进栈而诞生,随着方法出栈而消失

成员变量:随着对象创建而诞生,随着对象被垃圾回收而消失


2.4.面向对象的三大特征、封装性、继承性、多态性。

封装性体现在:

1.方法就是一种封装

2.关键字private也是一种封装。

举例子:1.完成代码整合成方法,进行封装

1585726862(1)

举例子2 关键字private(私有化)的例子

private 私有化,main方法将无法调用,需要提供一对getAge和setAge方法

image

对于 setAge(int age)必须有参数(参数类型必须与成员变量对应),无返回值。

对于 getAge()无参数,有返回值,返回值类型与成员变量对应。

快速生成setAge()方法  alt + insert 选择set和get方法即可

特别注意:布尔值类型 是 setXXX和isXXX

1585791557(1)

       当方法的参数的局部变量和类的成员变量重名的时候,根据就近原则,方法的调用将优先使用方法传参的局部变量,如果是想用类的成员变量,可使用this.成员变量,从而进行区分。this关键字将是解决变量名重名的问题。调用谁的方法,this就是谁,this点的就是谁的成员变量而不是方法的局部变量(this也就是谁的地址)。

2.5 构造方法

为什么需要构造方法

  • 面向对象的强制性要求

(1)构造方法是对象时用new关键字必须要调用的

(2)自己不定义任何构造方法时,编译器默认生成一个

image

  • 初始化对象或其他任务

(1)完成对象属性初始化

(2)传递参数

(3)还可以完成信息的读取,或其他对象的初始化等任务

  • 构造方法调用问题

(1)main方法进行构造方法的调用就是new的过程;

(2)类中构造方法直接调用使用this.变量名或者this()代表构造方法

  1 public class Person {
  2         private String name;
  3         private int age;
  4         //构造方法一
  5         public Person() {
  6             this(null);
  7         }
  8         //构造方法二
  9         public Person(String n) {
 10             this(n, 12);//调用第三个
 11         }
 12         //构造方法三
 13         public Person(String n, int a) {
 14             this.name = n;
 15             this.age = a;
 16         }
 17     }

        构造方法的名称必须和类名称一致,定义格式,构造方法的名称和类名称一样,首字符也得大写,构造方法没有返回值,连void都不写

public 类名称(){方法体}

      构造方法的关键点:

1.如果没有写构造方法,将默认有无参构造方法;

2。构造方法也是可以进行重载的

  1 package cn.itcast.day04.demo01.demo04;
  2 
  3 public class Demo01 {
  4     public static void main(String[] args) {
  5         Person p = new Person();
  6         System.out.println("========");
  7         Person p2 = new Person("zhao",20);
  8         System.out.println(p2.name);
  9         System.out.println(p2.age);
 10         System.out.println("========");
 11         System.out.println(p2.getAge());
 12         System.out.println(p2.getName());
 13         p2.setAge(21);
 14         System.out.println(p2.getAge());
 15     }
 16 }
 17 

  1 package cn.itcast.day04.demo01.demo04;
  2 
  3 public class Person {
  4     String name;
  5     int age;
  6     public Person(){
  7         System.out.println("无参构造方法执行");
  8     }
  9     public Person(String name , int num){
 10         this.name = name;
 11         this.age = num;
 12         System.out.println("全参数构造执行");
 13     }
 14 
 15     public void setName(String name) {
 16         this.name = name;
 17     }
 18 
 19     public void setAge(int age) {
 20         this.age = age;
 21     }
 22 
 23     public String getName() {
 24         return name;
 25     }
 26 
 27     public int getAge() {
 28         return age;
 29     }
 30 }
 31 

一旦需要改变参数中的内容,则需要使用set、get。因为一旦类成员变量进行private私有化,构造初始化是快捷、方便的。

image

image

由此 一个标准类(jave bean)的组成部分是:

1、所有的成员变量,进行私有化 private标注;

2. 所有的成员变量进行set/get方法

3.编写一个无参数的构造方法

4.编写一个有参数的构造方法;

或者说:

1、所有属性(成员变量)为private
2、提供默认构造方法
3、提供getter和setter
4、实现serializable接口(Java实体对象为什么一定要实现Serializable接口呢,因为实现Serilizable接口是为了序列化啊)






posted @ 2019-04-13 18:04  芒果侠  阅读(806)  评论(0编辑  收藏  举报