面向对象01-方法(重载)/包/修饰符

面向对象01-方法(重载)/包/修饰符

[TOC]

1、面向对象与面向过程

面向对象和面向过程都属于思考问题的方式

面向过程:以执行者的角度思考问题,侧重于实现的过程,或侧重于“怎么做”,比较适合解决小型的问题
面向对象:以指挥者的角度思考问题,侧重于“谁来做”,比较适合解决中大型的问题

总结:面向对象和面向过程并不是完全独立的。一般来讲,从宏观上先用面向对象思考方式,然后在细节上又使用了面向过程的思考方式

2、类和对象

对象:客观世界中存在的一切可以被描述的事物,都称为对象

通过对象的特征(属性和方法)区分对象
属性:描述对象的静态、外观的特性,比如 姓名、颜色、身高、价格等
方法:描述对象的行为或功能,比如吃、喝、学习、睡觉、能盛水等

类: 一组具有相同属性和方法的对象的集合,抽取成类(归纳总结出来的)

区别:
对象:实际存在的,可以直接操作,是一个具体的实例
类:抽象的、模板式的存在,不可以直接操作

联系:
类:是一组对象的集合,是对象的类型(切记),是通过对象归纳总结出来的产物
对象:在java中,通过类创建出来的具体的实例
2.1、类和对象的的创建
【修饰符】 class 类名{
        编写属性
        编写方法
    }

类名 对象名 = new 类型();
对象名.属性=值;
对象名.方法();
2.2、类和对象的内存分配图
//栈:对象的引用、局部变量
//堆:对象和全局变量(属性)在堆中创建新对象
//方法区:类信息
//语法:类名 对象名=new  类名();
Person p1 = new Person(); //该句 首先在内存中判断类是否加载 如果没有加载 使用类加载器加载类(到方法区) 然后在创建对象
//先去判断需要的类是否已经加载,如果已经加载了,则无需再加载,如果没有加载,则需要通过类加载器加载类信息到方法区
面向对象01-方法(重载)/包/修饰符_第1张图片
image

3、类的成员之一:属性

1、属性的类型可以为任意类型,包含基本类型和引用类型 (一个类也可以做属性)

2、每个对象的属性是独立的。其中一个对象对其属性进行更改,不影响另外一个

3、属性的定义语法和使用,同变量,也就是本质上就是变量

变量根据作用域不同,可以分为两类:全局变量和局部变量

变量的作用域:也就是变量的作用范围,根据变量定义的位置决定的,一般是指包含变量定义的最近的大括号

全局变量:作用域为整个类体,也就是属性或成员变量

局部变量:作用域为包含它的方法或代码块中,也就是除了属性,其他的变量都是局部变量

3.1 全局变量和局部变量
作用域 存储位置 生命周期 变量重名 默认值 访问可见性 修饰符
全局变量 较大,整个类 不能重名 本类或者其他类
局部变量 较小,方法或者代码块 局部有交集不能重名 但是一个全局和一个局部可以重名 遵循就近原则 b本类的方法或者代码

4、类的成员之二:方法

4.1、方法的理解和好处

理解

方法 :定义在类体中,描述了一组对象的行为或功能。又称为函数。

好处:

1、对于调用者来讲,不关心具体的实现细节,调用比较方便,只需要关心
“叫什么”和“干什么”。

从一定程度上来讲,提高了安全性和封装性

2、对于设计者来讲,提高代码的重用性和维护性

4.2、方法的五要素★

1、修饰符
​ 可选

2、返回类型
​ 特点:某个方法执行结束后需要返回给调用方一个结果,则该方法需要设计成带返回值的方法

① 一个方法至多有一个返回值
②返回类型可以为任意数据类型,包含基本类型或引用类型
public int method(){}
public Person method(){}
public int[] method(){}

③如果方法没有返回值,则返回类型写void,方法体中不需要return语句
如果方法有返回值,则返回类型写返回值的类型(一致或兼容),方法体中必须写上return 值;

public void method(){
    syso();
    
}
public int method(){
    syso();
    return a;
    
}

④如果方法有返回值,则要保证方法体的执行语句最后一句肯定为return语句

public int method(){
    if(){
        return 100;
    }
}

3、方法名

4、参数列表
​ 特点:有的行为的执行,需要调用方在最开始传入一些值,才能执行,这些值称为参数

①参数可以有0个或多个,具体语法

(参数类型 参数名,参数类型 参数名)

②参数类型 可以为任意类型,包含基本类型或引用类型

public void method(int a,String b,int[] arr,Person per){}

③调用带参数的方法时,必须传入指定类型的参数,否则报错!

5、方法体

特点:描述功能或行为具体实现的步骤,里面可以放任意逻辑语句,输入、输出、变量、循环、方法的调用等,但不能放方法的定义
4.3、方法的声明 ★
语法:

修饰符  返回值类型  方法名 ( 参数列表) {
     方法体语句;
} 

具体形式:

1.无返回无参
2.有返回无参
3.无返回有参
4.有返回有参
4.4、方法的调用 ★
语法:
同一个类中:  
    类型 名 = 方法名(参数列表);

不同类中:
    类型 名 = 对象名.方法名(参数列表);
4.5、方法的调用机制 【理解】

栈:先进后出

面向对象01-方法(重载)/包/修饰符_第2张图片
image

​ 每次调用方法,伴随着“方法入栈”操作,也就是栈中为该方法分配了一块空间,用于保存该方法中涉及到的变量

每次方法调用结束,伴随着“方法出栈”操作,也就是栈中分配的空间被释放了。

