本文是对Youtube上的Java Full Course For Free☕学习视频做的一些小笔记
目录
引言
Java的优势:面向对象特性
面向对象编程(Object-Oriented Programming, OOP)最主要的几个功能或特性包括:
类(Class)和对象(Object):
类是对象的模板或蓝图,它定义了一种对象具有的状态(属性)以及这些状态可能经历的行为(方法)。
对象是类的实例化,每个对象都是类的一个具体实例,拥有类定义的状态和行为。
类和对象的关系是“一般到特殊”的关系,类是对象的抽象,对象是类的具体实例。
这些特性共同构成了面向对象编程的基础,使得代码更加模块化、可重用、可维护和可扩展。
抽象(Abstraction):
抽象是指忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
在面向对象编程中,抽象是通过抽象类(Abstract Class)和接口(Interface)来实现的。
抽象类不能被实例化,但可以被继承;接口是一种特殊的抽象类,它只包含方法的声明而不包含方法的实现。
抽象允许我们定义通用的行为,并在具体的类中实现这些行为的具体细节。
封装(Encapsulation):
封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式。
通过封装,我们可以将数据和操作数据的方法(函数)绑定在一起,作为一个不可分割的独立单位。
封装可以保护对象的状态信息不被外部直接访问和修改,只能通过对象提供的公共接口(方法)来访问和修改。
继承(Inheritance):
继承允许我们定义一个通用的类(父类或基类),然后创建它的子类(派生类),子类可以继承父类的属性和方法。
通过继承,我们可以实现代码的重用,并且可以在子类中扩展或覆盖父类的方法。
继承体现了“is-a”的关系,即子类是一种特殊的父类。
多态(Polymorphism):
多态意味着同一操作或函数名可作用于多种类型的对象上并获得不同的结果。
在面向对象编程中,多态通常是通过方法重写(Override)和方法重载(Overload)来实现的。
多态允许我们以统一的方式处理不同类型的对象,提高了代码的灵活性和可扩展性。
多态体现了“行为的一致性”或“接口的多样性”。
Java小知识点学习
主要从以下两个方面展开学习:
①这个知识点是什么,有什么用和有什么优势
②代码怎么实现
1.hello,world
package D1_begin表示导入软件包,软件包是用来放java文件的地方
public class Main表示定义公共类Main,Main即是java的文件名,也就是类名
每一个类只能有一个公共类(与java文件名相同),可以有很多非公共类
公共类表示该类可以被其他类调用
public static void main(String[] args)表示定义main方法,是程序的入口
main方法必须是public的,因为JVM需要从外部调用它才能执行程序
main方法必须是static的,static 关键字意味着该方法属于类本身,而不是类的某个实例,因此可以直接通过类名来调用它,而无需先创建该类的一个实例。这在 main 方法的情况下是非常有用的,因为 main 方法是程序的起点,不需要依赖于任何特定的对象实例。
2.变量的定义与数据类型
在Java中,定义变量的格式为:数据类型 变量名 = 数值;
数据类型包括primitive data和reference data
primitive data的数据类型为小写字母开头,如下所示:
reference data为大写开头,如下所示:
两种数据类型的区别:
①primitive data一旦定义,其值变不可更改,也不能对其进行任何操作,除非再次赋值
②refenence data定义其实相当于定义了一个对象的实例(即一个类的实际用法),不仅仅是定义一个数据这么简单。我们可以调用对象的方法来修改对象的属性,在refenence data中,每一种数据类型(比如Interger,Double)都有其对应的方法(Java自带的,称为包装类方法wrapper classes),因此我们可以直接使用这些属性和方法对实例进行操作,比上面的字符串String,我们可以使用增删改等等操作,实现对变量的操作。
③这两种不同数据类型之间的转换称为装箱(autoboxing)和拆箱(unboxing)
3.用户输入
可以让用户输入内容,实现简单的交互
new 关键词表示引用类,第一行代码表示创建类的实例为scanner
其中,Scanner类可以接收用户输入的一个数据
第三行代码表示定义接收的数据类型为字符串类型,变量名为name
4.简单的GUI界面
一个简单的动画效果GUI界面,可以实现与用户的动画效果互动
5.if判断语句
可以根据某个条件是否满足,来决定是否执行某个代码块。
6.switch多判断分支
switch 语句允许程序员根据一个表达式的值来选择一个代码块来执行。这与使用多个 if-else if-else 语句相比,可以使代码更加清晰和易于维护。
值得注意的是,在Java中,表达式的值不仅仅可以是整数或枚举类型,还可以是字符串
以下是switch语句中,表达式data的值为字符串的情况:
7.与或非逻辑表达式
与或非逻辑表达式通常结合if判断,for或while循环语句使用。它可以根据多个条件来判断布尔表达式的值(之前的if判断或者for判断都是只有一个表达式,通过逻辑表达式,可以将多个表达式关联使用)
逻辑与AND:&&
逻辑或OR:||
逻辑非NOT:!
8.while循环
while 循环在编程中是一个非常重要的控制结构,它允许程序在满足特定条件时重复执行一段代码。比如以下是一个简单的密码输入界面,用户只能在错误的情况下重复输入三次
9.for循环与for_each循环
for循环:
For_each循环:
可以理解为增强型的for循环;
是一种遍历数组array或者集合ArrayList中所有元素的遍历方法;
好处是:每个循环的步骤更少,比标准for循环可读性更强
坏处是:不太灵活
10.数组
Java中的数组是一种非常重要的数据结构,它允许程序员在内存中存储相同类型的多个变量,并且可以通过索引来访问这些变量,它允许程序员以高效的方式存储和处理数据;
可存储连续的字符串,整形,浮点型,字符等等;
数组的定义方式是在数据类型的基础上加上中括号[],存储多个相同的数据类型;
用大括号{}将相同的数据类型依次保存;
二维数组:
二维数组相对于一维数组在处理具有行列结构的数据时具有显著的优势。它能够直观地表示矩阵和表格数据,简化数据处理过程,并支持多种操作,使得处理具有行列结构的数据变得更加容易和高效
11.字符串
字符串是一种reference data,因此它的开头Stiring是大写的;
字符串(String)是一种非常重要的数据类型,通常用于表示和存储文本信息;
String.equals():判断引用类型数据字符串是否与括号内字符串相等;
String.isEmpty():判断字符串是否为空;
String.length():求字符串长度
String.charAt(2):返回序列号为2的字符串(左边从0开始)
String.indexOf(‘H’):返回字符串内字符为‘H’的索引值
String.toLowerCase():将字符串整体转为小写
String.toUpperCase():将字符串整体转为大写
String.replace(“a”,”b”)将字符串内所有的b替换为a
12.ArrayList(一种泛型类,后面会重点介绍)
ArrayList 相比于数组array(如 int[], String[] 等)在 Java 中有几个明显的优势:
①动态大小:
ArrayList 可以动态地调整其大小以存储任意数量的元素,而无需像数组array那样预先定义或手动调整其大小。这使得 ArrayList 在处理不确定数量元素的情况下更加灵活和方便。
②类型安全:
ArrayList 支持泛型,可以在声明时指定元素的类型,从而提供编译时的类型安全。相比之下,原生数组虽然也可以在声明时指定元素的类型,但如果在运行时将错误类型的元素放入数组中,编译器不会报错,而只能在运行时抛出 ArrayStoreException。
③丰富的功能:
ArrayList 提供了许多有用的方法来操作列表,如 add(), remove(), contains(), indexOf(), subList(), clear() 等。这些方法大大简化了对列表元素的添加、删除、查找和修改等操作。而原生数组则只提供了基本的访问和遍历功能。
④方便的遍历:
ArrayList 实现了 Iterable 接口,可以直接使用 for-each 循环进行遍历。相比之下,原生数组虽然也可以使用 for-each 循环进行遍历,但需要先将其转换为 List 或其他实现了 Iterable 接口的集合类。
⑤线程安全(虽然不是默认的):
虽然 ArrayList 本身不是线程安全的,但可以通过包装(如 Collections.synchronizedList())或使用线程安全的替代品(如 CopyOnWriteArrayList)来实现线程安全。相比之下,原生数组本身并不提供线程安全机制。
⑥易于扩展:
ArrayList 提供了丰富的 API,允许开发人员根据需要对其进行扩展和定制。例如,可以通过继承 ArrayList 类并重写其方法来添加自定义功能。而原生数组则相对固定,不易于进行扩展和定制。
⑦集合框架的集成:
ArrayList 是 Java 集合框架的一部分,可以与其他集合类(如 HashSet, LinkedList, TreeSet 等)无缝集成,方便地进行集合之间的转换和操作。而原生数组则相对独立,与其他集合类的集成需要额外的转换步骤。