在Java基础学习中 面向对象很重要
面向编程:是我们解决问题中,注重的是解决问题的每一个步骤和过程。
面向对象:注重的是在问题中,涉及到哪些对象,以及对象之间有哪些关系。
| 核心思想 | 缺点 | 算法 |
面向编程
| 自顶向下,逐步求精也就是把功能分解
设计数据结构
编写基础代码,基于数据结构操作 | 一旦数据结构发生修改,操作必须就要修改的代码。
可重用性差
可维护性维护的成本高
| 程序=数据结构+算法 |
|
| 相对优点 |
|
面向对象 | 分解数据
数据,和操作数据是一个整体 | 数据修改,只涉及这对改数据的操作(封装)
可重用性好(继承)
可维护性好,维护的成本低 | 程序=对象+消息 |
万事万物皆对象,对象是由静态的属性和动态的方法来组成。
类:一组具有相同属性的行为的对象的抽象。
消息:对象之间的通信和相应。
Java的三大特性 封装 继承 多态
把一组数据结构和处理他们的方法组成的对象(object),把相同行为的对象归纳为类(class)
通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的特化
(specialization)/泛化(genneralization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch)
1、特点:
1:将复杂的事情简单化。
2:面向对象将以前的过程中的执行者,变成了指挥者。
3:面向对象这种思想是符合现在人们思考习惯的一种思想。
2、面向对象的三大特征:封装,继承、多态
快捷键:
类和对象
类的组成:成员变量和成员方法
封装的体现
多态的体现:重写,重载等
引用:
Point p = new Point();的含义是 首先实例化一个对象(new Point())
然后定义一个引用,p指向这个实例。p= p1:并不多是将实例p1赋值给实例p
而是改变了引用的关系
final意义:最终的,不可改变的。 1、修饰变量,为常量,值不可变; 2、修饰对象,值可变,引用不变; 3、修饰方法,方法不可重写; 4、修饰类,无子类,不可以被继承,更不可能被重写。
抽象:
提取实物的本质。共同的属性和方法忽略某些不要的的细节和个性的差异
类的组成:成员变量和成员方法
1.封装:只隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:将变化隔离、便于使用、提高复用性、提高安全性
原则:将不需要对外提供的内容隐藏起来;把属性隐藏,提供公共方法对其访问
2.继承:提高代码复用性;继承是多态的前提
注:
①子类中所有的构造函数都会默认访问父类中的空参数的构造函数,默认第一行有super();若无空参数构造函数,子类中需指定;另外,子类构造函数中可自己用this指定自身的其他构造函数。
更好的实现了代码的重用
3.多态
是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象
好处:提高了程序的扩展性
弊端:当父类引用指向子类对象时,虽提高了扩展性,但只能访问父类中具备的方法,不可访问子类中的方法;即访问的局限性。
前提:实现或继承关系;覆写父类方法。
总结:面向对象是一种很自然,朴素的方法,来源与生活
构造函数
构造函数是在对象实例化是自动被系统调用该函数名必须是独一无二的对于一个类来说
是将类名作为函数名
构造函数不需要程序员去定义返回值 他是系统自动决定的void 也不行
Staic静态:静态代码是在加载类的时候自动被执行,早于构造函数,静态的方法,面向的是个类,是某个对象,所以没有this 并且只能使用类名来调用,不能使用实例化对象去调用
Final 修饰的类不能被继承,final 修饰的变量 不能被修改(也就是常量)。Finai修饰方法
抽象类
抽象方法:只有声明,没有实现。abstract修饰抽象方法
抽象类:就是含有抽象方法的类
抽象类不能被实例化,也就是不能new 他是只能作为父类被继承,作用是;对后代进行规则即凡是他的后代,必须实现它为实现的方法
比如说,形态肯定有计算周长和面积的方法,但是具体如何计算的,却无法描述。三角形有三角形的·计算方法,圆有圆计算的方法。所以在形状这个类只能声明这个方法。但是不能实现。
为什么需要去使用抽象类?
在现实生活中,有些类我们明明知道是有某些方法的,但是具体这些方法是怎么去做的好像又无法说清楚。比如手机电报固定电话等都是通讯工具,而通讯工具就想应该具有向外发送消息的方法但是却无法说明具体怎么发,而手机丶电报等我们又可以说清楚他们是怎么发送
信息的
由于抽象类中包含有为实现的方法,所以抽象是无法去实例化对象(new),那么它的作用是什么呢,它可以对他的后代进行规划和约束,后代必去按照他的要求去实现但具体怎么实现由后代去决定
赋值兼容性 规则:凡是需要使用父类的地方,都可以使用其公有子类去代替。
多态:
接口
接口所有的方法都是抽象方法:所以在声明方法时, 关键词abstract 写不写都没关系了
接口的定义关键词是interface,抽象类是class。抽象类是用来继承的(extends),接口使用实现(implements)的。
匿名内部类
为什么要是用匿名内部类?
先看看如果不使用匿名内部类的情形:
(1) 定义接口(如果已经有则跳过)
public interface Shape {
public StringgetName();
public double area();
public double perimeter();}
(2)
实现接口实现类 Square
public class Square implements Shape{
public double d;
public Square(double d){
this.d=d;
}
@Override
public String getName() {
return "正方形"; } @Override public double area() { return d*4; } @Override public double perimeter() { return d*d; } }
(3)定义Square类对象并使用
public class Test {
public static void main(String[] args) {
Square square =new Square(5);
Shape shape=square;
print(shape);
}
public static void print(Shape shape){
System.out.println(shape.getName()+"的周长是"+shape.perimeter()+"\n面积是"+shape.area()); } }
那么如果使用匿名内部类呢?
(1) 定义接口(与上一种情形一样)
(2) 定义匿名内部类,并实现接口(实际就是将上一中情形的第二三步给合并了)。
匿名内部类显然简化了流程 但是也使得使用者理解更困难了,代码的层次不是太清晰了。