面向对象

类名
属性:通过变量表示,又称实例变量
语法:数据类型   属性名;
位置:累的内部,方法的外部

方法:通过函数表示,又称实例方法
语法: public 返回值类型  方法名(形参){  //方法体  }
注意:不再写static

类中不可写逻辑代码

对象的创建

Dog myDog = new Dog();
访问属性:对象名.属性名 = 值;//取值
myDog.breed = “泰迪”;
myDog.age = 2;
调用方法:对象名.方法名();
myDog.eat( );

类:定义了对象应具有的特征和行为,类是对象的模板。
对象:拥有多个特征和行为的实体,对象是类的实例。

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

  • 成员变量定义在类中.局部变量定义在方法中,参数上,语句中.
  • 成员变量在这个类中有效.局部变量只在自己所属的大括号内有效.
  • 成员变量存在于堆内存中,随着对象的产生而存在,消失而消失.局部变量存在于栈内存中,随着所属区域的运行而存在,结束而结束.

方法

重载(Overload):一个类中定义多个相同名称的方法
要求:
    方法名称相同
    参数列表不同(类型,个数,顺序)
    与访问修饰符,返回值类型无关。
构造方法

主要用于对象的创建.是给与之对应的对象进行初始化,它具有针对性,是函数的一种.

特点

  • 名称与类名完全相同
  • 没有返回值类型
  • 创建对象时,触发构造方法的调用,不可以句点手动调用

记住:所有的对象创建时,都需要初始化才可以使用.

构造代码块与构造函数有什么区别?

对象的创建

创建对象(调用构造方法)
内存中开辟对象空间
为各个属性赋予初始值
执行构造方法中的代码
[将对象的地址赋值给变量]

创建一个对象都在内存中做了那些事?
1. 先将硬盘上指定位置的Person.class文件加载进内存.
2. 执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈去分配了一个变量P.
3. 在堆内存中开辟一个实体空间,分配一个内存首地址值.new
4. 在该实体空间中进行属性的空间分配,并进行了默认初始化.
5. 对空间中的属性进行显示初始化.
6. 进行实体的构造代码块初始化.
7. 调用该实体对应的构造函数,进行构造函数初始化.()
8. 将首地址赋值给p,p变量就引用了该实体.(指向该对象)

This关键字

This是类中的默认引用,代表当前实例。当类服务于某个对象是,this则指向这个对象。

用法1. 当实际变量和局部变量重名时,优先访问局部变量;此时,如果访问实际变量,需加this.前缀,不重名时可以省略。
用法2.调用本类中的其他构造方法。如:this(),this(实参)。

面向对象的三大特性

封装

尽可能隐藏对象的内部的实现细节,控制对性的修改及访问的权限。
访问修饰符:private(可将属性修饰符为私有,仅本类可见)

可以避免数据非法录入
Get/set方法是外界访问对象私有属性的唯一通道,方法内部可对数据进行检测和过滤

好处: 将变化隔离;便于使用;提高重用性;安全性.

继承

是类与类之间特征和行为的一种赠与或获得
继承关系,满足“is a”
父类
在一组相同或类似的类中,抽取出共性的特征和行为,定义在类中,实现重用。
语法
class子类extends父类{}//定义子类时,显示继承父类
继承特点

java为单继承,一个类只能有一个直接父类,但可以多级继承,属性和方法逐级叠加。

不可继承
构造方法,private修饰的属性和方法,父子类不在同一个package中时,default修饰的属性和方法
访问修饰符
修饰符本类同包非同包子类其他
private×××
default××
protected×
public
this关键字
this:代表对象.就是所在函数所属对象的引用.
this使用:1.调用本类中的构造函数. 2. 调用本对象的属性,方法.
注意: this调用构造函数,必须定义在构造函数的第一行.因为构造函数是用于初始化的,所以初始化动作一定要执行.否则编译失败.
方法的覆盖

当父类提供的方法无法满足子类需求时,可在子类中定义和父类相同的方法进行覆盖(Override)。

覆盖原则:
方法名称,参数列表,返回值类型必须与父类相同。
访问修饰符可与父类相同或是比父类更宽泛。
要么都静态,要么都不静态.
方法覆盖的执行

    子类覆盖父类方法后,调用时优先执行子类覆盖后的方法。
super关键字

子类中,可直接访问从父类继承到的属性和方法,但如果父子类的属性或方法存在重名(属性遮蔽,方法覆盖)时,需加以区分,才可专项访问。

访问方法

使用“super.”的形式访问父类

super(); //调用父类无参构造方法

super(实参); //调用父类有参构造方法

访问属性

父子类的同名属性不存在覆盖关系,两块空间同时存在(子类遮蔽父类属性),需使用不同前缀进行访问。

继承中的对象创建
  • 在具有继承关系的对象创建中,构建子类对象会先构建父类对象。以一种递归的方式创建对象。
  • 有父类的共性内容,叠加子类独有内容,组合成完整的子类对象。
  • 子类构造方法中第一行,默认super( );可以理解为父类对象是子类的一部分。
this与super

this或super使用在构造方法中时,都要求在首行。当子类构造中使用了this()或this(实参),即不可同时书写super()或super(实参),会有this()指向的构造方法完成super()的调用。

super关键字总结
  • 第一种用法
    • 在子类的方法中使用“super.”的形式访问父类的属性和方法
    • 例如:super.父类属性,super.父类方法();
  • super关键字的第二种用法
    • 在子类的构造方法的首行,使用”super()”或”super(实参)”,调用父类构造方法。
    • 注意
    • 如果子类构造方法中,没有显示定义super()或super(实参),则默认提供super()。
    • 同一个子类构造方法中,super(),this()不可同时存在。

多态

概念 :父类引用子类对象,从而产生多种形态.
- 两者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态.
- 父类引用仅可以调用父类所声明的属性和方法,不可调用子类独有的属性和方法.

多态中的方法覆盖 :实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法.

多态的应用

方法重载可以解决接收不同对象参数的问题.
1. 使用父类作为方法形参实现多态,使方法参数的类型更为宽泛.
2. 使用父类作为方法返回值实现多态,使方法可以返回不同子类对象.

向上转型(装箱)

父类引用中保存真实子类对象,成为向上转型(多态核心概念).

向下转型(拆箱)

将父类引用中的真实子类对象,强转回子类本身类型,称为向下转型.

类型转换异常

向下转型时,如果父类引用中的子类对象类型和目标类型不匹配,则会发生类型转换异常.

instanceof关键字
  • 向下转型钱,应判断引用中的对象真实类型,保证类型转换的正确性.
  • 语法: 引用instanceof类型 //返回boolean类型结果
多态的作用
  • 屏蔽子类间的差异.
  • 灵活,耦合度低
  • 提高了程序的扩展性

三个修饰符

static

static可以修饰方法,属性,静态代码块,静态引入,静态内部类

实例属性

实例属性是每个对象各自持有的独立空间(多份),对象单方面修改,不会影响其他对象.

静态属性

静态属性是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象.

static变量

按照是否静态对类成员进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量.

其区别是:

对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)

