JAVA之面向对象
本篇推荐阅读时间 2h。不可避免、不可或缺的思考与尝试可以帮助你掉更多的头发
-
面向对象与面向过程
面向过程的程序设计方式:通俗来说就是遇到问题我去思考我如何一步步的解决问题,总结就是自顶而下编程。
面向对象的程序设计方式:遇到事情思考谁去做,这个谁就是对象,而你怎么去做的我不关心。
这里有的同学就要问了,哎我就想知道它是怎么做的,那就要说说下面类和对象的定义了。
-
类和对象
类:就是有同种属性的对象(举个栗子:动物)。是一组具有相同特性和行为的事物的集合。 这个特性就是属性,比如动物的种类、性别;行为就是方法,比如调用方法动物去吃饭、去跑步。
因此类的组成部分: 属性、构造方法、普通方法。(构造方法后面细说)
对象:就是类的实例化。 举个栗子:猫、狗… -
this关键字
看下图,我现在写好了一个Animal类,属性有性别、年龄、种类;有一个吃的普通方法。然后创建一个实例化对象animal,运行eat()方法,可以很容易的得到狗在吃这个结果。
但是,我如果在普通方法里加一个type,就变成了你在吃。
那我就想要狗吃,不想你吃啷个办?下面看我手法,变成你和狗都在吃
所以说,重点来了啊,变量的查找顺序首先是在自己的方法内,没有的话再去this里面找。这个this就是当前类的对象。
因此this一个很重要的作用就是区分成员变量和局部变量,所谓成员变量就是直接写在类里的,局部变量就是写在方法体里面的。 -
构造方法
构造方法是在创建对象时自动调用的方法。
默认(就是你不写也给你)有一个无参数的构造方法,如果你自己写了,那么你就是老大,就没有默认的了,自己写的话也叫重载了,所谓重载就是方法名相同、参数列表不同。
这里那就要说一下 类的加载顺序 了,算了…不说了,说完下面这个static,再一起说,为啥呢,接着看。 -
static 静态
这个static是静态的,相当于一个全局变量,也就是各个对象共享的。
它是优先于对象产生、属于类、不属于对象!它在初始化的时候就被分配了内存,而其他对象创建后才分配。
因此有一点这里:不推荐你去用对象访问静态变量,而是直接类名打点。
因此这里还有一点:static修饰的是先加载的,所以 this 关键字在这里没用。
好嘞,下面一个程序看尽类的加载顺序:
1.加载静态变量
2.加载静态语句块
3.加载普通变量
4.加载普通语句块
5.加载构造方法
6.加载普通方法
6.访问权限
一张图就够了,之后自己尝试下异类、异包中是否可以访问到。
7.getter、setter
当成员变量私有化(private修饰)时,你在异类中是访问不到属性的,此时就可以通过setter方法来进行赋值,而且setter可以很好的保护私有成员变量,避免随意赋值。比如之前的Animal类中的age,age肯定是大于0的,那么我们就可以在setter方法体内加上这个限制。然后通过getter方法去访问。
看我手法:
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构造方法");
}
10.多态
就是一个类型在不同情况写的多种状态。
多态存在的必要条件:
(1).在继承结构中
(2).子类重写父类的方法
(3).声明父类引用子类对象
父类声明被调用子类重写后的方法,真正执行的是子类中的方法。
11.final
被final修饰的变量不可变
被final修饰的方法不可以重写
被final修饰的类不可以被继承
12.抽象abstract
是一个概念性的、不是具体动作;用来描述一种类型应该具备的基本特征、功能。
abstract修饰方法,就是一个抽象方法,那么这个方法没有方法体。
如果类中有抽象方法,那么这个类必须是抽象类。
特点:
抽象类不可以创建对象;
抽象类的子类必须重写抽象方法,否则子类也必须是抽象类;
抽象类中可以有普通方法,被继承后不需要被重写;
抽象类中也可以有数据成员
13.接口
一系列方法的声明、一些方法特征的集合。
方法都是抽象方法、公开的。
所有的变量都是全局静态常量,默认的是public static final
列一下接口和抽象类的区别:
相同点:
都不能被实例化;
接口的实现类和抽象类的子类只有重写了他们的方法才能实例化;
不同点:
关键字不同,interface和abstract;
接口的变量都是public static final,必须赋初值;抽象类默认是defaul;
接口的方法都是抽象方法,抽象类中可以有普通方法;
接口不可以有方法的实现,抽象类中的普通方法可以有实现;
接口被实现是implements,且可以多实现,而抽象类是extends,只能单继承。