类和对象

什么是类?

在java中,类是程序的最小组成单位,类是设计的图纸,是抽象出来的模型。

什么是对象?

也称为类的实例,对象是类的具体实现,是具体存在的实体,对象是类的实例,类是对象的模板。

如何定义一个类?

[修饰符] class 类名{ } 注意事项:

  • 修饰符可以是public、abstract、final、或者是缺省(即包访问权限);
  • abstract和final不能同时修饰程序元素,因为这样是矛盾的;
  • 类名必须是合法的标识符,且最好遵循大驼峰命名法;
  1. public class Person {
  2. // 成员变量。
  3. String name;
  4. int age;
  5. // 两只眼睛
  6. static int eyeNum = 2;
  7. // 方法
  8. public void hey(String name){
  9. System.out.println("hello, " + name);
  10. }
  11. // 构造器
  12. public Person(){
  13. }
  14. public Person(String name, int age){
  15. this.name = name;
  16. this.age = age;
  17. }
  18. }

如何使用对象?

通过new关键字创建对象,并借助构造器完成类的初始化; 对象在堆内存创建好之后,可以声明一个对象引用指向该对象;

  1. public class Main{
  2. public static void main(String[] args){
  3. // p不是一个对象,p是一个引用,指向内存中的Person对象实例
  4. Person p = new Person("zhao", 21);
  5. // 调用方法
  6. p.hey("feng");
  7. }
  8. }

注意:

  1. 在Java中,一个对象被创建出来,保存在堆内存中;
  2. Java程序不能直接访问堆内存的对象,只能通过该对象的引用操作;
  3. 堆内存的对象可以有多个引用,多个引用指向同一个对象;
  4. 如果堆内存中的对象没有引用指向,程序就无法访问该对象,此时jvm会进行垃圾回收

类的成员

成员变量

定义成员变量

【修饰符】类型 成员变量名 【 = 默认值】

分类方式:

根据定义变量的位置分:

  • 成员变量(直接在类中定义)
    • 实例变量
    • 类变量
  • 局部变量
    • 形参(在方法签名中定义、在整个方法内有效)
    • 方法局部变量(在方法体中定义、从定义该变量开始的地方开始生效,方法结束时无效)
    • 代码块局部变量(在代码块内定义、出了代码块无效)

      实例变量:

      不使用static修饰的成员变量; 其生命周期是:从类的实例被创建时,开始存在,直到系统完全销毁这个实例;

类变量:

使用static修饰的成员变量; 其生命周期是:从该类的准备阶段开始存在,直到系统完全销毁这个类

注意事项:

  1. 成员变量无须显示初始化,系统会为之进行默认初始化(与数组动态初始化时数组元素赋值规则一致)
  2. 静态成员不能直接 访问非静态成员

成员变量和局部变量的区别

  1. 局部变量除形参外,都必须显示初始化,否则不可以访问
  2. 在同一个类中,成员变量整个类都有效
  3. 当成员变量和局部变量重名时,可使用this或者类名作为调用者来调用
  4. 变量遵循就近原则

    方法

    定义方法

    [修饰符] 返回值类型 方法名(形参列表){ // 0..N 条可执行语句构成的方法体 // return ; } 修饰符:public、protected、缺省、private、static、final、abstract 返回值类型:void、java中的基本数据类型和引用数据类型 return语句:根据方法签名的返回值类型一致

方法概述

方法是类或对象的行为特征的抽象;方法是类的重要组成部分 在Java语言中,方法不能独立存在,它要么属于类,要么属于对象; 定义方法必须在类体中,不能独立定义一个方法; 使用static修饰的方法是类方法,这个方法属于类;反之,属于类的实例; 同一个类里不同方法之间相互调用,被调方法是类方法,使用类作为调用者;

方法的参数传递机制

值传递:将实际参数值的副本传入方法内,而参数本身不会受到影响。

可变形参

在定义方法时,最后一个形式参数类型后增加...,表示该参数可以接收0个或多个值

递归方法

本身在方法体内调用本身,通过设置的条件结束递归

方法重载

在同一个类中,可以存在多个同名方法,但其形参列表不同

构造器

[修饰符] 构造器名(形参列表){ // 0..N 条可执行语句构成的构造器体 } 修饰符:public、protected、缺省、private 构造器名:与类名一致 注:构造器不能定义返回值类型; 不能使用void声明构造器没有返回值; 当定义一个类时,若没有提供构造器,则系统默认提供一个无参的构造器;若显示提供,则只存在显示提供的; 构造器也支持重载,要求形参列表不一致; 构造器用用来完成对象的初始化工作,并不是创建对象;

创建对象的过程分析:

  1. class Person{
  2. int age = 90;
  3. String name;
  4. Person(String name, int age){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. }
  9. // 在main方法中执行
  10. // Person p = new Person("zhao", 21);
  1. 加载Person类信息,只加载一次
  2. 在堆中分配空间
  3. 完成对象的初始化
    1. 默认初始化(age = 0, name = null)
    2. 显示初始化(age = 90,name = null)
    3. 构造器初始化(age = 21, name = “zhao”)
  4. 实例对象在堆中的地址返回给p,p是对象的引用

    代码块

    内部类

    Java关键字

    this

封装

继承

多态

抽象