【Java知识】Java面向对象
命名约定的优点
驼峰命名规则:用于命名类,接口,方法和变量
Java对象和类
对象有三个特点:
状态——表示一个对象的数据(值)
行为——表示对象的行为(功能)
标识——对象标识通常通过唯一ID实现
JAVA中的类——类是具有共同属性的一组对象。它是创建对象的模板或蓝图。它是一个逻辑实体。它不能是物理存在的实体
new关键字——在运行时分配内存。所有对象在堆内存区域中获取内存。
初始化对象的方式:
1.通过引用变量初始化对象
2.通过方法初始化对象
3.通过构造函数初始化对象
创建对象的方法有:
1.通过new关键字
2.通过newInstance()方法
3.通过clone()方法
4.通过反序列化
5.通过工程方法等
匿名对象——没有引用的对象(也就是不使用实例的变量)称为匿名对象。它只能在创建对象时使用。
仅创建同个类型的多个对象
Java构造器
创建Java构造函数的规则
1.构造函数名称必须与其类名称相同
2.构造函数必须没有显式返回类型
构造函数类型:
1.默认构造函数(无参构造函数)——默认构造函数根据类型为对象提供默认值
2.参数化构造函数
构造函数和方法之间的区别
Java拷贝构造函数
在Java中没有复制构造函数。但是可以将一个对象的值复制到另一个中。
通过构造函数
通过将一个对象的值分配给另一个对象
通过Object类的clone()方法
Java static关键字
主要用于内存管理
1.变量(也称为类变量)
静态变量可以用于引用所有对象的公共属性(对于每个对象不是唯一的)
优点:能使程序存储器高效(即它节省内存)
2.方法(也称为类方法)
·静态方法属于类,而不属于类的对象
·可以直接调用静态方法,而无需创建类的实例
·静态方法可以访问静态数据成员,并可以更改静态数据成员的值
限制:1.静态方法不能直接使用非静态数据成员或调用非静态方法;2.this和upper两个关键字不能再静态上下文中使用
Q1:为什么 java main方法是静态的?
因为对象不需要调用静态方法,如果它是非静态方法,jvm首先要创建对象,然后调用main()方法,这将导致额外的内存分配问题
3.代码块
作用:用于初始化静态数据成员
它在类加载是在main方法之前执行
4.嵌套类
this关键字
用法:
1.this关键字可用来引用当前类的实例变量
2.this关键字可用于调用当前类方法(隐式)
如果不使用this关键字,编译器会在调用方法时自动添加this 关键字
3.this()可用用来调用当前类的构造函数
用于构造函数链接
注意:this()语句必须是构造函数中的第一个语句,否则编译不通过
4.this关键字可作为调用方法中的参数传递
在时间处理(或)的情况下,必须提供一个类的引用到另一个。它用于多个方法中重用一个对象
5.this关键字可作为参数在构造函数调用中传递
如果必须在多个类中使用一个对象,可以使用这种方式
6.this关键字可用于从方法返回当前类的实例
方法的返回类型必须是类类型(非原始)
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方法覆盖的规则
·方法必须与父类中的名称相同
·方法必须具有与父类中相同的参数
·必须是IS-A关系(继承)
Q1:可以覆盖静态方法吗?
不可以,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖
Q2:为什么不能覆盖静态方法?
因为静态方法是绑定类,而实例方法绑定对象。静态属于类区域,实例属于堆区域。
Q3:可以重新java main方法吗?
不可以,因为main是一个静态方法
Q4:方法重载和覆盖的区别?
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运算符
用于测试指定对象是否是指定类型(类或子类或接口)的实例
如果我们对具有null值的变量应用instanceof运算符,则返回false
向下转型
如果通过类型转换执行向下转型,则会在运行时抛出:ClassCastException
使用instanceof进行向下转换:
抽象类
abstract关键字声明的类称为抽象类
抽象类——需要扩展和实现它的方法,不能被实例化
抽象方法——没有具体实现
接口
Q1:为什么使用接口?
·用于实现抽象
·通过接口,可以支持多重继承的功能
·可用于实现松耦合
Q2:在JAVA中不支持通过类实现多重基础,但可通过接口实现,为什么?
在类中不支持多重继承是因为模糊。但是在接口的情况下可以支持,因为接口没有歧义,接口的具体实现由实例类提供。
Q3:什么是标记或标记的接口?
没有成员的接口(仅定义一个空的接口)称为标记或标记接口。
嵌套接口——一个接口可以有另一个接口
抽象类和接口的区别
访问修饰符
类型:
private——只能在类中访问
default——只能在包内访问
protected——可以在包内外访问,但只能通过继承
public——可随处访问,它在所有其他修饰符中具有最广泛的范围
封装
封装是将代码和数据一起封装到单个单元中的过程。
封装的优势——仅通过setter和getter方法,可使类为只读或只写
Object类
Object类是java中所有类的父类。是java的顶级类。
Object类为所有对象提供了一些常见的行为,如对象可以进行比较,对象可以克隆,对象可以通知等。
对象克隆
优点:少处理任务
clone()将对象的值复制到另一个对象。
如果通过new关键字创建另一个对象并将另一个对象的值赋给这个对象,则需要对该对象进行大量处理。所以为了节省额外的处理任务,使用clone()方法。
数组
数组是具有连续内存位置的类似类型的元素的集合。Java数组是一个包含类似数据类型的元素的对象。它是一个数据结构,我们存储类似的元素。只能在java数组中存储固定的元素集合。
优点:
1.代码优化——它使代码优化,可以轻松地检索或排序数据
2.随机访问——可以获取任何位于任何索引位置的数据
缺点:
1.大小限制——只能在数组中存储固定大小的元素。它在运行时不会增长其大小。为了解决这个问题,在java中使用了集合框架
数组类型:
·一维数组
·多维数组
复制数组
arraycopy方法的语法:
包装类
将原始数据类型转换为对象,已经将对象转换为原始数据类型的机制
按值调用和引用调用
按值调用在被调用方法中完成的更改,在调用方法的外部不受影响。
strictfp关键字
strictfp关键字确保将在每个平台上获得相同的结果,如果浮点变量中执行操作。不同平台的精度可能不同。
可以用于方法,类和接口
不能应用于抽象方法,变量或构造函数
对象和类之间的区别