Java笔记-面向对象程序设计(基础)

时间:2023-02-15 19:05:56

类和对象

Java的类模板

Java的类模板如下所示:

public class<类名>{
    //定义属性部分
    属性1的类型 属性1;
    属性2的类型 属性2;
    ......
    属性n的类型 属性n;

    //定义方法部分
    方法1;
    方法2;
    ......
    方法n;
}

在Java中创建一个类需要使用一个class(创建类的关键字),一个类名,一个大括号。
public:公有
private:私有

类的命名规范

  1. 不能使用Java中的关键字
  2. 不能包含任何嵌入的空格或者点好”.”,以及除了下划线”_”,字符”$”外的特殊字符
  3. 不能以数字开头

static修饰符详解

static可以用来修饰属性、方法和代码块。
static修饰的变量属于这个类所有,即由这个类创建的所有对象共用同一个static变量。
通常把static修饰的属性和方法称为类属型(类变量)类方法
不使用static修饰的属性和方法属于单个对象,通常称为实例属性(实例变量)实例用法
下面通过一个例子演示static的用法以及使用static修饰属性和代码块时,是如何分配内存空间的:

package demo;

public class Demo {

    static int i;
    static int m = 30;
    int j;
    int k = 25;
    static {
        i = 10;
        System.out.println("i的初始化值为:" + i);
    }

    public Demo() {
        j = 20;
        System.out.println("j的初始值为:" + j);
    }

    public static void getNum() {
        System.out.println("得到的i的值为:" + i);
    }
    public static void main(String[] args) {
        Demo d = new Demo();
        System.out.println("i的值为:" + d.i);
        d.getNum();
        System.out.println("m的值为:" + d.m);
        System.out.println("k的值为:" + d.k);
    }
}

演示结果:
Java笔记-面向对象程序设计(基础)

结论:

  • 在加载过程中,完成静态变量的内存分配,再执行静态块,两者是在创建对象之前执行的。
  • 类属型和类方法可以通过类名和对象名访问,实例属性和实例方法只能通过对象访问
  • 类方法只能访问类属型和其他类方法
  • 静态方法中不能使用this和super关键字
  • 方法里不可以定义static变量,也就是说,类变量不能使局部变量

封装

封装
是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部程序直接访问,而通过该类提供的方法来实现对隐藏信息的操作和访问
封装的具体步骤
修改属性的可见性来限制对属性的访问;
为每个属性创建一对赋值(setter)方法和取值(getter)方法,用于对这些属性的存取;
在赋值方法中,加入对属性的存取控制语句。
封装的好处
隐藏类的实现细节;
让使用者只能通过程序规定的方法来访问数据;
可以方便的加入存取控制语句,限制不合理的操作。
封装时用到的多种权限控制符修饰成员变量和方法,区别如下:

  • private:成员变量和方法只能在其定义的类中被访问,具有类可见性
  • 默认:成员变量和方法只能被同一个包里的类访问,具有包可见性
  • protected:可以被同一个包中的类访问,被同一个项目中不同包中的子类访问
  • public:可以被同一个项目中的所有类访问,具有项目可见性,这是最大的访问权限

重载

构造方法的重载

方法名相同,参数列表不同,这称为构造方法的重载

  • 在没有给类提供任何构造方法时,系统会提供一个无参的方法体为空的默认构造方法。
  • 一旦提供了自定义构造方法,系统将不再提供这个默认的构造方法。如果要使用它,则程序员必须手动添加。

方法的重载

如果一个类包含了两个或两个以上的方法,他们的方法名相同,方法参数的个数或参数类型不同,则称该方法被重载了,这个过程称为方法重载。
成员变量和构造方法都可以进行重载。
注意:

  • 方法重载的判断依据如下:
    1. 必须在同一个类里
    2. 方法名相同
    3. 参数列表(方法参数的个数或参数类型)不同
    4. 与方法的返回值和方法修饰符没有任何关系!
  • 在使用this调用自身的其他构造方法时,只能作为第一条语句

super关键字

super关键字是对一个对象的默认引用。在每个实例方法内部,都有一个this引用变量,指向调用这个方法的对象。

super使用实例:

  • 使用this调用成员变量,解决成员变量和局部变量的同名冲突
public void setName (String name) {
    this.name = name;
}
public void setName (String xm) {
    name = xm;
}
  • 使用this调用成员方法
public void play (int n) {
    health = health - n;
    this.print();     //this可以省略,直接调用print();
}
  • 使用this调用重载的构造方法,只能在构造方法中使用,必须是构造方法的第一句。
public Dog (String name, String sex) {
    this.name = name;
    this.sex = sex;
}

public Dog (String name, String sex, int health) {
    this(name, sex);    //调用重载的构造方法
    this.health = health;
}
  • 因为this在对象内部指代自身的引用,所以this只能调用实例变量、实例方法和构造方法
  • this不能调用类变量和类方法,也不能调用局部变量

继承

继承的语法规范

修饰符 SubClass extends SuperClass {
    //类定义部分
}

继承(inheritance)通过extends关键字来实现,其中的SubClass称为子类,SuperCLass称为父类、基类或超类。

  • 修饰符如果是public,则该类在整个项目中可见;
  • 若无public修饰,则该类只在当前包可见;
  • 不可以使用privateprotected修饰类

继承的介绍

继承是面向对象的三大特性之一,是Java中实现代码重用的重要手段之一。

Java中只支持i单继承,即每个类只能有一个直接父类。

继承表达的是is a关系,或者说是一种特殊和一般的关系,如Dog is a Pet

在Java中,子类可以从父类中继承到如下”财产”:
- 继承publicprotected修饰的属性和方法,无论子类和父类是否在同一个包里。
- 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
- 无法继承private修饰的属性和方法。
- 无法继承父类的构造方法。

访问修饰符的访问权限

访问修饰符的访问权限如下所示:

访问修饰符 本类 同包 子类 其他
private × × ×
默认 × ×
protected ×
public