Java学习随便记2

Posted sjg20010414

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习随便记2相关的知识,希望对你有一定的参考价值。

可抛出的对象:错误和异常

错误是致命的,而且程序员预期不该发生的,一旦发生程序通常自行奔溃;异常是程序员可以预期的某种特殊情况,程序应该捕获且合理地处理它。Java内置了不少异常类,如除以0、数组越界、对象为空、加载类时找不到对应类……。基类 Throwable 定义了 getMessage()、toString()、printStatckTrace()等方法,可以在捕获异常时使用。

一个方法可能抛出(非检查性)异常,应该在方法签名尾部用 throws关键字声明这些异常。

异常处理中,可以在 try... catch(..) ... catch(..)... 尾部添加 finally ... 块做善后工作,finally块代码会确保被执行。JDK 7+ 中的 try (资源声明创建) ... catch(...)... 语法糖,可以减轻这种确保资源释放的负担(即不用写finally块,编译器帮你处理)。

java继承

java继承和php一样,使用 extends 关键字实现类继承(只是php中通常不用管类本身的public之类的访问控制。不继承任何类的类默认继承Object类),用 implements 关键字实现接口“继承”(即实现接口)。java类继承是单继承,用接口可以实现多继承的特性,因为同一个类可以实现多个接口。

继承中,使用 super 关键字访问父类(这关键字倒和python同了),this指向实例自己(注意,虽然关键字和C++、PHP相同,但不用箭头语法)。

final关键字可以实现“断子绝孙”,这个关键字和C#同。

java方法覆盖(override)

子类对父类方法覆盖(或叫“覆写”或“重写”)时,方法签名除了返回值,其余必须保持不变(返回值必须是父类的兼容类型)。访问权限只能提高,不能降低,即前一篇中的父类是public的方法,不能被子类覆盖成protected或private。当然,重写实现中,可以用super.Xxx()调用父类方法。

Java方法重载(overload)

java中的重载(overload),最常用的是构造函数重载。重载就是方法名一样,参数必须不同。重载其实是本质(签名)不同的函数,只是这些函数作用相近取了相同的名字。

Java多态

覆盖重写实现多态的基本条件:(1)存在继承;(2)子类覆盖父类方法;(3)父类引用指向子类对象(表明父类变量总是子类的兼容类型)

多态的特点是:设计父类(通常是类库之类,用户应用较少使用多态)时,可以编写通用的代码,子类可以实现不同功能。父类类型的变量(父类引用),可以在运行时绑定不同的子类实例,调用同名方法时,具体呈现实现功能不同,即运行时多态

Java抽象类

抽象类无实例,必须被继承得到使用,所以,它只是一份关于成员变量和成员方法的协议,通常类库设计者更关注它。抽象类用 abstract 修饰 class。

抽象类中可以有抽象方法(当然也可以没有抽象方法),即用abstract修饰的方法。可以认为,抽象方法更体现“协议性”,因为它只规定了继承者同名方法的签名,本身无方法体。不能用 abstract 修饰构造方法和static类方法。

抽象类的派生子类可以仍然是抽象类,子类若非抽象类,它必须实现所有抽象方法(如果有的话)的具体实现。

Java接口

看一个例子:Closeable接口从AutoCloseable继承(接口可以继承另一接口,也可以没有继承)。接口内声明了一个 close() 方法(只需要标记public,但它本质上是 public abstract的)。接口内成员变量不常见,并且只能是static和final的。

public interface Closeable extends AutoCloseable 
    public void close() throws IOException;

接口机制让 Java 也可以实现多继承效果。

Java枚举

简单的 Java 枚举和 C枚举类型类似,如

enum RGB 
    RED, GREEN, BLUE;

但Java枚举其实是一个类(都从java.lang.Enum派生),可以添加成员变量、方法和构造函数。并且,Java枚举类可以嵌入其他类之中。

public class HelloWorld 
    enum RGB 
        RED 
            public String getColor() 
                return "Red";
            
        ,
        GREEN 
            public String getColor() 
                return "Green";
            
        ,
        BLUE 
            public String getColor() 
                return "Blue";
            
        ;

        public abstract String getColor();
    

    public static void main(String[] args) 
        for (RGB x : RGB.values()) 
            System.out.println(x.getColor());
        
    

指的注意的是,从理解概念上来说,要把枚举成员 RED、GREEN、BLUE当做类RGB的实例,类RGB有抽象方法 getColor(),然后枚举实例可以具体实现自己的 getColor()实例方法(类似多态中的子类方法)。在调用时,RGB型的实例 x 是不能直接看见 RED、GREEN、BLUE的 getColor() 方法的,它必须借由“父类”RGB的抽象方法 getColor() 来调用(因为父类RGB的getColor()是抽象的,所以,会去调用子类的方法)。因为 x 依次绑定到 RED、GREEN、BLUE “实例”,从而实现了某种程度的运行时多态。

Java包机制

Java包机制不仅仅解决命名冲突问题,它还有访问控制搜索定位类、接口等成分的作用。写法上,Java包机制和golang有部分相似。

Java包机制“严肃”的地方是必须遵守包名、类名的约定,并且包名必须和相应的字节码所在的目录结构对应(因为需要实现搜索定位)。

以上是Java OOP的一些基本概念

以上是关于Java学习随便记2的主要内容,如果未能解决你的问题,请参考以下文章

Java学习随便记1

Java学习随便记1

Java学习随便记4 (待续)

Java学习随便记4 (待续)

Java学习随便记3

Java学习随便记3