一.Java语法
面向对象
面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情,而不关注问题解决的具体过程。
例如:在使用洗衣服的过程中:
四个对象:人,衣服,洗衣粉,洗衣机
洗衣服的过程:人将衣服放入洗衣机中,往洗衣机中倒入洗衣粉,启动洗衣机,洗衣机完成洗衣过程并且将衣服甩干。
由上述过程可以看出:整个洗衣服的过程是以上四个对象之间交互所完成的,人不需要关注洗衣机具体如何工作的。这就是面向对象的思想。
面向对象和面向过程的区别?
两者的主要区别在于解决问题的方式不同:
面向过程把解决问题的过程拆成了一个个方法,通过一个个方法的执行解决问题。
面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
面向对象的程序更易维护,易复用,易扩展。
//面向对象
//定义一个Circle类 包含构造方法 以及计算圆面积和周长的方法
//当计算不同圆面积周长时 只需要修改main方法中的半径值即可 易于维护
public class Circle {
// 定义圆的半径
private double radius;
// 构造函数
public Circle(double radius) {
this.radius = radius;
}
// 计算圆的面积
public double getArea() {
return Math.PI * radius * radius;
}
// 计算圆的周长
public double getPerimeter() {
return 2 * Math.PI * radius;
}
public static void main(String[] args) {
// 创建一个半径为3的圆
Circle circle = new Circle(3.0);
// 输出圆的面积和周长
System.out.println("圆的面积为:" + circle.getArea());
System.out.println("圆的周长为:" + circle.getPerimeter());
}
}
//面向过程
//定义一个半径 直接利用公式计算出面积和周长
public class Main {
public static void main(String[] args) {
// 定义圆的半径
double radius = 3.0;
// 计算圆的面积和周长
double area = Math.PI * radius * radius;
double perimeter = 2 * Math.PI * radius;
// 输出圆的面积和周长
System.out.println("圆的面积为:" + area);
System.out.println("圆的周长为:" + perimeter);
}
}
类和对象
类是对一个实体进行的抽象描述。
例如:定义一个学生类
public class student{
public int id;
public String name;
public int age;
public int score;
}
注意事项:
一般一个文件当中只定义一个类;
main方法所在的类一般使用public修饰;
public修饰的类必须与文件名相同。
类只是一个模型,是一种自定义的类型,在Java中用类定义出来的变量称为对象。一个类可以实例化多个对象,实例化出来的对象占用实际的物理空间,存储类成员变量。
面向对象程序三大属性:封装,继承,多态
封装
封装就是将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
例如:计算机在出厂时,在外部套上壳子,将内部实现细节隐藏起来,仅仅对外提供开关机键、鼠标以及键盘插孔等,让用户可以与计算机进行交互即可。
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据结合在一起,而访问权限用来控制方法或者字段能否直接在类外使用。
范围 | private | default | protected | public | |
---|---|---|---|---|---|
1 | 同一个包中的同一类 | √ | √ | √ | √ |
2 | 同一个包中的不同类 | √ | √ | √ | |
3 | 不同包中的子类 | √ | √ | ||
4 | 不同包中的非子类 | √ |
继承extends
继承是面向对象程序设计使代码可以复用的重要手段,它允许程序员在保持原有类特征的基础上进行拓展和新增。主要解决共性的抽取和实现代码复用两个问题。
修饰符 class 子类 extends 父类{}
子类可以继承父类中的成员变量及成员方法。
(1)成员变量
如果访问的成员变量子类中有,优先访问自己的成员变量;
如果访问的成员变量子类中没有,则访问父类中继承下来的,如果父类也没有定义,则编译报错;
如果访问的成员变量与父类中成员同名,则优先访问自己的,即出现子类将父类同名变量隐藏的情况。
(2)成员方法
成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中没有则报错;
通过派生类对象访问父类与子类同名时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法传递的参数选择合适的方法访问,如果没有则标错;
通过派生类对象访问父类与子类同名时,如果父类和子类同名方法的原型一致(重写),则只能访问到子类的,父类的方法不能通过派生类直接访问。
super和this的相同点和不同点:
(1)相同点:
都是Java中的关键字;
只能在类的非静态方法中使用,用来访问非静态成员方法和字段;
在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在。
(2)不同点:
this是当前对象的引用,当前对象即调用实例方法的对象;
super相当于是子类对象中从父类继承下来部分成员的引用。
final关键字修饰变量或字段,表示常量,不能被修改;修饰类,不能被继承。
多态
多态即多种形态,表示完成某个行为,当不同的对象去完成时会产生不同的形态。
例如:打印机完成打印时,调用彩色打印机,则打印出彩色文件;调用黑白打印机时,则打印出黑白文件。总而言之,多态就是同一件事情发生在不同对象身上,就会产生不同的结果。
实现多态满足的条件:必须在继承体系下;子类必须要对父类中的方法进行重写;通过父类的引用调用重写的方法。
多态的体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。
重写和重载
重写是子类对父类非静态、非private修饰、非final修饰、非构造方法等的实现过程进行重新编写,返回值和形参都不能改变,即外壳不变,核心重写。
重载和重写的区别:
区别 | 重载 | 重写 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
访问权限符 | 可以修改 | 不能做更严格的限制(可以降低限制) |
异常 | 可以修改 | 可以减少或删除 |
抽象类和接口的共同点和区别
共同点:
都不能被实例化;
都可以包含抽象方法;
都可以有默认实现的方法。(Java8可以用default在接口中定义默认方法)
不同点:
接口主要用于对类的行为进行约束,实现某个接口就具有了对应的行为。抽象类主要用于代码的复用,强调的是从属关系。
一个类只能继承一个类,但是可以实现多个接口。
接口中的成员只能是public static final类型的,不能被修改且具有初始值。抽象类的成员变量默认default,可在子类中被重新定义,也可被重新编辑。
二.数据结构和基础算法
数组
顺序表ArrayList
顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组存储。在数组上完成增删查改。
顺序表常用方法:
boo |