对于实际变量,没创建一个案例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响.(灵活)

静态方法

静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能使用this和super关键字
,不能直接访问所属类的实例和实例方法(就是不带static的成员变量和成员方法),只能访问所属类的静态成员变量和成员方法.static方法独立于任何实例,static方法必须被实现,而不能是抽象的abstract. 可以继承,没有多态.

动态代码块(构造代码块)
  • 创建对象时,触发动态代码块的执行.
  • 执行地位:初始化属性之后,构造方法代码之前.
  • 作用:可为实例属性赋值,或必要的初始行为.
静态代码块
  • 类加载时,触发静态代码块的执行(仅一次).
  • 执行地位:静态属性初始化之后.
  • 作用:可为静态属性赋值,或必要的初始行为.
执行顺序

(优先级从高到低)静态代码块>main方法>构造代码块>构造方法

成员变量和静态变量的区别:
  1. 成员变量所属于对象(实例变量),静态变量所属于类.(类变量)
  2. 成员变量存在于堆内存中.静态变量存在于方法区中.
  3. 成员变量随着对象创建而存在,随着对象被回收而消失.静态变量随着类的加载而存在,随着类的消失而消失.
  4. 成员变量只能被对象所调用.静态变量可以被对象调用,也可以被类名调用.

成员变量可以称为对象的特有属性,静态变量称为对象的共享数据.

abstract

抽象类

作用 :
1. 可被子类继承,提供共性属性和方法.
2. 可声明为引用,强制使用多态.

抽象父类,可作为子类的组成部分,依附于子类对象存在,由父类共性+子类独有组成完整的子类对象.

