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的方法不能被重写,但是能够被再次声明。
- 检查异常范围,访问权限不受限
- 重写:子类对父类的允许访问的方法的实现过程进行重新编写, 参数列表不能改变,返回类型可以不同(JDK1.7以上)。