java学习笔记——面向对象的三大特征

一、封装

引入

当创建完对象以后,如果直接通过“对象名.属性”的方式进行赋值的话,可能会出现不符合实际情况的值, 所以我们不考虑“对象名.属性名”的方式进行赋值,而是创建一个方法,通过“对象名.方法名”的方式进行赋值, 这样可以在方法里面写大量的业务逻辑限制属性值

1.什么是封装

把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性,java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:

  • 隐藏一个类中不需要对外提供的实现细节
  • 使用者只能通过事先定制好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作
  • 便于修改,增强代码的可维护性
  • 安全性更好
    注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准

优点:

  • 增加内聚
  • 降低耦合
  • 提高代码复用性

2.给属性赋值的两种方式

通过set方法,如果有单个值需要更改用set方法
通过有参构造方法赋值,常用在同时给多个属性赋值的场合

3.this关键字

(1)为什么使用this关键字

当局部变量和成员变量重名是,方法会根据就近原则使用局部变量的值,如果想要区分局部变量和成员变量,可以使用this关键字

(2)格式:this.成员变量

(3)this可以修饰成员变量,成员方法,构造方法,修饰成员变量和成员方法的格式就是this.成员变量或成员方法

(4)this可以理解为当前使用的对象,或者正在创建的对象,谁调用了方法,谁就是当前使用的对象

(5)可以在构造方法中通过"this(形参)"的方法来调用本类中其他重载的构造方法

