四、方法及面向对象

一、方法
1. 方法调用
  • 两个明确:返回值、 方法参数;
  • 有返回值: 赋值调用,可以单独调用,但单独调用没有意义;
  • 无返回值: 单独调用;
2. 方法重载

在一个类中,出现多个同名方法;

  • 方法名相同;
  • 参数不同:参数个数不同或者参数类型不同;
  • 与返回值无关; (因为有返回值的和无返回值都可以单独调用,虚拟机无法区别哪个方法)
3. 形参: 基本数据类型及引用数据类型

基本数据类型: 形式参数的改变,不影响实际参数;
方法运行完毕后,就会从栈内存中弹出,因此a,b的值不会改变;
在这里插入图片描述
引用数据类型: 形式参数的改变,影响实际参数;
在这里插入图片描述

二、面向对象
  • 面向过程:强调的是功能的每一个步骤;
  • 面向对象:强调的是功能呢的具体模块由对象来实现(让别人帮你做事);
1. 类
  • 成员变量: 类中方法外,不需要赋值,系统会给默认值如0或者null;
  • 成员方法;

一个对象内存图在这里插入图片描述
方法共用内存图
在这里插入图片描述
两个引用指向同一个对象内存图
在这里插入图片描述

2. 成员变量与局部变量
  • 成员变量:类中方法外;保存在堆内存;随着对象的创建和消失而创建和消失;不用赋值(有默认值)
  • 局部变量:方法中或方法声明上(形参);保存在栈内存;随着方法的调用而存在,方法调用完毕就消失;必须先赋值才能使用;
3. private关键字
  • 权限修饰符,修饰成员变量和成员方法,只能在本类中使用;
  • 修饰成员变量,并提供相应的set和get方法(set和get方法中可以提供逻辑);
  • 体现封装思想(成员变量和方法);
4. this关键字

解决类中局部变量和成员变量同名问题

package Day01;

public class Phone {
    private String color;
    private String ip;
    
    // 1. 变量命名:见名知意
    public void setIp(String ip) {
        // 局部变量和成员变量同名:就近原则
        // 第一个ip,就是方法中的局部变量
        // 添加this关键字:代表当前对象的引用,就会指向成员变量
        this.ip = ip;
    }
    public void setColor(String color) {
        this.color = color;
    }
    
}
5. 构造方法
  • 不写构造方法,系统默认给出无参构造;
  • 写出构造方法,系统则不会默认给无参构造;
  • 构造方法支持重载(即无参构造+多个带参构造);
  • 构造方法的调用:new关键字来创建对象时,会调用构造方法;
6. 匿名对象
  • 创建对象时候不用变量接受;
  • 每次使用匿名对象时候,都是新建了一个对象,只能使用一次;
7. 继承
  • 子类(派生类)继承父类(超类,基类);
  • 子类拥有父类的所有公有的成员变量,成员方法;因此提高了代码复用性;
  • 单一继承,多重继承;
  • 假如不是单一继承,各个父类中都包含一个同名方法,导致子类无法区分;

成员变量、成员方法:
1). 子父类成员变量,成员方法不同名,调用哪个就用哪个;
2). 子父类成员变量,成员方法同名,优先调用子类的;

子父类继承内存图:
在这里插入图片描述
方法重写(覆盖):

  • 子父类方法名,参数,返回值完全相同,子类对父类的方法体进行重写;
  • 子类方法对父类的方法扩展及补充;在子类中调用super.method(),从而调用父类的该方法;
  • 子类方法权限大于等于父类权限, 父类private的方法不能被重写(其他都可以);

this及super: 都是在子类中使用

  • this.xxx , this.xxx() : 调用本类的成员变量和成员方法; 调用方法时可以省略
  • super.xxx , super.xxx(): 调用父类的成员变量和成员方法;调用方法时候不能省略
  • this():调用本类其他构造;
  • super(): 调用父类其他构造; 只能在构造方法第一行执行;

构造方法执行顺序:

  • 子类构造 第一行没有调用父类构造,则默认调用父类无参构造;
  • 子类构造 第一行用this调用子类其他构造,其他构造要调用父类构造;
  • 子类构造第一行用super()显式调用父类构造(无参构造及有参构造);
  • 因此,子类创建对象时,都会先去创建父类对象;(java单一原则:父类对象初始化父类的成员变量,子类对象初始化子类成员变量);
8. 抽象类
  • 抽象方法:一个方法只有方法声明,没有方法体;
  • 抽象类:包含一个抽象方法的类,abstract修饰;
  • 抽象类可以包含成员变量;
  • 抽象类不能实例化,一定是一个父类,由子类重写具体的抽象方法;
  • 抽象类的子类,要么也是抽象类,要么就重写父类的抽象方法;
  • 抽象类可以不定义抽象方法,只是类用abstract,为了不让该类来创建对象;
9. 接口
  • 接口中是更抽象的抽象类;
  • 成员方法:默认 public abstract修饰(可以省略);
  • 成员变量: 默认 public static final修饰(可以省略),定义后必须赋值;
  • 接口不能实例化;
  • 接口与接口:多继承,多重继承;
  • 接口与类:类可以实现多个接口;
10. 多态
  • 前提:子父类继承及方法的重写;
  • 调用成员变量: 编译时看父类, 运行时看父类;
  • 调用成员方法:编译时看父类,运行时看子类;

多态弊端及解决方案

  • 向上转型:自动;
  • 向下转型:强制类型转换;
  • 多态只能调用子父类公有的方法,不能调用子类特有的方法;
  • 可通过向下转型实现,但有可能转为具体的实现类时候转错;
public class Test {
    public static void main(String[] args) {
        Animal animal = new Cat();
        // 向下转型时候不会做检验,只要是父类的子类即可
        // 将Cat转换为Dog,编译报错
        Dog dog = (Dog) animal;
        dog.eat();
    }
}
  • 为了避免转换错误,引入instance of:判断对象类型;
 public class Demo1 {
    public static void main(String[] args) {
        Animal animal = new Dog();
        // 判断该对象是否为Cat
        boolean flagCat = animal instanceof Cat;
        if (flagCat){
            Cat cat = (Cat) animal;
            cat.eat();
        }

        boolean flagDog = animal instanceof Dog;
        if (flagDog){
            Dog dog = (Dog) animal;
            dog.eat();
        }
    }
}
11. static关键字
  • 修饰类中所有对象共享的成员变量和成员方法:;
  • 调用时类名.方法名/成员变量,也可以通过new对象的方式来调用;
  • 一个对象修改静态成员变量时,会影响其他所有对象的该变量;
  • 静态成员变量保存在方法区中的静态方法区;
    在这里插入图片描述
12. final关键字
  • 类: 不能被继承;
  • 成员变量:只能被赋值一次,不可变,使用前必须先赋值;
  • 成员方法:不能被子类重写;
  • 局部变量(基本类型):常量;
  • 局部变量(引用类型):引用类型地址值不能改,但是指向的具体对象可以改;
13. 四种权限修饰符

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值