【Java知识】Java面向对象

命名约定的优点

【Java知识】Java面向对象

驼峰命名规则:用于命名类,接口,方法和变量

 

Java对象和类

对象有三个特点:

状态——表示一个对象的数据(值)

行为——表示对象的行为(功能)

标识——对象标识通常通过唯一ID实现

JAVA中的类——类是具有共同属性的一组对象。它是创建对象的模板或蓝图。它是一个逻辑实体。它不能是物理存在的实体

new关键字——在运行时分配内存。所有对象在堆内存区域中获取内存。

初始化对象的方式:

1.通过引用变量初始化对象

2.通过方法初始化对象

3.通过构造函数初始化对象

创建对象的方法有:

1.通过new关键字

2.通过newInstance()方法

3.通过clone()方法

4.通过反序列化

5.通过工程方法等

匿名对象——没有引用的对象(也就是不使用实例的变量)称为匿名对象。它只能在创建对象时使用。

仅创建同个类型的多个对象

【Java知识】Java面向对象

 

Java构造器

创建Java构造函数的规则

1.构造函数名称必须与其类名称相同

2.构造函数必须没有显式返回类型

构造函数类型:

1.默认构造函数(无参构造函数)——默认构造函数根据类型为对象提供默认值

2.参数化构造函数

构造函数和方法之间的区别

【Java知识】Java面向对象

Java拷贝构造函数

在Java中没有复制构造函数。但是可以将一个对象的值复制到另一个中。

通过构造函数

通过将一个对象的值分配给另一个对象

通过Object类的clone()方法

 

Java static关键字

主要用于内存管理

1.变量(也称为类变量)

静态变量可以用于引用所有对象的公共属性(对于每个对象不是唯一的)

优点:能使程序存储器高效(即它节省内存)

2.方法(也称为类方法)

·静态方法属于类,而不属于类的对象

·可以直接调用静态方法,而无需创建类的实例

·静态方法可以访问静态数据成员,并可以更改静态数据成员的值

限制:1.静态方法不能直接使用非静态数据成员或调用非静态方法;2.this和upper两个关键字不能再静态上下文中使用

Q1:为什么 java main方法是静态的?

    因为对象不需要调用静态方法,如果它是非静态方法,jvm首先要创建对象,然后调用main()方法,这将导致额外的内存分配问题

3.代码块

作用:用于初始化静态数据成员

          它在类加载是在main方法之前执行

4.嵌套类

 

this关键字

用法:

1.this关键字可用来引用当前类的实例变量

【Java知识】Java面向对象

2.this关键字可用于调用当前类方法(隐式)

如果不使用this关键字,编译器会在调用方法时自动添加this 关键字

【Java知识】Java面向对象

3.this()可用用来调用当前类的构造函数

用于构造函数链接

【Java知识】Java面向对象

注意:this()语句必须是构造函数中的第一个语句,否则编译不通过

4.this关键字可作为调用方法中的参数传递

在时间处理(或)的情况下,必须提供一个类的引用到另一个。它用于多个方法中重用一个对象

【Java知识】Java面向对象

 

5.this关键字可作为参数在构造函数调用中传递

如果必须在多个类中使用一个对象,可以使用这种方式

【Java知识】Java面向对象

6.this关键字可用于从方法返回当前类的实例

方法的返回类型必须是类类型(非原始)

【Java知识】Java面向对象

 

Java继承

继承是一种机制,表示为一个对象获取父对象的所有属性和行为

可以创建基于现有类构建新的类。当从现有类继承时,就可以重复使用父类的方法和字段,可以在继承的新类中添加新的方法和字段

Q1:为什么在java中使用继承?

对于方法覆盖(因此可以实现运行时的多态性),提高代码可重用性。

继承类型:单一,多级和分层

注意:Java中类不支持多继承

Q2:为什么在Java中不支持多重继承?

为了降低复杂性并简化语言,Java中不支持多重继承。

 

 

Java聚合

如果一个类有一个类的实体引用(类中的类),则它称为聚合

Q1:为什么要使用聚合?

 代码可重用性

Q2:何时使用聚合?

·当没有is-a关系时,通过聚合也能最好地实现代码重用

·只有在所涉及的对象的整个生命周期内维持关系is-a时,才应使用继承;否则,聚合是最好的选择

 

方法重载

如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载

1.修改参数的数量

2.更改参数的数据类型

Q1:为什么方法重载不能通过更改方法的返回类型?

在JAVA中,只通过改变方法的返回类型实现方法重载是不可能的,因为这样具有模糊性。

Q2:可以重载main()方法吗?

完全而已的。可以通过方法重载在类中任意数量的main方法。但JVM调用main()方法,它只接收字符串数组作为参数。

方法重载和类型提升?

如果没有找到匹配的数据类型,那么会隐式地将一个类型提升到另一个类型。

【Java知识】Java面向对象

 

方法重写

子类提供了由其父类提供的其中一个方法的特定实现,则它被称为方法覆盖

Java方法覆盖的用法

·方法重写用于提供有别与超类提供的方法的特定实现