抽象类的特点
  1. 抽象类只能定义在抽象类中,抽象类和抽象方法必须有abstract关键字修饰(可以描述类和方法,不可以描述变量).
  2. 抽象方法只定义方法声明,并不定义方法实现.
  3. 抽象方法不可以被创建对象(实例化).
  4. 抽象类中不一定有抽象方法,但有抽象方法的类一定是抽象类.
  5. 子类继承抽象类后,必须覆盖父类所有的抽象方法,否则子类还是抽象类.

细节 :1. 抽象类中有构造函数,用于给子类对象进行初始化.
2. 抽象类中可以定义非抽象方法.抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体.比一般类多了一个抽象函数.比一般类少了一个创建对象的部分.

抽象关键字abstract和哪些不可以共存?final,private,static.

抽象方法的目的只是为了不让该类创建对象.

final

final关键字有”这是无法改变的”或”终态的”含义,它可以修饰非抽象类,非抽象类成员和变量.
1. final类不能被继承,没有子类,final类中的方法默认是final的.
2. final方法不能被子类的方法覆盖,但可以被继承.
3. final成员变量表示常量,只能被赋值一次,赋值后值不在改变.
4. final不能用于修饰构造方法.

final赋值
  1. 直接显示赋值
  2. 静态代码块
  3. 构造方法中

注意 :父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的.
- 局部常量 :显示初始化.
- 实例常量 :显示初始化,动态代码块,构造方法.
- 静态常量 :显示初始化,静态代码块.
- 基本数据类型常量:值不可变.
- 引用数据类型常量:地址不可变.

接口

接口:是一种标准,接口的实现者和使用者都必须遵循的规定.从语法上讲,接口相当于一个特殊的抽象类.
- 微观概念: 接口是一种能力和一种约定.
- 接口的定义: 代表了某种能力.
- 方法的定义: 能力的具体要求.
- 接口引用
- 同父类一样,接口也可以声明为引用,并指向实现类对象.
- 注意:
- 仅可调用接口中所声明的方法,不可调用实现类中独有的方法.
- 可强转回实现类本身类型,进行独有方法调用.
- 接口的多态
- 多种不同类型的引用指向同一个对象时,表示看待对象的视角不同.
- Dog my Dog = new Dog(); //将狗当狗看
- Animal a = myDog; //把狗当动物看
- Runnable r = myDog; // Runnable是有跑能力的接口,将狗当做会跑的东西看
- 不同引用所能看到的对象范围不同,只能调用自身类型中所声明的部分.
- 微观概念:接口是一种标准.

特殊性
  1. 关键字:interface
  2. 编译之后,会生成.class文件;
  3. 没有构造方法,不能单独创建对象,但可以声明引用;
  4. 所有的属性都是公开的,静态,常量(默认被public static final修饰)
  5. 所有的方法都是公开的,抽象方法(默认是被pubic abstract修饰),说明接口不可被实例化,子类必须实现了接口中的所有的抽象方法后,该子类才可以被实例化,否则,该子类还是抽象类.
  6. 类与类之存在继承关系,类与接口之间存在的是实现关系. 继承extends ;实现用 implements ;
  7. 接口和类不一样的地方,接口可以被多实现,这是继多承改良后的结果.java将多继承机制通过多实现来体现.接口可以继承多个接口,接口全都是抽象方法继承谁无所谓,所以接口可以继承多个接口.
  8. 实现接口中的方法时,方法的访问修饰符必须是public
常见关系
  • 类与类
    • 单继承
    • extends 父类名称
  • 类与接口
    • 多实现
    • implements 接口1 ,2 ,3 , n .
  • 接口与接口
    • 多继承
    • extends 父接口1 , 2 , n .
抽象类与接口的区别:
  1. 抽象类只能被继承,而且只能单继承.接口需要被实现,而且可以多实现.
  2. 抽象类中可以定义非抽象方法,子类可以直接继承使用.接口中都是抽象方法,需要子类去实现.
  3. 抽象类使用的是is a 关系.接口使用的是 like a 关系.
  4. 抽象类的成员修饰符可以自定义.接口中的成员修饰符是固定的,全都是public的.
接口的好处
  • 扩充子类的能力
    • Java为单继承,当父类定义的方法无法满足子类的需求时,可以实现接口来扩充子类的能力.
  • 程序的耦合度低.
  • 更自然的使用多态.
  • 更容易搭建程序框架.
  • 更容易更换具体实现.
  • 设计与实现完全分离.
接口的回调:

先有接口的使用者,后有接口的实现者.

graph LR
4工具的调用者-->2工具
2工具-->1接口
1接口-->3接口的实现者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值