前言
最近在看阿里的Java开发手册,想以该书为基础写一篇关于Java基础的文章,顺便复习下一些知识点。
面向对象
定义
再说面向对象之前,我们先来谈谈面向过程。面向过程是过程化地、有顺序地执行,就像书里说的一样,在语言开发,软件复用,软件维护存在着困难,耦合性太强,所以我们就要引入面向对象的思想。
(PS:上述只是大多数情况而言,对于大佬来说语言只是一种工具,无论面向过程和面向对象都有自己的优势)
面向对象其实就是将某个事物抽象出来,建立一个模型,生活中的人,动物,电脑都可以抽象出来,而抽象也是我们面向对象的一大特性。
继承、封装、多态
继承较为容易理解,如下代码所示,我们抽象出一个动物类,但是动物种类很多,比如猫,狗等等,猫和狗就继承于动物类。当然Java不止一种继承模式,还有多重继承(针对接口),下面的代码属于简单的单继承。
class Animal{
}
class Cat extends Animal{
}
class Dog extends Animal{
}
封装是隐藏对象的属性和实现,只对外提供接口。Java的private关键字就表示私有的,public表示为公开访问。
class Animal{
private age;
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
多态就是同一个行为有不同的表现形式。
abstract class Animal {
abstract void eat();
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("吃肉");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("吃鱼");
}
}
类
定义
这里我们引用Java开发手册中的定义:
类的定义由访问级别、类型、类名、是否抽象、是否静态、泛型标识、继承或实现关键字、父类或接口名称等组成。
当然在Java中,还存在接口(interface)和抽象类(abstract) 两种更高层次的抽象。
内部类
在Java语言中,任何一个类都可以定义一个内部类,具体分为以下四种:
- 静态内部类
- 成员内部类
- 局部内部类
- 匿名内部类
摘自《码出高效:Java开发手册》的一段代码,便于理解内部类。
public class outClass{
private class InstanceInnerClass{}//成员内部类
static class StaticInnerClass{}//静态内部类
public static void main(String[] args){
(new Thread() {}).start();//匿名内部类
class MethodClass{};//局部内部类
}
}
在javac指令后,我们可以得到若干的class文件,如下图所示
所以由上图可知,我们定义的四种内部类分别编译成了class文件,所以在我们使用单例模式时,可以使用静态内部类,JVM里面的机制保证了不会被二次初始化。
抽象类 && 接口
Java作为高级语言,还具有两种更高意义的抽象,接口和抽象类仅仅作为公共行为的定义,不会被实例化。
在面向对象中,抽象类中继承时主要是is-a关系,接口中主要是can-do关系,下面分别写出两种实例。
/**
@Description:抽象类,将动物整体抽象成一个类
*/
public abstract class Animal {
/** 声明为抽象方法 */
public abstract void eat();
/** 抽象类中可以有自己的实现 */
public void run(){
System.out.println("run..");
}
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("eat beef");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.run(); //可以直接调用抽象类中的方法
}
}
/**
@Description: 定义动物的行为,can do what.
*/
public interface Action {
void eat();
/** 在JDK1.8之后出现了default方法 */
default void run(){
System.out.println("run..");
}
}
class Dog implements Action{
@Override
public void eat() {
System.out.println("eat beef");
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.run();
}
}