1.设计对象并使用

①类和对象

  • 类:是共同特征的描述(设计图)。
  • 对象:是真实存在的具体实例。

    ②设计类

    public void 类名{
    1.成员变量(代表属性的,一般是名词)
    2.成员方法(代表行为的,一般是动词)
    }

    ③创建对象

    类名 对象名 = new 类名();

    ④访问信息

  • 对象.成员变量;

  • 对象.成员方法(…);

    ⑤注意事项

  1. 类名首字母建议大写,满足“驼峰模式”,不能用关键字,必须是合法标识符,且有意义。
  2. 一个java文件中可以有多个class类,但只能一个类是public修饰,而且public修饰符的类名必须成为代码文件名。(实际开发还是建议一个代码文件只定义一个类)
  3. 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值; 一般无需指定初始化值,存在默认值。

    2.对象在内存中的运行机制

    ①多个对象的内存图

    image.png
  • 对象放在堆内存中。
  • 创建的对象的对象名中储存的是是对象在堆内存中的地址。
  • 成员变量数据放在对象中,存在于堆内存中。

    ②两个变量指向同一个对象的内存图

    image.png
  1. 当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。
  2. java中存在自动垃圾回收器,会定期进行清理。

    3.构造器(构造方法)

  • 定义在类中,可以用于初始化一个类的对象,并返回对象的地址

    ①格式:修饰符 类名(形参列表){……}

    1. public class Car{
    2. ……
    3. //无参构造器
    4. public Car(){
    5. ……
    6. }
    7. //有参构造器
    8. public Car(String n,double p){
    9. ……
    10. }
    11. ……
    12. }

    ②调用构造器得到对象的格式

    **类 变量名称 = new 构造器;**``**Car c = new Car( );**``** Car c1 = new Car( "奔驰","39.8");**

    ③构造器的分类和作用

  • 无参构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。

  • 有参构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值。

    ④注意事项

  1. 任何类定义出来,默认就自带了无参数构造器,写不写都有。
  2. 一旦定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器。

    ⑤this关键字

  • 可以用于指定访问当前对象的成员变量、成员方法。

    4.封装

    ①封装的概念

  • 封装:告诉我们,如何正确设计对象的属性和方法。

  • 封装的原则:对象代表什么,就得封装对应的数据,并提供数据对应的行为。

    ②如何进行封装

  • 一般建议对成员变量使用private(私有、隐藏)关键字修饰(private修饰的成员只能在当前类中访问)。

  • 为每个成员变量提供配套public修饰的getter、setter的方法暴露其取值和赋值。

    5.继承

    ①继承概述、作用和好处

  • Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。** public class Student extends People {}**

  • Student称为子类(派生类),People 、称为父类(基类或超类)。

作用:当子类继承父类后,就可以直接使用父类公共的属性和方法了。
好处:提高代码复用性.

②继承的设计规范

  • 子类们相同特征(共有属性,共有方法)放在父类中定义,子类独有的属性和行为应该定义在子类自己里面。
  • 如果子类的独有属性,定义在父类中,会导致其他子类中也会继承这些属性和行为,这不符合面向对象的逻辑。

    ③继承的特点

  1. 子类可以继承父类中所有属性和行为,但是子类不能继承父类的构造器。
  2. Java是单继承模式:一个类只能继承一个直接父类。
  3. Java不支持多继承,但是支持多层继承。
  4. Java中所有的类都是Object类中的子类。

    ④方法重写·

  • 在继承体系中,子类出现了和父类中一摸一样的方法声明,我们称子类这个方法是重写的方法。

**@Override 重写注解**

  1. @Override是放在重写后的方法上,作为重写是否正确的校验注解。
  2. 加上改注解后如果重写错误,编译阶段会出现错误提示。
  3. 代码安全,可读性高。

方法重写注意事项

  1. 重写方法的的名称、形参列表必须与被重写方法的名称和参数列表一致。
  2. 私有方法不能被重写。
  3. 子类重写父类方法时,访问权限必须大于或等于父类(缺省<protected<public)
  4. 子类不能重写父类的静态方法,如果重写会报错。

    ⑤子类构造器的特点

    子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。
关键字 访问成员变量 访问成员方法 访问构造方法
this this.成员变量
访问本类成员变量
this.成员方法(…)
访问本类成员方法
this(…)
访问本类构造器
super super.成员变量
访问父类成员变量
super.成员方法(…)
访问父类成员方法
super(…)
访问父类构造器

注意:this(…)和super(…)都需要放在第一行,所以不能同时存在。

6.多态

  • 同类型的对象,执行同一个行为,会表现出不同的行为特征。
  • 多态下不能使用子类的独有功能

    1.多态形式

    父类类型 对象名称 = new 子类构造器;
    接口 对象名称 = new 实现类构造器;

    2.多态中成员访问特点

  • 方法调用:编译看左边,运行看右边。

  • 变量调用:编译看左边,运行也看左边。(多态侧重行为多态)

    3.多态的前提

    有继承/实现关系;有父类引用指向子类对象;有方法重写。

    4.优势

  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护。

  • 定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。

    5.类型转换

    1.自动类型转换(从子到父):子类对象赋值给父类类型的变量指向。
    2.强制类型转换吗(从父到子)

  • 此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量

  • 作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
  • 注意: 如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException

3.Java建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之返回false。

7.JavaBean

  • 也可以称为实体类,其对象可以用于在程序中封装数据。

标准JavaBean须满足如下书写要求

  1. 成员变量使用private修饰。
  2. 提供成员变量对应的setXxx() / getXxx()方法。
  3. 必须提供一个无参数构造器;有参数构造器可写可不写。 | 区别 | 成员变量 | 局部变量 | | —- | —- | —- | | 类中位置不同 | 类中、方法外 | 常见于方法中 | | 初始化值不同 | 有默认值,无需初始化 | 没有默认值,使用之前需要完成赋值 | | 内存位置不同 | 堆内存 | 栈内存 | | 生命周期不同 | 随着对象的创建而消失,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的运行结果而消失 | | 作用域 | | 在所归属的大括号中 |