欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA之面向对象

程序员文章站 2022-07-12 13:09:11
...

本篇推荐阅读时间 2h。不可避免、不可或缺的思考与尝试可以帮助你掉更多的头发

  1. 面向对象与面向过程

    面向过程的程序设计方式:通俗来说就是遇到问题我去思考我如何一步步的解决问题,总结就是自顶而下编程。
    面向对象的程序设计方式:遇到事情思考谁去做,这个谁就是对象,而你怎么去做的我不关心。

这里有的同学就要问了,哎我就想知道它是怎么做的,那就要说说下面类和对象的定义了。

  1. 类和对象
    类:就是有同种属性的对象(举个栗子:动物)。是一组具有相同特性和行为的事物的集合。 这个特性就是属性,比如动物的种类、性别;行为就是方法,比如调用方法动物去吃饭、去跑步。
    因此类的组成部分: 属性、构造方法、普通方法。(构造方法后面细说)
    对象:就是类的实例化。 举个栗子:猫、狗…

  2. this关键字
    看下图,我现在写好了一个Animal类,属性有性别、年龄、种类;有一个吃的普通方法。然后创建一个实例化对象animal,运行eat()方法,可以很容易的得到狗在吃这个结果。
    JAVA之面向对象
    但是,我如果在普通方法里加一个type,就变成了你在吃。
    JAVA之面向对象
    那我就想要狗吃,不想你吃啷个办?下面看我手法,变成你和狗都在吃
    JAVA之面向对象
    所以说,重点来了啊,变量的查找顺序首先是在自己的方法内,没有的话再去this里面找这个this就是当前类的对象
    因此this一个很重要的作用就是区分成员变量和局部变量,所谓成员变量就是直接写在类里的,局部变量就是写在方法体里面的。

  3. 构造方法
    构造方法是在创建对象时自动调用的方法。
    默认(就是你不写也给你)有一个无参数的构造方法,如果你自己写了,那么你就是老大,就没有默认的了,自己写的话也叫重载了,所谓重载就是方法名相同、参数列表不同。
    这里那就要说一下 类的加载顺序 了,算了…不说了,说完下面这个static,再一起说,为啥呢,接着看。

  4. static 静态
    这个static是静态的,相当于一个全局变量,也就是各个对象共享的。
    它是优先于对象产生、属于类、不属于对象!它在初始化的时候就被分配了内存,而其他对象创建后才分配。
    因此有一点这里:不推荐你去用对象访问静态变量,而是直接类名打点。
    因此这里还有一点:static修饰的是先加载的,所以 this 关键字在这里没用。
    好嘞,下面一个程序看尽类的加载顺序
    1.加载静态变量
    2.加载静态语句块
    3.加载普通变量
    4.加载普通语句块
    5.加载构造方法
    6.加载普通方法

    JAVA之面向对象
    6.访问权限
    一张图就够了,之后自己尝试下异类、异包中是否可以访问到。
    JAVA之面向对象
    7.getter、setter
    当成员变量私有化(private修饰)时,你在异类中是访问不到属性的,此时就可以通过setter方法来进行赋值,而且setter可以很好的保护私有成员变量,避免随意赋值。比如之前的Animal类中的age,age肯定是大于0的,那么我们就可以在setter方法体内加上这个限制。然后通过getter方法去访问。
    看我手法:
    JAVA之面向对象
    JAVA之面向对象
    8.继承extends
    继承是代码简化、复用的有效手段。
    继承后,子类可以自动拥有父类除了私有内容以外的其他所有内容。
    还是Animal类,动物都会吃,狗也会吃、猫也会吃,那么我没必要每一个类都写eat() 这个方法,我写在Animal类中,让狗\猫继承就好了。
    写法就是:public class Dog/Cat extends Animal{…}

    9.super关键字
    如下这个类,我们可以看到Dog继承了Animal类。运行的到结果“狗在吃”

public class Animal {

    String type = "动物";

}
public class Dog extends Animal {

    String type = "狗";

    public void eat(){
		//变量查找的一个顺序,先找自己类,再找父类
        System.out.println(this.type+"在吃");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();
    }
}

那么我现在就想得到“动物在吃”这个结果怎么弄呢?就要用到 super 关键字
this.type 改为super.type即可
所谓super,就是指父类中的内容
如果调用父类中的构造方法,则必须放在第一行。什么意思,在子类创建对象的时候,和之前那个加载顺序一样,构造方法在前面先被加载,但是这边不是说先执行父类的构造方法,再执行子类的构造方法,而是说,执行子类的构造方法体里面,先执行父类的构造方法,这个方法体第一行其实是隐含了一句super();
而这个super()必须放在第一行。因为父类构造方法是在子类构造方法执行中第一个执行的。

public Dog(){
        super();
        System.out.println("Dog构造方法");
    }

JAVA之面向对象

10.多态
就是一个类型在不同情况写的多种状态。
多态存在的必要条件:
(1).在继承结构中
(2).子类重写父类的方法
(3).声明父类引用子类对象
父类声明被调用子类重写后的方法,真正执行的是子类中的方法。

11.final
被final修饰的变量不可变
被final修饰的方法不可以重写
被final修饰的类不可以被继承

12.抽象abstract
是一个概念性的、不是具体动作;用来描述一种类型应该具备的基本特征、功能。
abstract修饰方法,就是一个抽象方法,那么这个方法没有方法体
如果类中有抽象方法,那么这个类必须是抽象类。

特点:

	抽象类不可以创建对象;
	抽象类的子类必须重写抽象方法,否则子类也必须是抽象类;
	抽象类中可以有普通方法,被继承后不需要被重写;
	抽象类中也可以有数据成员

13.接口
一系列方法的声明、一些方法特征的集合。
方法都是抽象方法、公开的。
所有的变量都是全局静态常量,默认的是public static final

列一下接口和抽象类的区别:
	相同点:
		都不能被实例化;
		接口的实现类和抽象类的子类只有重写了他们的方法才能实例化;
	不同点:
		关键字不同,interface和abstract;
		接口的变量都是public static final,必须赋初值;抽象类默认是defaul;
		接口的方法都是抽象方法,抽象类中可以有普通方法;
		接口不可以有方法的实现,抽象类中的普通方法可以有实现;
		接口被实现是implements,且可以多实现,而抽象类是extends,只能单继承。
相关标签: 面向对象