提示:本文介绍面向对象

一、面向对象

1、类和对象

1.1、什么是类

        类是一类具有相同特性的事物的抽象描述,是一组相关属性和行为(方法)的集合。

        属性:一类事物的状态信息,可以理解为成员变量

        方法:就是在你这个程序中,该状态信息要做什么操作,或者基于事物的状态能做什么。

1.2、什么是对象

        对象是一类事物的一个具体个体。即对象是类的一个实例,必然具备该类事物的属性和行为(方法)。

        例如:一个Pet类,它的对象可以为Dog、Cat、Pig等

1.3、类与对象的关系

        ①类是对一类事物的抽象描述。例如:People

        ②对象是一类事物的具体实lei。例如:Man、Woman

        ③类是对象的模板,对象是类的实例

2、如何定义类

2.1、类的定义格式

        关键字:class

        【修饰符】class  类名{

        }

2.2、对象的创建

        关键字:new

        new  类名()//也称为匿名对象
        //给创建的对象命名
        //或者说,把创建的对象用一个引用数据类型的变量保存起来,这样就可以反复使用这个对象了
        类名 对象名 = new 类名();

        对象名中存储的是内存地址

二、包(package)

1、包的作用

(1)可以避免类重名:有了包之后,类的全名称就变为:包.类名

(2)可以控制某些类型或成员的可见范围,如果某个类型或者成员的权限修饰缺省的话,

那么就仅限于本包使用。

(3)分类组织管理众多的类

1.2、如何声明包

        关键字:package

        package  包名;

        注意:(1)必须在源代码文件的代码首行

                   (2)一个源文件只能有一个声明包的package语句

包的命名规范和习惯:

                   (1)所有单词都小写,每一个单词之间使用.分割

                   (2)习惯用公司的域名倒置开头

        例如:com.xl.xxx;

2.3、如何跨包使用类

        导包:import  包.类名;

                   import  包.*;

三、成员变量

1、如何声明成员变量

        【修饰符】class  类名{

                【修饰符】数据类型  成员变量名;

        }

        示例:

        public class Person{
            String name;
            char gender;
            int age;
        }

2、对象的实例变量

2.1、实例变量的特点

        (1)实例变量的值是属于某个对象的

        (2)实例变量有默认值

