Java 面向对象之初识面向对象及方法回顾和加深

java面向对象

1.初始面向对象

1.1 面向过程与面向对象

  • 面向对象是整体的框架,面向过程是具体的流程。

    • 如果程序中语句非常多,那么我们将其封装成方法;如果程序中变量比较多,那么我们将其封装成结构体。属性加方法构成一个类。
    • 面向过程是一个人完成一个巨大的工程比如建一个房子,自己一个人从头做到尾,而面向对象是一个总设计师来分配给好多个人,有的人负责买材料,有的人负责构造房屋图纸,有的人负责施工,各个部分合起来完成这栋房子的建设,每个人都是一个对象,将一个大问题分化成好多小问题,让每个小问题再面向对象,最后各个部分完成之后,总的任务就完成了,如果某个人(某个对象)出了问题,直接就可以找这个部分的负责人。
  • 面向过程思想

    • 步骤清晰简单,第一步做什么,第二步做什么…
    • 面对过程适合处理一些较为简单的问题
  • 面向对象思想

    • 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
    • 面向对象适合处理复杂的问题,适合处理需要多人协作的问题。
    • 对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思维去处理。

1.2 什么是面向对象

  • 面向对象编程(Object-Oriented Programming, OOP)

  • 面向对象编程的本质就是: 以类的方式组织代码,以对象的形式封装数据。

    • 类是抽象的,对象是具体的实物,是类的实现
  • 核心:抽象

  • 三大特性:

    • 封装
    • 继承
    • 多态
  • 从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象。

  • 从代码运行角度考虑是先有类后有对象。类是对象的模板。


2.方法的回顾和调用

  • 方法的定义

    • 修饰符:public表示是方法或变量是公共的,所有人都可以访问这个方法,static表示该方法或者变量是静态的,可以直接调用,而不需要去创建对象来调用。

    • 返回类型

    • break 和 return 的区别
      break跳出循环或者结束switch
      continue会跳过此次循环,开始执行下一个循环
      return结束方法体,只要遇到return就会退出方法体,其后方法体内的所有代码都不会被执行

    • 方法命名规则: 驼峰命名法,且要见名知义。

    • 参数列表: (参数类型 参数名)可有多个(...)。

    • 抛出异常: 后面讲解

  • IDEA中分屏对比操作: 点击要并列的程序,点击鼠标右键,选择split and move right,就可以对比着敲某个程序


2.1 方法的定义代码演示:

package oopdemo01.demo01;

import java.io.IOException;

public class Demo01 {
    //main 方法  一个类中只有一个main方法,我们在类中定义方法,通过调包来使用,一般不是每一个类中都有main方法的,学习阶段的main方法只是为了方便运行。
    public static void main(String[] args) {


    }
    /*
    *       修饰符  返回值类型  方法名(...){
    *         //方法体
    *        return 返回值;
    *       }

    *
    * */

    //方法可以有返回值,返回值需要一个同类型的变量来接;也可以没有返回值,比如直接打印输出一些东西

    //String:返回一个字符串
    public String sayHello(){

        return "hello world";
    }
      //返回一个空值
    public void hello(){
        return;   //return结束方法,返回一个结果
                 //遇到return就退出方法体,return后的语句都会被报错;
    }

    public int maxPrint(int a,int b){

        return a>b ? a:b;  //三元运算符
    }

    //读文件,抛出异常
    public void readFile(String file)throws IOException {
            //抛出异常,这才是一个完整的方法
    }


}

运行结果

hello world
i = 5

———————————————————————————————————————————————————————————

3.方法的调用:递归

  • 非静态方法: 真实开发中都是非静态的方法调用,需要创建一个新的对象;

    • 同一包下不同类中的方法调用,需要new一个该类的对象,通过对象名.方法名来调用非静态方法。
  • 静态方法

    • 同一包下不同类中静态方法的调用,直接对象名.方法名

    • 方法调用的几种场景:非静态方法位于类下,主函数main之外

    • (1).同一类下的非静态方法可以相互调用

    • (2).同一类下,主函数main之外的静态方法也可以相互调用

    • (3).同一类下的静态方法不可以调用非静态方法,因为静态方法随着类加载,而非静态方法只有实例化,即new出一个对象之后才能被加载

  • 形参和实参

  • 值传递和引用传递

  • this关键字: (代表当前这个类)