// 构造方法
 public Person(){
 		//调用构造方法
        this("张三");
        System.out.println("Person无参构造方法执行了");
    }
    // alt+insert 创建构造方法或右键generate

    public Person(String name) {
    	//调用构造方法
        this("李四",12);
        this.name = name;
        System.out.println("Person带name的有参构造方法执行了");
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

注意:this必须声明在构造方法首行,如果一个类中有n个构造方法,那么最多有n-1个构造方法中使用this()

二、继承

1.什么是继承?

继承就是子类拥有父类的属性和行为,子类通过继承可以复用父类的代码

2.继承的优点和缺点

优点:提高了代码的复用性

缺点:类和类之间的耦合度变高了

3.语法
class 子类 extends 父类{}

4.继承的特点

(1)子类继承父类以后,父类声明的属性和行为子类都可以获取

(2) 子类除了通过继承获取了父类的属性和方法外,还可以自己定义独有的属性和方法(子类的功能比父类多)

(3)java是单继承的,一个子类只能继承一个父类,一个父类可以有多个子类。一个子类可以再派生一个子类,新派生的子类可以同时获取子类里面的独有属性和方法,还可以获取子类的父类的属性和方法

5.方法重写:如果父类的方法满足不了子类的要求,子类可以重写父类的方法

要求:(1)子类重写父类的方法,要求方法名、形参列表、返回值类别必须和父类一致

(2)子类重写的方法的访问修饰符权限不能低于父类的访问修饰符

(3)子类方法和父类方法必须同为静态的或者为非static的

三、多态

    例如定义了一个人Person类,Student和Worker类,Student和Worker类继承Person类,创建一个Student对象 stu,此时stu既有学生的形态,又有人类的形态,这就叫对象的多态性(水的三态变化),多态的前提必须有继承和接口的实现

1.多态的理解

  • (1)同一个动作作用于不同的对象产生不同的行为(多种形态)
  • (2)多态就是一个对象的多种形态
  • (3)允许将子对象赋值给父对象的一种能力

2.多态的实现方法

  • (1)基于继承的实现,不同的子类重写了父类方法以后体现不同的形式
  • (2)接口的实现

3.多态的条件

  • (1)继承:子类去继承父类
  • (2)重写:子类重写父类的方法
  • (3)重载:同一个方法名,根据形参不同,实现的功能也不同
  • (4)子类对象的多态性:父类的引用指向子类的实例
    Pet p1= new Dog("泰迪","小泰");// 向上转型
    p1.info();

4.程序分为两种状态,一种是编译状态,一种是运行时状态

  • 对于多态来说,编译时看左边,会把p1看成pet类型
  • 运行时看右边,真正执行的对象,也就是子类对象,执行的就是子类重写后的方法

5.向上转型和向下转型

  • 向上转型:将子类对象交给父类的引用,可以自动类型转换
  • 向下转型:把父类转成子类,需要强制类型转换

6.多态的类型

  • (1)编译时多态:方法的重载(在编译期间,调用相同的方法名根据不同的参数列表确定调用的是哪个方法)
  • (2)运行时多态:方法的重写(只有在运行期间才能确定使用的对象类型,才能确定变量的引用指向哪个实例)
  1. instanceof 运算符
        用于判断类型是否匹配,是不是同一个类型或者是否存在继承关系
      if(p1 instanceof Dog){
      // p1是Dog类型
            Dog dog2 = (Dog)p1;
            dog2.sleep();
        }else if(p1 instanceof Penguin){
            Penguin  pg2 = (Penguin)p1;
            pg2.swimming();
        }

7.supper关键字

supper关键字可以修饰属性、方法、构造方法

  • 1.当子类和父类的属性名同名时,默认会使用子类的属性,可以通过super.属性名调用父类的属性
  • 2.子类重写父类方法后,如果子类想再次调用父类重写前的方法,可以用super.方法名,调用父类重写前的方法
  • 3.super修饰构造方法,通过在子类构造方法中使用super(形参)来显示的调用父类的构造方法
    (1) super()必须放在构造方法的首行
    (2) 在构造方法内部this(形参)或super(形参)只能出现一个
    (3) 在构造方法中,如果显示的不使用super(形参)的方法调用父类对应的构造方法,默认会调用父类的构造方法,只是隐藏了

8.final关键字

final关键字代表最终的意思,可以修饰类、方法、成员变量、局部变量

  • 修饰类,代表这个类是一个最终类,这个类不能被继承,但是可以继承别的类
  • 修饰方法,就是一个最终方法,方法不能别重写
  • 修饰成员变量,成员变量的值不可改变
    1.成员变量不会再有默认值
    2.如果加了final关键字,需要对成员变量直接赋值
  • 修饰局部变量,局部变量就变成了常量,一旦赋值不可更改

9.static关键字

在java类中,可用static修饰属性、方法、代码块、内部类

(1)静态变量和实例变量

  • 按照是否使用static进行修饰,可以分为:实例变量(创建完对象以后才可以使用)和静态变量
  • 实例变量:创建了多少对象,每个对象都独立有一套类中非静态变量,当修改了其中一个对象的非静态变量时,不会导致其他对象同样属性的修改
  • 静态变量:创建了多个对象,多个对象共享同一个静态变量,当其中一个对象对静态变量进行了修改,会导致其他对象同样的属性值的更改

(2)static 修饰属性

  • 这个属性就不再属于对象了,而属于类本身,只要通过这个类创建的对象,都可以共享该静态变量
  • 实例变量属于对象
  • 静态变量是随着类的加载而加载,实例变量随着对象的创建而加载
  • 静态变量的加载时机早于对象的创建
  • 由于类只会加载一次,静态变量在内存中也只有一份

(3)static修饰方法

  • 这个方法就不在属于对象了,而属于类本身
  • 静态方法是随着类的加载而加载,通过 “类名.方法名” 的方式调用
  • 静态方法中只能调用静态变量和静态方法,非静态方法可以调用静态方法和静态变量,也可以调用非静态方法和非静态变量

(4)代码块(初始化块)

  • 代码块的作用就是初始化类、对象
  • 代码块如果进行修饰只能通过ststic进行修饰

静态代码块

  • 可以写输出语句
  • 随着类的加载而执行
  • 属于类
  • 静态代码块的执行优于非静态代码块的执行
  • 静态代码块里面只能调用静态变量和静态方法
  • jdbc对数据库连接池进行初始化时会用到静态代码块

非静态代码块

  • 可以写输出语句
  • 随着对象的创建而执行
  • 属于对象
  • 创建几个对象,非静态代码块就加载几次
  • 作用:可以在创建对象的同时,给对象的属性进行初始化
public class Animal {
    String name;
    int age;
    static String desc = "动物";

    // 非静态代码块
    {
        name = "小白";
        age = 20;
        System.out.println("非静态代码块");
    }
    // 静态代码块
    static {
        System.out.println("静态代码块");
    }
   
}

10.问题

(1)在静态方法里面可以使用this和super关键字吗?

  • 不可以,因为这两个关键字是有了对象以后才存在,静态方法早于对象的创建

(2)开发中,如何确定一个属性使用static进行修饰呢

  • 如果一个属性需要被多个对象共享,使用static进行修饰

(3)开发中,如何确定一个方法使用static进行修饰呢

  • 工具类会使用static进行修饰方法,比如jdbc工具类,collection连接对象
  • 操作静态变量的方法,一般使用static进行修饰
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值