二、面向对象基础(上)

面向对象的三大基本特征:封装,继承,多态

1、概述

Java语言是一种面向对象的程序设计语言,面向对象思想(OOP)是一种程序设计思想,在面对对象思想的指引下,使用Java语言去设计和开发计算机程序。

对象指现实中的一切事物,每种事物都有自己的属性和行为。面向对象思想就是在计算机程序设计中,参照现实中事务,将事务的属性特征,行为特征抽象出来,描述成计算机事件的设计思想。

2、面向对象和面向过程的区别

面向过程:POP(Process-Oriented Programming),例如C语言
以函数(方法)为最小单位,数据独立于函数之外,以过程,步骤为主,考虑怎么做。程序员是具体执行者。
面向对象:OOP(Object-Oriented Programming),例如Java
以类/对象为最小单位,类包括数据和方法。以对象为基础,考虑谁来做,谁能做。程序员是指挥者。
面向对象思想更符合我们思考习惯,可以将复杂的事情简单化,并将我们从执行者变成了指挥者。

3、类和对象

  • :是一类具有相同特性的事物的抽象描述,是一组相关属性行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。属性就是事务的状态信息,例如年龄,身高,职业等,行为就是能做什么,比如吃饭,睡觉等等
  • 对象:一类事物的具体实例,比如类是人的话,那么对象就是具体的某一个人
  • 类和对象的关系:类是对一类事物的描述,是抽象的;对象是一类事物的实例,是具体的。类是对象的模板,对象是类的实体
  • 类的定义和对象的创建
/*
	类的定义
*/
【修饰符】 class ClassName{
    //成员变量 
    //static final一般一起用,定义常量
    【修饰符】 【static:是否静态成员】 【final:是否可以修改的变量】 类型 变量名【=初始化值】;
    //成员方法
    【修饰符】 【返回类型】 方法名(参数组){
        方法体
    }
}

/*
	对象的创建
*/

new 类名()//匿名对象
//将创建出来的对象用一个引用数据类型的变量保存起来
类名 对象名 = new 类名();

4、成员变量

静态成员只能访问静态成员,不能访问普通成员。

普通的成员可以访问静态的成员,也可以访问普通的成员

4.1 成员变量分类

  • 实例变量:没有static修饰,也叫对象属性,属于某个对象,通过对象来调用,类名.静态成员变量(推荐)对象名.普通成员变量(不推荐)
  • 类变量:有static修饰,也叫类变量,属于整个类,不是属于某个实例,对象名.普通成员变量

4.2 成员变量访问

class Person{
    static String country;
    String name;
    String gender="男";//显示的赋值
}

public class TestOne{
    public static void main(String[] args){
        //创建对象
        Person p = new Person();
        
        String c1 = Person.country;//通过类名.静态成员变量名 访问静态成员变量(推荐)
        String c2 = p.country;//通过对象名.静态成员变量名 访问静态成员变量(不推荐)
        
        p.name = "zhangsan";//通过对象名.普通成员变量名 访问普通成员变量
    }
}

4.3 成员变量的特点

  • 成员变量有默认值
基本类型整数(byte,short,int,long)0
浮点数(float,double)0.0
字符(char)‘\u0000’
布尔(boolean)false
数据类型默认值
引用类型数组,类,接口null
  • 类变量的值是所有对象共享的,实例变量的值是每个对象对立的

4.4 成员变量访问内存图

在这里插入图片描述

4.5 成员变量与局部变量的区别

  • 分类:变量分为成员变量和局部变量,成员变量包括静态变量和实例变量
  • 区别
    • 声明位置和方式
      • 静态变量在方法外声明,有static修饰;实例变量在方法外声明,没有static修饰
      • 局部变量在方法体或者形参列表,或代码块中声明
    • 在内存中存储的位置
      • 静态变量在方法区中,实例变量在堆中,局部变量在栈中
    • 生命周期
      • 静态变量声明周期和类一致,被所有对象共享,早于对象创建而存在
      • 实例变量和对象生命周期一致,随对象创建而存在,随对象被GC回收而消亡,每个对象的实例变量是独立的
      • 和方法调用的生命周期一致,每次方法被调用而存在,随方法执行结束而消亡,局部变量每次方法调用都是独立的
    • 作用域
      • 静态变量和实例变量没有作用域这一说。本类中,静态方法或惊天代码块只能使用静态变量或方法,其他类中,看访问修饰符(public,protected,private等)
      • 局部变量,有作用域,作用域外无效
    • 修饰符
      • 静态变量的修饰符:public,protected,private,final,volatile等,一定有的是static
      • 实例变量的修饰符:public,protected,private,final,volatile,transient等,transient代表不参与序列化
      • 局部变量只能用final修饰
    • 默认值,静态变量和实例变量有默认值,局部变量没有默认值,必须初始化,形参需要实参来进行初始化

5、成员方法

  • 概念:方法也叫函数,是一个独立功能的定义,是一个类中最基本的功能单元
  • 原则:先声明后使用,不调用不执行,调用一次执行一次
  • 分类:分为实例方法和静态方法
    • 实例方法:没有static修饰的方法,必须童工实例对象来调用
    • 静态方法:有static修饰的方法,也叫类方法,可以由类名来调用
  • 方法组成
    • 修饰符:public,static,private等都是修饰符
    • 返回值类型:方法运行的结果的数据类型,将结果返回给调用者,返回值类型可以是基本数据类型、引用数据类型,无返回值类型(void)
    • 方法名:见名知意
    • 参数列表:方法内部需要用到其他方法中的数据,需要通过参数传递的形式将数据传递过来,可以是基本数据类型,引用数据类型,或没有参数
    • 方法体:特定功能的代码
    • return:结束方法,并将方法的结果返回。返回值不是void,则一定要有return语句,并且返回值结果与声明的返回值类型一致或兼容。返回值是void时,return后不用跟返回值,或者可以不用写return。return后不能写其他代码,否则会报错:Unreachable Code
  • 方法调用
