Java面向对象

时间:2024-03-18 18:25:46

面向对象:

摈弃基于逻辑的思维,从用户的角度出发进行编程

类和对象

类是一类事物的描述,抽象出来的概念上的定义,而对象是实际存在的个体。

比如猫是一个类,布偶猫是猫的一个子类,那么我家的那只就是一个对象。(会有的!)

类的语法格式:emm不用写了

 

类的主要内容:

  • 成员变量

    对象状态,比如猫的毛色,猫有几条腿。

  • 成员函数

    对象行为,比如猫的喵喵喵叫,猫的抓老鼠行为。

  • 静态变量

    全局唯一,只有一份,可以看成类的性质,他没法使用this,没法引用成员变量和成员方法。比如猫的尾巴只有一条,这种类共有的属性

  • 静态函数

    类似静态变量,静态函数就是这一类所共有的方法。

     

  • 构造函数

    创建对象,给对象进行初始化。

    没有返回值类型,不能被static final synchronized abstract native 修饰

 

封装

隐藏一个类中不需要对外提供的实现细节。

Java面向对象

 

尽量使用private和public!

继承

is-a

子类增加或者修改基类的(成员变量或者函数)

使用super访问父类!

没有办法进行多重继承,因此引入了接口。

接口和抽象类很相似!为什么还是有存在必要的?

抽象类可以有成员变量

抽象类可以有部分实现

抽象类不可以有多重继承,而接口可以

多态

多态是面向对象中最重要的概念,提高了代码的通用性,常称作接口重用:在Java中

对象的多态性:父类引用指向子类对象(可以直接应用在抽象类和接口中)

Java的变量有两个类型:编译时类型运行时类型

编译时类型由声明该变量的类型决定,而运行时的类型由赋予该变量的对象决定,实际上就是变量指向的对象类型。若编译时类型和运行时类型不一致,那么就出现了对象的多态性。

理解:子类可以看成是特殊的父类,所以父类的引用可以指向子类对象

注意:

如果说,引用类型变量如果声明为父类的类型,实际上是子类对象,那么变量就不能再访问子类中添加的属性和方法。

编译在左运行在右

 

重载和重写

  • 重载:

同一类中同名不同参。

与返回值类型无关。只看参数列表。那么为什么与返回值类型无关?

举一个简单的例子,假设他们相关了,那么如果在调用的时候,不接收返回值,那么他该调用哪个函数?

public void fun(){
//todo
}
​
public int fun(){
return 1;
}
​
//在使用的时候,比如调用了
fun();
//如果按照返回值类型重载的话,调用哪一个?
  • 重写:

覆盖掉父类的方法。

注意:

必须要和父类有相同的方法名称参数列表,返回值类型不能大于父类的返回值类型

访问权限不能小于父类的访问权限。

抛出的异常不能大于父类抛出的异常

从编译运行的角度来看:

重载的调用地址再编译期就已经绑定了。称为(早绑定或静态绑定)

对于多态,是等方法调用的那一刻,根据指向对象的类型,调用具体的方法。(晚绑定或动态绑定)

 

super与this

关于super:

用来调用父类中的指定操作:

子父类出现同名函数,super表调用父类的。

子类的所有构造器都会默认访问父类中的空参构造器。

关于this:

在方法内部使用时,戴白哦这个方法所属的对象的引用。

在构造器内部使用时,代表该构造器正在初始化的对象。

构造器可以重载,但是不能通过this来调用构造器本身。

例如:是不行的

public Cat(String color){
    this(color);
}

Java面向对象

 

不可变性

final实现,类:不可以被继承

函数:不可以再派生类中重写

变量申明: 变量不可以指向其他对象。但是内容真的不可变吗?

如果是一个列表,那么可不可以对里面进行add,内容可变!

使用Collection。unmodifiablelist可以

 

static final 用于常量,名称一般大写。

 

final关键字无法保证不可变性。

所以从接口的定义和类的实现上保证不可变性。

从构造函数中传入。