·方法重写用于运行时多态性

Java方法覆盖的规则

·方法必须与父类中的名称相同

·方法必须具有与父类中相同的参数

·必须是IS-A关系(继承)

Q1:可以覆盖静态方法吗?

不可以,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖

Q2:为什么不能覆盖静态方法?

因为静态方法是绑定类,而实例方法绑定对象。静态属于类区域,实例属于堆区域。

Q3:可以重新java main方法吗?

不可以,因为main是一个静态方法

Q4:方法重载和覆盖的区别?

【Java知识】Java面向对象

 

super关键字

  • super可以用来引用直接父类的实例变量

  • super可以用来调用直接父类方法

  • super()可以用于调用直接父类构造函数。

 

final关键字

final关键字用于限制用户修改变量或重写一个类或方法。

可以是,变量,方法,类

如果将变量设置为final,则不能更改final变量的值(它将是常量)

1.禁止变量的值被改变

2.禁止方法重写

3.禁止类继承

Q1:是否可继承final方法?

是的,final方法是继承的,但是不能覆盖它

Q2:什么是空白或未初始化的final变量?

在声明时未初始化的final变量称为空白final变量

如果要在创建一个对象是初始化变量,并且变量在初始化后就不会被改变

Q3:可以初始化空白的final变量吗?

可以,但只能在构造函数中

静态空白final变量只能在静态块中初始化。

Q4:什么是final参数

如果将任何参数声明为final,则不能更改它的值。

 

多态

运行时多态性——对重写方法的调用在运行时体现而不是在编译时。

向上转换

运行时多态性与数据成员——运行时多态性不能由数据成员实现。

 

静态绑定和动态绑定

静态绑定——早期绑定,由编译器确定对象的类型时。任何private,final 或 static方法,则有静态绑定

动态绑定——后期绑定,在运行时确定对象的类型时

 

instanceof运算符

用于测试指定对象是否是指定类型(类或子类或接口)的实例

【Java知识】Java面向对象

如果我们对具有null值的变量应用instanceof运算符,则返回false

向下转型

如果通过类型转换执行向下转型,则会在运行时抛出:ClassCastException

【Java知识】Java面向对象

使用instanceof进行向下转换:

【Java知识】Java面向对象

抽象类

abstract关键字声明的类称为抽象类

抽象类——需要扩展和实现它的方法,不能被实例化

抽象方法——没有具体实现

 

接口

Q1:为什么使用接口?

·用于实现抽象

·通过接口,可以支持多重继承的功能

·可用于实现松耦合

Q2:在JAVA中不支持通过类实现多重基础,但可通过接口实现,为什么?

在类中不支持多重继承是因为模糊。但是在接口的情况下可以支持,因为接口没有歧义,接口的具体实现由实例类提供。

Q3:什么是标记或标记的接口?

没有成员的接口(仅定义一个空的接口)称为标记或标记接口。

嵌套接口——一个接口可以有另一个接口

抽象类和接口的区别

【Java知识】Java面向对象

访问修饰符

类型:

private——只能在类中访问

default——只能在包内访问

protected——可以在包内外访问,但只能通过继承

public——可随处访问,它在所有其他修饰符中具有最广泛的范围

【Java知识】Java面向对象

 

封装

封装是将代码和数据一起封装到单个单元中的过程。

封装的优势——仅通过setter和getter方法,可使类为只读或只写

 

Object类

Object类是java中所有类的父类。是java的顶级类。

Object类为所有对象提供了一些常见的行为,如对象可以进行比较,对象可以克隆,对象可以通知等。

【Java知识】Java面向对象

 

对象克隆

优点:少处理任务

clone()将对象的值复制到另一个对象。

如果通过new关键字创建另一个对象并将另一个对象的值赋给这个对象,则需要对该对象进行大量处理。所以为了节省额外的处理任务,使用clone()方法。

 

数组

数组是具有连续内存位置的类似类型的元素的集合。Java数组是一个包含类似数据类型的元素的对象。它是一个数据结构,我们存储类似的元素。只能在java数组中存储固定的元素集合。

优点:

1.代码优化——它使代码优化,可以轻松地检索或排序数据

2.随机访问——可以获取任何位于任何索引位置的数据

缺点:

1.大小限制——只能在数组中存储固定大小的元素。它在运行时不会增长其大小。为了解决这个问题,在java中使用了集合框架

数组类型:

·一维数组

·多维数组

复制数组

arraycopy方法的语法:

【Java知识】Java面向对象

 

包装类

将原始数据类型转换为对象,已经将对象转换为原始数据类型的机制

【Java知识】Java面向对象

 

按值调用和引用调用

按值调用在被调用方法中完成的更改,在调用方法的外部不受影响。

 

strictfp关键字

strictfp关键字确保将在每个平台上获得相同的结果,如果浮点变量中执行操作。不同平台的精度可能不同。

可以用于方法,类和接口

【Java知识】Java面向对象

不能应用于抽象方法,变量或构造函数

 

对象和类之间的区别

【Java知识】Java面向对象