/*
	实例方法的调用:没有static修饰的方法,通过对象名.实例方法名(【形参列表,用逗号','隔开】)调用
	静态方法的调用:static修饰的方法,通过类名.静态方法名(【形参列表,用逗号','隔开】)调用
*/
class MethodTest{
    public String name;
    //无参无返回值的方法
    public void methodOne(){
        
    }
    //有参且有返回值的方法,方法中的参数是形参,方法定义时方法名后括号中的变量称为形参
    public static String methodTwo(String name){
        this.name=name;
        return this.name;
    }
}

public class TestOne{
    public static void main(String[] args){
        MethodTest mt = new MethodTest();
        System.out.println(mt.methodOne());//调用实例方法
        System.out.println(MethodTest.methodTwo("zhangsan"));//调用静态方法,传入实参
    }
}

5.1 方法调用内存分析

方法不调用不执行,调用一次执行一次,每次调用会在栈中有一个入栈动作,即给当前方法开辟一块独立的内存区域,用于存储当前方法的局部变量的值,当方法执行结束后,会释放该内存,称为出栈,如果方法有返回值,就会把结果返回调用处,如果没有返回值,就直接结束,回到调用处继续执行下一条指令。

栈结构:先进后出,后进先出。

  • main方法入栈,顺序执行,到m的赋值语句时,max方法入栈,执行max方法,将表达式a>b?a:b的结果放入操作数栈,返回调用点,将操作数栈中的值赋值给m
    在这里插入图片描述
  • main方法入栈,在堆中创建对象c1,给对象c1的属性raduis值赋值,area方法入栈,执行area方法,将返回结果放在当前对象的操作数栈中,返回调用点,将当前对象操作数栈中的值赋值给area1;在堆中创建对象c2,给对象c2的属性raduis值赋值,area方法入栈,执行area方法,将返回结果放在当前对象的操作数栈中,返回调用点,将当前对象操作数栈中的值赋值给area2
    在这里插入图片描述
  • main方法入栈,创建数组对象,sort方法入栈,改变数组中的数据,此时arr指向的地址不变,但是地址中的数据发生了改变,执行for循环遍历
    在这里插入图片描述

5.2 构造方法

// 在静态的方法中不能使用this关键字。因为this关键字是对象级别的关键字。
public class Student {
    private String stuName;
    private int stuAge;
    private String stuGender;
    // 静态的属性也叫类变量。
    // 静态的成员属于类级别的成员,分配内存空间早于对象的创建。
    // 普通的成员属于对象级别的成员,分配空间在创建对象之后。
    // 静态的属性在类被加载的时候就已经分配内存空间了。所以可以不用创建对象,由类名调用。
    public static String school;

    // 构造方法仅能在创建对象的时候调用一次,对象创建之后就不能再调用了。
    // 构造方法可以在创建对象的时候执行初始化工作。
    public Student(String stuName,int stuAge,String stuGender){
        this.stuName = stuName;
        this.stuAge = stuAge;
        this.stuGender = stuGender;
    }

    // 当一个类中没有任何一个显示的构造方法,则会配备一个默认无参的隐示构造方法
    // 当类体中编写了任何一个显示的构造方法,这个默认无参的构造方法就消失了。
    // 当类体中有显示带参的构造方式,一定将默认无参的构造方法写出来。
    public Student(){

    }

    public String getStuName() {
        return stuName;
    }

    // java语言允许属性和局部变量重名,当属性和局部变量重名时,局部变量拥有更高的优先级。
    // 如果在重名状态下需要访问属性,那么需要this.属性名,this.出来的就是属性。
    // this的含义是当前对象。
    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public int getStuAge() {
        return stuAge;
    }

    public void setStuAge(int stuAge) {
        if(stuAge >= 18 && stuAge <= 40) {
            this.stuAge = stuAge;
        }else{
            this.stuAge = 18;
        }
    }

    public String getStuGender() {
        return stuGender;
    }

    public void setStuGender(String stuGender) {
        this.stuGender = stuGender;
    }

    public void sayHello(){
        System.out.println("你好,我叫"+stuName+",我今年"+stuAge+"岁,我是一名"+stuGender+"同学。");
    }
}

6、可变参数

JDK1.5之后,如果我们定义一个方法时,此时某个形参的类型可以确定,但是形参的个数不确定,那么我们可以使用可变参数。

//既可以传递数组,又可以直接传递数组的元素
【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){  }
//在调用时必须传递数组
【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型[] 形参名){  }
  • 一个方法最多只能有一个可变参数
  • 如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个

7、方法重载

  • 在同一类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回类型无关
  • 参数列表的数据类型个数不同,数据类型不同,数据类型顺序不同均可实现重载
  • 重载方法调用:JVM通过方法的参数列表,调用不同的方法
public class Student {
    public void sayHello(){

    }
    /*
	//错误,参数组相同
    public String sayHello(){
	
    }
    */
    
    //重载1
    public void sayHello(String name,int age){

    }
    
    //重载2
    public void sayHello(int age,String name){

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个猫崽子和你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值