目录
类和对象
简单认识类
类的定义格式
类的实例化
this引用
对象的初始化
构造方法
封装继承和多态
封装
封装扩展之包
导包
继承
继承的语法
super关键字
子类构造方法
final关键字
多态
多态实现的条件
向上转型和向下转型
抽象类和接口
抽象类
抽象类语法
接口
接口语法:
接口使用
类和对象
简单认识类
类的定义格式
类的定义格式
在java中定义类时需要用到class关键字,具体语法如下
class ClassName{
//成员变量
//成员方法
}
class为定义类的关键字,ClassName为类的名字,{}中为类的主体
类名注意用大驼峰书写
类的实例化
用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象
注意事项
new 关键字用于创建一个对象的实例.使用 . 来访问对象中的属性和方法.同一个类可以创建对个实例.
this引用
java编译器给每个“成员方法“增加了一个隐藏的引用类型参数,该引用参数指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
注意:this引用的是调用成员方法的对象
this引用的特性
1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象,具有final属性
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收
对象的初始化
在Java方法内部定义一个局部变量时,必须要初始化,否则会编译失败
public static void main(String[] args) {
int a;
System.out.println(a);
}
// Error:(26, 28) java: 可能尚未初始化变量a
要让上述代码通过编译,非常简单,只需在正式使用a之前,给a设置一个初始值即可。
构造方法
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
构造方法的特性
1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)
5. 如果用户没有显式定义,编译器会生成一份默认的构造方法,生成的默认构造方法一定是无参的。
6. 构造方法中,可以通过this调用其他构造方法来简化代码
(但是要注意:1.this(...)必须是构造方法中第一条语句2.不能形成环)
封装继承和多态
面相对象程序三大特性:封装、继承、多态。
封装
封装定义:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符:
封装扩展之包
概念:为了更好的管理类,把多个类收集在一起成为一组,称为软件包。有点类似于目录。
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个
包中的类不想被其他包中的类使用。包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
导包
可以使用 import语句导入包。
也可以自己自定义一个包(在文件的最上方加上一个 package 语句指定该代码在哪个包中)具体的操作之前的博客有写。
继承
继承(inheritance):是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
继承的语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字。
修饰符 class 子类 extends 父类 {
// ...
}
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
如果访问的成员变量子类中有,优先访问自己的成员变量。如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。如果访问的成员变量与父类中成员变量同名,则优先访问自己的,即:子类将父类同名成员隐藏了
super关键字
super关键字,该关键字主要作用:在子类方法中访问父类的成员
在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。
【注意事项】
1. 只能在非静态方法中使用
2. 在子类方法中,访问父类的成员变量和方法。
子类构造方法
在子类构造方法中,并没有写任何关于基类构造的代码,但是在构造子类对象时,先执行父类的构造方法,然后执行子类的构造方法,因为:子类对象是一个父类对象,在构造子类对象时,先要将从父类继承下来的成员初始化完整,然后再初始化子类自己新增加的成员。
注意:
1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
2. 如果父类构造方法是带有参数的,此时编译器不会再给子类生成默认的构造方法,此时需要用户为子类显式定
义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。
3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现
final关键字
如果想从语法上进行限制继承, 就可以使用 final 关键字
final关键可以用来修饰变量、成员方法以及类。
1. 修饰变量或字段,表示常量(即不能修改)
2. 修饰类:表示此类不能被继承
3. 修饰方法:表示该方法不能被重写(后序介绍)
多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。
多态实现的条件
1. 必须在继承体系下
2. 子类必须要对父类中方法进行重写
3. 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法
向上转型和向下转型
向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。
子类对象是一个父类对象,即可以将一个子类对象当成父类对象来应用。因此:向上转型是安全的,因为是从小范围向大范围的转换。
Animal animal = new Cat("喵喵");
向上转型的优点:让代码实现更简单灵活。向上转型的缺陷:不能调用到子类特有的方法
向下转型:将一个子类对象经过向上转型之后当成父类方法使用,再无法调用子类的方法,但有时候可能需要调用子类特有的方法,此时:将父类引用再还原为子类对象即可,即向下转型。
抽象类和接口
抽象类
概念:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现体。
抽象类特性:
1. 抽象类不能直接实例化对象
2. 抽象方法不能是 private 的(注意:抽象方法没有加访问限定符时,默认是public.)
3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
4. 抽象类必须被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,必须要使用 abstract 修饰
5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
接口
接口概念:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
接口语法:
接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。
public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}
提示:
1. 创建接口时, 接口的命名一般以大写字母 I 开头.
2. 接口的命名一般使用 "形容词" 词性的单词
接口使用
接口不能直接使用,必须要有一个"实现类"来"实现"该接口,实现接口中的所有抽象方法。
public class 类名称 implements 接口名称{
// ...
}
接口特性:
1. 接口类型是一种引用类型,但是不能直接new接口的对象
2. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)
3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现4. 重写接口中方法时,不能使用default访问权限修饰
5. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
6. 接口中不能有静态代码块和构造方法
7. 接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class
8. 如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类
9. jdk8中:接口中还可以包含default方法