3.1 静态方法和非静态方法代码演示

package oopdemo01.demo01;

public class Demo02 {
    public static void main(String[] args) {

    /*静态方法 static

            调用: 类名.方法名


      非静态方法

            1.实例化这个类  new+类名+.方法名
            2.对象类型 对象名 = 对象值 ;
                     对象.方法名

        */

       //同一包下不同类中静态方法的调用,直接对象名.方法名

        Student.say();//静态方法直接  类名.方法名

        new Student().hello();//非静态方法

        //真实开发中都是这样的非静态的方法调用,需要创建一个新的对象
        //同一包下不同类中的方法调用,需要new一个该类的对象,通过对象名.方法名来调用非静态方法。
        Student student = new Student();//非静态方法
        student.hello();


    }
}

package oopdemo01.demo01;

public class Student {

    //   静态方法    say
    public static void say(){
        System.out.println("学生说话了");

    }

    //非静态方法  hello
    public  void hello(){
        System.out.println("你好美女");
    }


   //同一类下的非静态方法可以相互调用
    public void a(){
        b();
    }

    public void b(){

    }
     //static 方法不能调用不是静态方法的方法
    //同一类下的静态方法不可以调用非静态方法,因为静态方法随着类加载,而非静态方法只有实例化,即new出一个对象之后才能被加载
    public static void c(){
        //d();   会报错   由于被static 修饰和会和类一起加载   而没被static 修饰 对象实例化之后才存在 没New时,d方法还不存在
    }

    public void d(){
        c();// 可以调用C 方法
    }


}

运行结果

学生说话了
你好美女
你好美女

3.2 形参和实参代码演示

package oopdemo01.demo01;

public class Demo03 {
    public static void main(String[] args) {

        Demo03 demo03 = new Demo03();

        //实际参数和形式参数的类型要对应
        int print = demo03.maxPrint(2, 3);//实际参数
        System.out.println("print = " + print);

    }
         //   返回值为int 类型
    public int maxPrint(int a,int b){//形式参数
        return a+b;
    }

}


运行结果

print = 5

3.3 值传递和引用传递代码演示

package oopdemo01.demo01;

public class Demo04 {
    //值传递
    public static void main(String[] args) {
        int a=10;
        System.out.println(a);//10

        Demo04.chang(a);
        System.out.println(a);//10  这里两次a输出的值都为10;因为main方法中的a是实参,change中的num是形参,实参并没有改变。
    }
    //返回值为空
    public static void chang(int num){
         num=11;

    }

}

运行结果

10
10

package oopdemo01.demo01;


//引用传递:引用传递的对象是对象,本质还是值传递。
//引用本来就不是一种基本数据类型,new出的一个对象,将对象名作为参数传入方法,会改变其下的某些属性值,person是一个引用,其代表了创建对象的存储在堆中的位置,该对象的所有属性,方法都存在堆中,通过对象名对其进行索引,直接把对象名这种引用数据类型当成参数,就是直接对堆中的数据(属性)进行操作,直接更改了属性值

public class Demo05 {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person.name);//null

        Demo05.chang(person);
        System.out.println(person.name);//an

    }
       //定义了一个person类,有个属性:name
    public static void chang(Person person){
        //person是一个对象:指向的--->Person person = new Person();这是一个具体的人可以改变属性
        person.name="an";

    }

}
    //一个.java文件下可以有多个class类,但是只能有一个public class公共类
    class Person{
        String name;
    }

运行结果

null
an


4.更多参考

狂神说Java

posted @ 2022-05-22 17:28  哼哼哈¥  阅读(45)  评论(0编辑  收藏  举报