2.2、实例变量的访问

        对象.实例变量

        例如:

           public static void main(String[] args) {
                Person p1 = new Person();
                p1.name = "张三";
                p1.age = 23;
                p1.gender = '男';

四、方法(Method)

1、方法的概念

        方法也叫函数,是一组代码语句的封装,从而实现代码重用,从而减少冗余代码,通常它是一个独立功能的定义,方法是一个类中最基本的功能单元。

2、方法的特点

        (1)必须先声明再使用

        (2)不调用不执行,调用一次执行一次

3、如何声明方法

3.1、声明方法的位置

        声明方法的位置==必须在类中方法外==,即不能在一个方法中直接定义另一个方法。

        类{
    方法1(){
            }
    方法2(){  
            }
        }

3.2、声明方法的语法格式

        【修饰符】返回值类型 方法名(【形参列表】)【throws  异常列表】{

                        方法体的功能代码

                }

(1)一个完整的方法 = 方法头 + 方法体。

  • 方法头就是 【修饰符】 返回值类型 方法名(【形参列表 】)【throws 异常列表】,也称为方法签名,通常调用方法时只需要关注方法头就可以,从方法头可以看出这个方法的功能和调用格式。

  • 方法体就是方法被调用后要指定的代码,也是完成方法功能的具体实现代码,对于调用者来说,不了解方法体如何实现的,并影响方法的使用。

(2)方法头可能包含5个部分,但是有些部分是可能缺省的

  • 修饰符:可选的。方法的修饰符也有很多,例如:public、protected、缺省、private、static、abstract、native、final、synchronized等。其中根据是否有static,可以将方法分为静态方法和非静态方法。其中静态方法又称为类方法,非静态方法又称为实例方法。==接下来咱们先学习实例方法==。

返回值类型: 表示方法运行的结果的数据类型,方法执行后将结果返回到调用者

  • 基本数据类型:int、double、char等

  • 引用数据类型:类、String、数组等

  • 无返回值类型:void

方法名:给方法起一个名字,见名知意,能准确代表该方法功能的名字

参数列表:表示完成方法体功能时需要外部提供的数据列表

  • 无论是否有参数,()不能省略

  • 如果有参数,每一个参数都要指定数据类型和参数名,多个参数之间使用逗号分隔,例如:

    • 一个参数: (数据类型 参数名)

    • 二个参数: (数据类型1 参数1, 数据类型2 参数2)

  • 参数的类型可以是基本数据类型、引用数据类型

  • throws 异常列表:可选

(3)方法体:方法体必须有{}括起来,在{}中编写完成方法功能的代码

关于方法体中return语句的说明:

  • return语句的作用是结束方法的执行,并将方法的结果返回去

  • 如果返回值类型不是void,方法体中必须保证一定有 return 返回值; 语句,并且要求该返回值结果的类型与声明的返回值类型一致或兼容。

  • 如果返回值类型为void时,方法体中可以没有return语句,如果要用return语句提前结束方法的执行,那么return后面不能跟返回值,直接写return ; 就可以。

  • return语句后面就不能再写其他代码了,否则会报错:Unreachable code 

        例如:

package com.haogu.test04.method;
​
/**
 * 方法定义案例演示
 */
public class MethodDefineDemo {
    /**
     * 无参无返回值方法的演示
     */
    void sayHello(){
        System.out.println("hello");
    }
​
    /**
     * 有参无返回值方法的演示
     * @param length int 第一个参数,表示矩形的长
     * @param width int 第二个参数,表示矩形的宽
     * @param sign char 第三个参数,表示填充矩形图形的符号
     */
    void printRectangle(int length, int width, char sign){
        for (int i = 1; i <= length ; i++) {
            for(int j=1; j <= width; j++){
                System.out.print(sign);
            }
            System.out.println();
        }
    }
​
    /**
     * 无参有返回值方法的演示
     * @return
     */
    int getIntBetweenOneToHundred(){
        return (int)(Math.random()*100+1);
    }
    
    /**
     * 有参有返回值方法的演示
     * @param a int 第一个参数,要比较大小的整数之一
     * @param b int 第二个参数,要比较大小的整数之二
     * @return int 比较大小的两个整数中较大者的值
     */
    int max(int a, int b){
        return a > b ? a : b;
    }
}

4、如何调用实例方法

4.1、方法调用语法格式

        对象.非静态方法(【实参列表】)

4.2、形参和实参
  • 形参(formal parameter):在定义方法时方法名后面括号中声明的变量称为形式参数(简称形参)即形参出现在方法定义时。例如:public void  method_Test(String   a){};这里a就是形式参数。

  • 实参(actual parameter):调用方法时方法名后面括号中的使用的值/变量/表达式称为实际参数(简称实参)即实参出现在方法调用时。例如:Student.method_Test("This is a Test");这里的"This is a Test"就是实参

  • 调用时,实参的个数、类型、顺序顺序要与形参列表一一对应。如果方法没有形参,就不需要也不能传实参。

  • 无论是否有参数,声明方法和调用方法是==()都不能丢失==

4.3、返回值问题

方法调用表达式是一个特殊的表达式:

  • 如果被调用方法的返回值类型是void,调用时不需要也不能接收和处理(打印或参与计算)返回值结果,即方法调用表达式==只能==直接加;成为一个独立语句。

  • 如果被调用方法有返回值,即返回值类型不是void,

    • 方法调用表达式的结果可以作为赋值表达式的值

    • 方法调用表达式的结果可以作为计算表达式的一个操作数,

    • 方法调用表达式的结果可以作为另一次方法调用的实参,

    • 方法调用表达式的结果可以不接收和处理,方法调用表达式直接加;成为一个独立的语句,这种情况,返回值丢失。

5、this关键字

        this:可以理解为当前类的实例

        如果没有歧义,可以省略this。

例如:在构造方法中public  Student(int age,String name){

                this.age = age;

                this.name = name;

        }

6、实例变量与局部变量的区别

(1)声明位置和方式①实例变量:在类中方法外②局部变量:在方法体{}中或方法的形参列表、代码块中

(2)在内存中存储的位置不同①实例变量:堆②局部变量:栈

(3)作用域不同①实例变量:通过对象就可以使用,本类中“this.,没有歧义还可以省略this.”,其他类中“对象.”②局部变量:出了作用域就不能使用

五、参数问题

1、可变参数

        在JDK1.5之后,当定义一个方法时,形参的类型可以确定,但是形参的个数不确定,那么可以考虑使用可变参数。可变参数的格式:

        【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){  }

        例如:void Student (int... age){}

        可变参数的特点和要求:

        (1)一个方法最多只能有一个可变参数

        (2)如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个

        (3)在声明它的方法中,可变参数当成数组使用

        (4)其实这个书写“≈”【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型[] 形参名){}

1.1、方法只有可变参数

        例如:求n个整数的和

1.2、方法包含非可变函数和可变函数

例如:

2、方法的参数传递机制

(1)基本数据类型:值传递,形参值的改变不会影响实参

(2)引用数据类型:引用传递,传递的是对象的地址,形参地址值里面的数据的改变会影响实参

六、方法的重载

        方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。

        例如:

                (1)定义方法求两个整数的最大值

                (2)定义方法求三个整数的最大值

                (3)定义方法求两个小数的最大值

                (4)定义方法求n个整数最大值

                

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