4.6、方法的参数传递 【面试题】 ★
package day08;

/*
 * 此类用于演示
 * 一、方法的参数类型为:引用类型
 *  ①数组类型
 *  ②对象类型
 * 
 * 二、方法的返回类型为:引用类型
 *  ①数组类型
 *  ②对象类型
 * 
 * 
 */

public class TestArgs {
    
    public static void main(String[] args) {
        MyUtils mu = new MyUtils();
        //调用数组类型做参数的方法
        double[] arr={100,2,5.8,980.5,89};
        double max = mu.getMax(arr);
        System.out.println(max);
        System.out.println("====================");
        
        //调用对象类型做参数的方法
        Book book = new Book();
        book.price=900;
        book.name="葵花宝典";
        mu.setBookPrice(book);
        System.out.println(book.name+"\t"+book.price);      
        System.out.println("====================");
        
        //调用数组类型做返回的方法
        int[] src={2,3,4};
        int[] dest = mu.arrayCopy(src, src.length);
        for (int i = 0; i < dest.length; i++) {
            System.out.print(dest[i]);
            System.out.println();
        }
        System.out.println("====================");
        
        //调用对象类型做返回的方法
        Book copyBook = mu.copyBook(book);
        System.out.println(copyBook.name+"\t"+copyBook.price);
    }
    

    }

    
class MyUtils{
    //参数类型:数组类型
    //定义方法,实现求某个double数组的最大值,并返回
    public double getMax(double[] arr){
        double max = arr[0];
        for(int i = 0;i150,则更改为150,如果价格>100,更改为100,否则不变
    public void setBookPrice(Book book){
        if(book.price>150){
            book.price = 150;
        }else if(book.price>100){
            book.price=100;
        }
    }
    
    //返回类型:数组类型
    //  场景:实现数组的复制功能,根据旧数组和指定长度,返回一个新数组,元素和旧数组一样
    public int[] arrayCopy(int[] src, int  len){
        int [] dest = new int[len];
        int length = len

当调用方法时,将实参传递给形参(参数的赋值)的过程,称为方法的传参。

特点:★
​ 基本类型做参数,传递的是值,形参的改变不影响实参
​ 引用类型做参数,传递的是地址,形参的改变(成员)影响实参\

注意:
当引用类型做参数时,如果形参改变的是(地址),则最终不影响实参(new了一个新的地址)

面向对象01-方法(重载)/包/修饰符_第3张图片
image
面向对象01-方法(重载)/包/修饰符_第4张图片
image
【面试题】java中方法的参数传递的是什么?
java中,方法参数是按值传递!
如果是基本类型,则值 代表元素内容
如果是引用类型,则值 代表地址号
4.7、方法重载 √

概念:
​ java中允许同一个类中,多个方法的名称相同,但参数列表必须不同
​ 这种现象称为重载!

在同一个类中 同名方法情况下 只和参数有关

①、必须保证参数列表中至少有一样不同(参数类型、参数个数、参数顺序)
②、返回类型无要求
③、修饰符无要求

4.8、可变参数的方法 √
jdk5.0出现的新特性。将同一个类中,多个方法名相同、参数类型相同、返回类型相同,仅仅是参数个数不同的方法抽取成一个方法,这种方法称为可变参数的方法

好处:
​ 提高代码的重用性和维护性

语法:

    修饰符 返回类型    方法名(参数类型...参数名){
        
    }

注意:使用时,将可变长度的参数当做数组使用

使用特点:

    1、可变参数的实参可以为0个或任意多个
    2、可变参数的实参可以为一维数组类型
    3、可变参数和普通类型参数 一起使用时,只能放在最后
    4、一个参数列表中至多有一个可变参数!

5、包的使用

1、类似于文件系统的文件夹,可以实现分类管理类文件,方便查找
2、解决了同一个项目中同名类的冲突问题

命名规则:
​ 标识符+小圆点
​ 标识符:只能包含数字、字母、下划线和$符号,不能以数字开头,不能是关键字或保留字

写法:标识符.标识符
举例:
demo.int   ×
java.demo  ×
demo.3a   ×


命名规范:
建议小写字母,并且采用域名倒置的写法

域名倒置:com.baidu
www.baidu.com
www.atguigu.com

建议写法:

com.公司名.部门名.项目名.业务模块名;
com.项目名.业务模块名;
com.atguigu.业务模块名;

1、package关键字

①如果某类存在于指定包下,则要求类的最上方必须添加包的声明语句,语法如下:

package 包名;

②包的声明语句在一个类中只可能出现一次
③位置:最上面

2、import关键字

①跨包访问某类,必须要求导入该类所在的包&&该类具有跨包访问权限
语法:
import 包名.类名;或
import 包名.*;

②导入包的语句在一个类中可以出现多次,没有顺序要求

③位置:package——import——class

④如果想访问多个包中的同名类,则要注意不能直接类上方添加import导包语句,否则有歧义
可以使用全类名限定的方式

6、修饰符

面向对象01-方法(重载)/包/修饰符_第5张图片
image
修饰成员:比如属性和方法
private     私有的 仅仅本类中可以访问
缺省          默认的 本包中所有类都可以访问
protected   受保护的    本包中所有类以及其他包的子类可以使用
public      公共的 所有包中的所有类都可以访问
-----------------------------------------------------------------------------------------
修饰类:只能用public和缺省的修饰类
缺省      只有本包中才能访问该类
public  所有包中都可以访问该类

你可能感兴趣的:(面向对象01-方法(重载)/包/修饰符)