zoukankan      html  css  js  c++  java
  • 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接口是为了序列化啊)






  • 相关阅读:
    ios中的任务分段
    UVA 531
    OGG同构(ORACLE-ORACLE)、异构(ORACLE-MYSQL)同步配置及错误解析
    JavaScript自调用匿名函数
    Redis 主从配置和参数详解
    python开发环境设置(windows)
    Havel-Hakimi定理 hdu2454 / poj1695 Havel-Hakimi定理
    libevent源码分析-介绍、安装、使用
    Linux网络监控工具nethogs
    spring(3)------控制反转(IOC)/依赖注入(DI)
  • 原文地址:https://www.cnblogs.com/rango0550/p/10702221.html
Copyright © 2011-2022 走看看