面向对象的三大特征
封装
封装概述
封装是值隐藏对象的属性和实现细节,进对外提供公共的访问方式
好处
隐藏实现细节,提供公共的访问方式
提高代码复用性
提高安全性
封装原则
将不需要对外提供的内容都隐藏气力啊
把属性隐藏,提供对外的公共访问方法
private关键字
是一个权限修饰符
可以修饰成员(变量和方法)
被private修饰的成员只在本类中才能访问
private最常见的应用
把成员变量用private修饰
提供对应的setXxx()/getXxx()方法
构造方法
构造方法作用概述
给对象的数据进行初始化
构造方法特点:
方法名与类名相同
没有返回值类型,连void都没有
没有具体的返回值
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,
只要每个构造方法的参数类型或参数个数不同即可。在创建对象时,
可以通过调用不同的构造方法来为不同的属性进行赋值。
补充:匿名对象:
概念:没有名字的对象!
之前的格式:
类名 对象名 = new 类名() ;
匿名对象的创建格式:
new 类名() ;
特点:
1)可以作为形式参数传递!
2)匿名对象不要使用多次,使用一次即可!
匿名对象,应用场景:
移动端:android 大量去使用匿名对象 或者匿名内部类
匿名对象创建完毕,使用完毕就立即被回收(节省内存空间)
this 关键字
this:代表所在类的对象引用
为了区分局部变量隐藏的成员变量 this.成员变量
方法被哪个对象调用,this就代表哪个对象
this在成员变量被局部变量隐藏,而又需要调用成员变量时使用
static 关键字
static关键字的特点:
1)被static修饰的成员,随着类的加载而加载 (类就加载一次!)
javac xxx.java---->xxx.class (字节码文件)
java xxx ---->运行---->加载类的时候,对象还没开始创建
2)优先于对象存在
对象的创建是在类加载的后面
3)有被共享,共用的意思
这句话:告诉我们什么时候使用static修饰变量,方法
能够描述被共用,共享的时候
举例:
班级号可以被共用
饮水机:可以被共用
水杯中的水(不能共用)
4)最重要的特点:
被static修饰的变量以及方法可以被类名直接访问!(推荐类名直接访问)
这些被static修饰变量/方法,也可以通过对象名来访问(不推荐!)
static关键字注意事项
在静态方法中是没有this关键字的
静态方法只能访问静态的成员变量和静态的成员方法
静态变量与成员变量的区别
- 所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量) - 内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存 - 生命周期不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失 - 调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
Java中的代码块
使用{}包起来的内容,就称为代码块!
分类:
1)局部代码块
在局部位置中定义的{},作用:限定变量的声明周期
2)构造代码块
在类的成员位置中定义{},
特点:在当前类中,有限执行构造代码块,然后在执行构造方法...
(每次执行构造方法之前先执行构造代码块)
构造代码块的作用:对当前类的数据进行初始化!(很少用,笔试题!)
3)静态代码块
在{}的前面加上static
static{
....
}
静态代码块随着的类的加载而加载,由于类加载一次,静态代码块执行一次!
优先级:
(1)静态代码块在加载类的时候执行,由于类只在第一次使用时
被加载,且只加载一次,因此静态代码块只执行一次。在实
际开发中,经常有一些代码需要在类加载时就执行,比如加
载数据库驱动,这些代码就应该放在静态代码块中。如果包
含多个静态代码块,先定义的先执行。
(2)构造代码块在创建类的实例对象时执行,也就是说每创建类
的一个实例对象,都会执行一次构造代码块。从运行结果可
以看到,构造代码块先于构造方法执行。因此在实际开发中
可以把重载构造方法中重复的代码抽取到构造代码块中执
行。
(3)局部代码块定义在方法中,它在方法被调用的时候执行。使
用局部代码块是为了限制变量的生命周期,使得变量在使用
完毕后会被尽快回收,从而节省内存空间,前面学习的if语
句、for语句都使用了局部代码块。
静态代码块 > 构造代码块 >构造方法
继承
继承的概念
将多个类的共性内容抽取出来放在独立的类中,让着多个类和当前类产生一种关系,extends:继承关系
通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名 {}
Java中的开发原则:
低耦合,高内聚
继承的特点和继承的好处
1)Java中,对于类与类之间的只支持单继承,不支持多继承
2)但是,可以多层继承
好处:
1)提高了代码的复用性
2)提高了代码的维护性
3)类和类之间的继承关系,是多态的前提条件!
继承中构造方法的访问问题,子类如何访问父类的构造方法
子类的所有构造方法,默认父类的无参构造方法;
如果父类中没有给出无参构造方法,子类构造方法报错,
1)手动给出父类无参构造方法
2)通过super(xxx):访问父类的有参构造方法
3)通过在子类的有参构造方法中通过this()访问本类的无参构造方法,
然后在通过本类的无参构造方法里面:super(xxx)访问父类的有参构造方法
继承在Java中的特点
在Java中只支持单继承,不支持多继承
Java支持多层继承
继承中的注意事项
子类继承父类,不能继承父类的私有成员(变量和方法),
被私有修饰的成员外界无妨访问,但是可以通过公共的访问方法间接访问
子类继承父类,不能够继承父类的构造方法,但是可以通过super关键字间接访问
多态
什么是多态
一个事物在不同时刻显示出的不同状态(在堆内存中变化)
多态的前提条件
1)必须存在继承关系 (继承的好处第三点)
2)要有方法重写 :
举例:动物的吃和睡的功能,只要看到具体的动物类:才能知道吃和睡的功能
3)需要存在:父类引用指向子类对象 (向上转型:使用的父类的东西,必须编译看左边!)
格式:父类名 对象名 = new 子类名() ;
多态成员的访问特点
父类名 对象名 = new 子类名() ;
1)成员变量: 编译看左,运行看左边
2)成员方法:(非静态的):编译看左边,运行看右(因为存在子类覆盖父类的方法:方法重写)
3)静态的成员方法:编译看左,运行看左
(子类出现了和父类一摸一样的静态方法,静态方法跟类相关,不存在重写!,访问方式:类名.方法名())
4)构造方法:
由于存在继承关系,还需要分层初始化!
方法重写:指的是非静态方法!
多态的好处
1)提高了代码的扩展性(由多态)
2)提高了代码的复用性,维护性(由继承关系保证)
如果没有明确要求使用多态方式进行测试
使用具体类名 对象名 =new 具体类名() ;
多态的弊端
不能够访问子类的特有功能!
如何解决呢?
方式1:可以创建子类具体类对象 :子类名 对象名 = new 子类名() ;
对象名.访问子类的自己的功能;
但是,不好,从内存角度考虑,在堆内存中产生一个内存空间(比较消耗内存空间!)
方式2:
多态的第三个条件:父类引用指向子类对象 (向上转型)
Fu f = new Zi() ;
想办法:将父类的引用强制转换为子类的引用(向下转型)
Zi z = (Zi)f;
好处:不需要重新new对象,在堆内存是比较节省内存空间的!
前提条件:要使用向下转型,必须先使用向上转型!
多态的向下转型使用不当,程序出现异常:
注意事项:
产生一个ClassCastException:运行时期异常(RuntimeException)的一种使用向下转型的时候类型
不匹配导致的!