Java 基础知识(三)

1.Constructor是否被重写或重载?

  构造器不可被继承,所以不能被重写,可以被重载

2.访问修饰符

1)private: 同一个类中访问

2)default: 同一个类、同一个包中不同类访问 

3)protected: 同一个类、同一个包中不同类访问 

4)public:同一个类、同一个包中不同类、任意类(不同包)访问 

3.抽象类中可以没有抽象方法

4.普通类与抽象类

1)普通类:可实例化;没有抽象方法;public class xxx

2)  抽象类:只可以实例化抽象类的子类;可以有抽象方法;public abstract class xxx

5.抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized 修饰?

  不可以  抽象方法需要子类重写

  静态方法不可以被重写;本地方法是由本地代码实现的方法;synchronized与实现细节有关 都是与抽象方法相矛盾

6.接口与抽象类

1)接口:无构造方法;都是抽象方法(jdk1.8 可以可以有 default 修饰的非抽象方法);多继承;属性是public static final【常量】

2)抽象类:存在构造方法;可以有非抽象方法;单继承;

7.静态嵌套类和内部类的不同

1)静态嵌套类  Static Nested Class :被声明为静态的内部类,它可以不依赖于外部类实例被实例

2)内部类 Inner Class  :需要在外部类实例化后才能实例化

public class Outer {
    class Inner{};

    public static void Foo(){
        new Inner();//报错,静态方法访问非静态对象
    }

    public void bar(){
        new Inner();
    }

    public static void main(String[] args) {
        new Inner();//报错,访问Outer的内部类不符合规则
    }
}

8.Marker Interface

   标记性接口:一个类实现某个没有任何方法的标记接口,实际上标记接口从某种意义上说就成为了这个类的元数据之一。运行时,通过编程语言的反射机制,我们就可以在代码里拿到这种元数据。

   常用的标记接口有:Serializable[序列序列化],Cloneable[克隆接口]

9.面向对象设计原则

1)单一原则 SRP:一个类应该只负责一件事情,让每个类只专心处理自己的方法

2)开闭原则 OCP:软件中的对象(类,模块,函数等)应该对于扩展是开放的,但是对于修改是关闭的。

3)里氏替换原则 LSP:子类可以去扩展父类的功能,但是不能改变父类原有的功能,

      包含以下几层意思:

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法。

  • 子类可以增加自己独有的方法。

  • 当子类的方法重载父类的方法时候,方法的形参要比父类的方法的输入参数更加宽松。

  • 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。

4)依赖倒置原则 DIP:高层模块不应该依赖底层模块,两者都应该依赖其抽象 抽象不应该依赖细节 细节应该依赖抽象

           指模块间的依赖是通过抽象来发生的,实现类之间不发生直接的依赖关系,其依赖关系是通过接口是来实现的。这就是俗称的面向接口编程

5)接口隔离原则 ISP:客户端不应该依赖他不需要的接口

6)合成复用原则 CRP/CARP:通过将已有的对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。

满足这个5个原则的程序也被称为满足了SOLID准则

6)迪米特原则 LOD:低耦合,高内聚

10.常见设计模式

1)工厂模式:有工厂创建所需要的的对象 ,如:Spring 的IOC、SqlSessionFactory

2)代理模式:给对象提供一个代理对象,由代理对象控制原对象的引用,如:SpringAOP

3)适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够一起工作

4)单例模式:在内存中创建有限个对象

    懒汉式:当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作,先定义引用

class Singleton {

    /**
     * 声明变量
     */
    private static volatile Singleton singleton = null;

    /**
     * 私有构造方法
     */
    private Singleton() {}
    /**
     * 提供对外方法
     * @return 
     */
    public static Singleton getInstance() {
        // 还未实例化
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
    public void print() {
        System.out.println("Hello World");
    }
}

        饿汉式:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象,先定义实例

class Singleton {
    /**
     * 在类的内部可以访问私有结构,所以可以在类的内部产生实例化对象
     */
    private static Singleton instance = new Singleton();
    /**
     * private 声明构造
     */
    private Singleton() { }
    /**
     * 返回对象实例
     */
    public static Singleton getInstance() {
        return instance;
    }
    public void print() {
        System.out.println("Hello Singleton...");
    }
}
原文地址:https://www.cnblogs.com/dxjx/p/12448368.html