Java面向对象 基础知识点记录

226 阅读4分钟

面向对象基础

与平时常刷的算法题不同,Java面向对象通过创建实例,模拟对象交互完成模块功能。每种类/对象都有自己的行为,相比面向过程,面向对象的代码可塑性更高,逻辑更清晰。

关键知识点梳理:

  1. Java类和对象的概念:方法、构造器、内部类、单例;
  2. Java面向对象特征:封装、继承、多态、抽象;
  3. 面向对象关键字:this、super、package、static、inteface、abstract等。

Java面向对象知识记录

面向对象三大特征:继承、封装、多态。

多态的声明: Parent obj = new Child();

这种写法不会报错,是多态的一种体现,但这时obj就不能调子类独有的方法,需要考虑通过向下转型来调用。 多态声明的对象,在编译阶段会看左边声明的类型,这里就是父类的类型,但执行时会看右边,调用子类的方法。

同时需要注意,与方法调用不同,对象属性不能做到多态。

public class Polymorphism {
    public static void main(String[] args) {
        Parent p = new Child();
        p.prints();   //Child zzz
        System.out.println(p.id); //1001
        System.out.println(p.getId()); //1002
        //p.ChildOnly(); 编译会失败,无法调用
        Child c = (Child) p;
        c.ChildOnly();  //ez

    }
}

class Parent {
    public int id = 1001;

    public int getId() {
        return id;
    }

    public void prints() {
        System.out.println("Parent zzz");
    }
}

class Child extends Parent{
    public int id = 1002;

    public int getId() {
        return id;
    }

    public void prints() {
        System.out.println("Child zzz");
    }

    public void ChildOnly() {
        System.out.println("ez");
    }
}

类型转换的方法(图来自尚硅谷课程):

image.png 向下转型后,对象指向的内存还是原来那个位置,是执行面的。

Java包装类

包装类相对应的是基础类的概念。Java中,为了使int/char/long等一些基础的数据类型也能具备面向对象的性质(如想定义一个新对象继承int),于是就有了包装类的出现,如int对应java.lang.Integer类。可以针对这个类调用toString等经典方法等。注意新的Integer对象初始值为null,而初始的int对象通常基础值为0。包装类和基础类比较建议使用equals()方法,不建议使用==直接进行比较。

Java单例模式

软件运行有时需要一些类,全局只有一个对象,不希望会出现多个对象。这就是单例模式,通常可以考虑把构造器私有化,然后在类里定义一个本身的static对象,需要这个对象时,通过类.对象直接调用即可。单例模式大致分为“饿汉式”和“懒汉式”,饿汉式一般在类加载时对象就已经创建,是在类的代码块里就已经声明对象;懒汉式则是在有对象尝试取到单例时进行对象的new创建。两种模式中,饿汉式会相对更占用内存,而懒汉式有可能是线程不安全的。

public class Singleton {
    public static void main(String[] args) {
        Singleton1 s1 = Singleton1.getInstance();
        Singleton2 s2 = Singleton2.getInstance();
        System.out.println("s1: " + s1);
        System.out.println("s2: " + s2);
    }
}

class Singleton1 {
    private static Singleton1 singleton1 = new Singleton1(); \\\饿汉式,代码块中已经定义构造方法

    private Singleton1() {
        System.out.println("init over Singleton1.");
    }

    public static Singleton1 getInstance() {
        return singleton1;
    }
}


class Singleton2 {
    private static Singleton2 singleton2 = null;

    private Singleton2() {
        System.out.println("init over Singleton2.");
    }

    public static Singleton2 getInstance() {
        if(singleton2 == null) { \\懒汉式,获得实例时才去new
            singleton2 = new Singleton2();
        }
        return singleton2;
    }
}

Java重写重载

重写Override:子类可以重写父类的方法,子类调用自己的。 重载Overload:相同名字的方法,通过不同的入参数量/类型,可以是不同的方法,实现重载。 重载方法中参数互为父类子类时,调用的方法会根据入参类型离哪个更近决定。参考:blog.csdn.net/weixin_4563…

面向对象常用方法

equals()方法

默认的obj1.equals(obj2)就是原来的==,即判断地址是否相同。而很多扩展数据类型已经重写了equals,使用时可以点进去确认下是依然还是==还是对比对象中的数据,不同的jdk版本可能有不同的设置。

以下为String类型的equals示例:

image.png

clone()方法

clone()方法默认浅拷贝,想实现深拷贝可以考虑重写新方法。

关于面向对象的知识持续学习中。后续的一些知识点会持续记录。