面向对象特点及缺点
网上有的说是四大特征,其中还有抽象。 但三大特征 封装 继承 多态。这三大支柱已经囊括抽象了,譬如说接口,或者抽象类的定义。
-
封装:所谓封装,就是将客观事物封装成抽象的类,并且类可以把数据和方法让可信的类或者对象进行操作,对不可信的类或者对象进行隐藏。类就是封装数据和操作这些数据代码的逻辑实体。 -
继承:继承有两种,一种是实现继承,另外一种是接口继承。实现继承可以直接使用基类的属性和方法而无需额外编码,接口继承是指使用属性和方法的名称,但是子类必须提供实现的能力。 -
多态:所谓多态就是对一个实例的相同方法在不同的情形下有不同的表现形式。多态机制使得不同内部结构的对象可以共享相同的外部接口,这就意味着,虽然不同的类的内部操作不同,但可以通过一个公共的类,它们可以通过相同的方式予以调用。
缺点
属性的多重指针的引用牺牲了系统性能。
类和继承等特点使得程序会多很多指针操作来定位函数入口和自身要维护虚拟方法表等额外的工作,程序的处理效率相对要低(但程序开发效率高)。所以现在单纯的C语言还是大为用武之地的。
但随着科技的进步,CPU和内存的性能也突发猛进。由原来的1核到8核,内存16M和现在的16G,所以程序的效率多多少少会随着硬件的性能变得更好。你可以发现很多大的项目也开始由C转而变成让c++和JAVA等面向对象来写了。
java关键字和修饰符
权限修饰符
| public | protected | default | private |
---|
同一类中 | √ | √ | √ | √ | 同一包中 | √ | √ | √ | | 不同包的子类 | √ | √ | | | 不同包中的无关类 | √ | | | |
static
被static修饰的变量或者方法,该类的所有对象都可以使用,和对象无关,依赖于类,内存中只有一份。
静态可以调用静态,但是不能调用非静态,非静态可以调用静态; 因为静态的内容是随着类而产生的,非静态的内容是随着对象而产生的; 静态在前,非静态在后;静态产生的时候还没有非静态。
final
不可改变
- 被修饰的类,不能被继承。
- 被修饰的方法 ,不能被重写。
- 被修饰的变量,不能被重新赋值。
- 局部变量为基本类型,值是不能更改的,只能赋值一次
- 局部变量为引用类型,地址值不能更改,内容可以更改
abstract和final不能被同时使用,abstract要求子类覆盖重写所有方法,final修饰的方法不能被重写。
instance
判断类是什么类型,返回的是bool
继承
向上抽取共性,将共同的内容定义在父类
java只能单继承,不能多继承,支持多层继承
好处
- 让类与类之间产生了关系
- 提高了代码的复用性
- 是多态的前提
特点
- 子类可以使用父类中除了
private和构造方法 以外的内容 - 当子类和父类
成员变量不重名 时,子类有,使用自己的,子类没有,使用父类的 - 当子类和父类
成员变量重名 时,访问父类的需要super.
重写和重载
方法重载
在同一个类 中,允许存在一个以上的同名方法,只要它们的参数列表不同 即可,和修饰符和返回值类型无关
方法重写
子类与父类中出现重名的成员方法;
返回值类型、方法名、参数列表都相同(最简单的也是最常用的重写);
声明不变,重新实现。
注意: 子类方法重写父类方法,子类方法权限必须大于等于父类 子类方法重写父类方法,子类方法返回值必须小于等于父类
抽象类
没有方法主体的方法;
java语法规定,包含抽象方法的类就是抽象类。
抽象类的注意事项
- 抽象类不能直接创建对象,只能创建非抽象子类的对象。
- 抽象类中必须有构造方法,是供子类创建对象时,初始化父类成员使用的。
- 抽象类中不一定包含抽象方法,都有抽象方法的类必定是抽象类
- 抽象类的子类,必须重写抽象父类的所有方法,否则,编译报错,除非子类也是抽象类
接口
-
接口中可以定义抽象方法、默认方法、静态方法 -
接口中定义方法的时候,前面的public abstract 可以省略,抽象方法不能省略。 -
一个类只能单继承,却可以实现多个接口,接口可以多继承。 -
接口中的成员变量只能是常量,且必须赋值。常量的名字建议大写 ,单词用_ 隔开
多态
多态的前提
- 继承或者实现
- 方法的重写(不重写,无意义)
- 父类引用指向子类对象
成员变量还是就近原则,父类和子类中有无,也不会引起编译错误。
当使用多态方式调用方法时,首先检查父类 中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写后的方法。 如果需要执行子类的特有方法 时,父类中并没有子类的方法,此时需要向下转型。 向下转型的时候,可以转到父类的任何一个子类中,编译不会报错,但此时new 的子类与强转的类的类型可能是不一致的,就会发生强制类型转换异常 ,可以使用instanceof 提前判断类的类型
内部类
在描述事物时,若一个事物内还包含其他事物,就可以使用内部类这种结构。
成员内部类
内部类可以直接访问外部类的成员,包括私有成员。
Person s = new Person();
Person.Heart h = s.new Heart();
匿名内部类
创建子类/实现类对象的一种快捷方式
package com;
public interface Zi {
int num = 5;
void sing();
}
package com;
public class TestJava {
public static void main(String[] args) {
Zi zi = new Zi() {
@Override
public void sing() {
}
};
}
}
部分知识引用自: https://baijiahao.baidu.com/s?id=1614769568984126810&wfr=spider&for=pc(java的方法中是引用传递还是值传递) https://www.nowcoder.com/questionTerminal/a90230b35b5f4a7287f779ecdd88841d https://blog.csdn.net/u010945925/article/details/9050917
|