java的基本概念:对象、类

对象是类的一个实例,类是描述一类对象的模版。

一个类可以包含以下类型变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型

关键词static:

  • static表示“静态”,用来修饰成员变量和成员方法,也可以形成静态static代码块。
  • 修饰变量或者方法:类的所有实例共享static变量或者方法。直接使用类名.属性名或者类名.方法名就能直接调用,无需创建对象实例。
  • 在类被加载的时候,就会去加载被static修饰的部分。
  • 为什么在静态方法中不能使用this关键词:static方法是类方法,在类加载时就会被加载,但是对象是在创建时才在内存中生成,而this指代的是当前的对象。
  • 静态方法只能访问静态变量或者静态方法。

类的构造方法

  构造方法的名称必须与类同名,一个类可以有多个构造方法。

java的面向对象编程三大特性:封装、继承和多态。

1、封装:把函数或者接口的实现过程和数据部份包装、隐藏起来,对数据的访问只能通过已定义的接口。

 1 interface Card {
 2     public void showCard();
 3 }
 4 
 5 class Person implements Card {
 6     String name;
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     public void setName(String name) {
13         this.name = name;
14     }
15 
16     Person(String name) {
17         this.name = name;
18     }
19 
20     public void showCard() {
21         System.out.println("name " + name);
22     }
23 }
24 
25 public class Test {
26     public static void main(String[] args) {
27         Card card = new Person("LYK");
28         card.showCard();
29     }
30 }

 

2、继承:从已有的类中派生出新的类,使得子类具有父类相同的特征或者行为。java实现单继承。

  • 子类可以继承父类所有的方法和属性,只是父类的私有域被继承后不能被访问。

  • 关于父类和子类的代码触发顺序

    Father 静态初始化代码块
    Son 静态初始化代码块
    Father 初始化代码块
    Father 构造函数
    Son 初始化代码块
    Son 构造函数

  • 关键词extends:子类继承父类

  • 关键词this:指向自己的引用
    • this用于调用本类中的成员变量,用于区分成员变量和同名形参;
    • this用于调用本类中的其他方法;
    • 在内部类和匿名类中用this时,则this指的是匿名类或内部类本身。
    • this用于调用本类中的另一种形式的构造方法,调用时要放在构造方法的首行不能在构造函数以外的任何函数内调用构造函数一个构造函数内只能调用一个构造函数。(不是this.("Father 带参构造函数"),而是this("Father 带参构造函数"),不带.);
1     public Father() {
2         this("Father 带参构造函数");
3         System.out.println("Father 无参构造函数");
4     }
5     public Father(String name) {
6         System.out.println(name);
7     }

 

  • 关键词super:引用当前对象的父类

    每个子类构造函数的第一条语句,其实都是隐含地调用 super(),如果父类有一个或者多个带参的构造函数而没有无参构造函数时,子类就须在自身的每一个构造函数的第一条语句上增加super(参数),否则会出现Implicit super constructor Father() is undefined. Must explicitly invoke another constructor的错误。建议永远由自己给出一个无参的构造函数

  • 关键词final:修饰类,则该类不能被继承;修饰方法,则该方法不能被子类重写;

    修饰常量,则该常量必须要赋初始值,而且是只能初始化一次。 如果修饰的成员变量是基本类型,则表示这个变量的值不能改变; 如果修饰的成员变量是一个引用类型,则是表示引用的地址不能改变。赋值方式有:1、直接赋值  2、全部在构造方法中赋初值(可用变量赋值)3、如果是静态变量,还能在静态代码块中赋值。

3、多态指是同一实体的不同实现方式,如接口的实现,抽象类的实现。父类引用指向子类对象,java实现多态的方式:方法重写和重载

  • 接口:通常用interface来声明。一个类通过继承接口(implements)的方式,从而来继承接口的抽象方法。如果这个类不是抽象类,则要重写该接口内所有的方法。
    • 接口不能用于实例化对象。
    • 接口没有构造方法。
    • 接口中所有的方法必须是抽象方法。
    • 接口不能包含成员变量,除了 static 和 final 变量。
    • 接口支持多继承。
    • 接口之间可以用extends继承。
  • 抽象类:通常用abstract来声明。是一种不能实例化对象的类。
    • 有抽象方法,继承抽象方法的子类如果不是抽象类,则必须重写该方法。
    • 接口没有构造方法。
    • 抽象类只能被单继承。
  • 父类引用引用子类对象
    • 这是基于java能自动向上转型的特性做到的
    • 这样的好处在于父类引用调用子类的属性或者方法,进行动态连接
    • 动态链接: 对于父类中定义的方法,如果子类中重写了该方法,那么父类引用将会调用子类中的这个方法,这就是动态链接
  • 方法重写和重载
    • 重写:子类对父类的允许访问的方法的实现过程进行重新编写, 参数列表不能改变,返回类型可以不同(JDK1.7以上)。
      • 声明为static的方法不能被重写,但是能够被再次声明。
      • 检查异常范围,访问权限只能和父类的方法相同甚至更低。
    • 重载:在一个类里面,方法名字相同,参数列表不同,返回类型可以不同
      • 声明为static的方法不能被重写,但是能够被再次声明。
      • 检查异常范围,访问权限不受限