我与Java,起源于游戏Minecraft(我的世界)。
很早之前,早在从没想过有一天会接触代码时,就喜欢玩我的世界这款游戏,当时是用手机玩的Bedrock Edition 基岩版(现在了解到此版本基于C++开发),与电脑上的Java Edition Java版(基于Java开发)有小的差异,那时候就羡慕得不行,想着哪天一定要有台电脑玩上Java版本……于是Java之路开始了。
多的就不说了,后来就理所应当的“喜欢上了Java”,整个Java基础应该花了几个月,在阿玮老师的视频下,学习过程可以称得上是十分愉悦的。下面是我的含源码笔记(目录均以英文命名,可能会造成一定阅读障碍),以及对整个过程大致的复盘小结。
如上图所示,我又将Java基础按自己的理解分为了Java入门和Java进阶。
首先是Java入门,最最基础的概念以及循环、判断等就不再赘述了。
数组
数组作为Java最基本的数据容器(数据结构)之一,可用于存储相同类型的多个元素。它与其他编程语言中数组的最大差别就是,数组中的数据是引用数据类型,是数据在内存中的地址值,而非数据值本身。
方法
方法是一段可重用的代码块,用于执行特定的任务。
public static 返回值类型 方法名(参数){
方法体;
return 返回值;
}
上面就是方法的定义格式,作为一种强类型语言,Java的方法要求返回值类型与返回值一致,若方法无返回值,则类型为void(如下)。
方法的重载 Overload
在封装类的过程中出现了多个同名的方法,但方法的参数表不同,就叫方法重载。
public void playGame() {
System.out.println("选人物");
System.out.println("准备开局");
System.out.println("对线");
System.out.println("崩盘");
System.out.println("骂队友");
System.out.println("送人头");
System.out.println("GG");
}
public void playGame(String name) {
System.out.println("选人物" + name);
System.out.println("准备开局");
System.out.println("对线");
System.out.println("崩盘");
System.out.println("骂队友");
System.out.println("送人头");
System.out.println("GG");
}
public void playGame(String name, int num) {
System.out.println("选人物" + name);
System.out.println("准备开局");
System.out.println("对线");
System.out.println("崩盘");
System.out.println("骂队友");
System.out.println("送人头" + num + "个");
System.out.println("GG");
}
方法的重写 Override
在继承体系中,子类拥有与父类方法名相同,且参数数量、类型也相同的方法,就叫方法重写。
class Player {
public void playGame() {
System.out.println("选人物");
System.out.println("准备开局");
System.out.println("对线");
System.out.println("崩盘");
System.out.println("骂队友");
System.out.println("送人头");
System.out.println("GG");
}
}
class YaLiGuai extends Player {
public void playGame() {
System.out.println("选人物");
System.out.println("骂队友");
System.out.println("送人头");
System.out.println("GG");
}
}
面对对象
面对对象三大特征
封装
将一个对象的“属性”(成员变量)及“行为“(方法)包装成一个独立的“个体”(类),目的是既安全又便捷地对此类进行后续操作。
例如,定义一个类:猫,则其属性可以有姓名、年龄、体重等等,行为吃喝拉撒睡……根据实际需要。
标准类 JavaBean
- 成员变量用private修饰
- 为每个成员变量写一对get/set方法
- 一个无参的构造方法
- 一个全参的构造方法
JavaBean即是封装原则的体现。如下是一个猫类的JavaBean示例
class Cat {
private String name;
private int age;
private double weight;
public Cat() {
}// 无参构造
public Cat(String name, int age, double weight) {
this.name = name;
this.age = age;
this.weight = weight;
}// 全参构造
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public void huntMouse() {
System.out.println("猫捉老鼠");
}
}
抽象类
拥有抽象方法的类就是抽象类,抽象类要使用abstract关键字声明。例如上文提到的,若猫类的行为方法中有一个抽象方法如下,则此猫类称作抽象类。
public abstract void eat();//抽象方法,没有{}方法体,且由abstract关键字做修饰
继承
多个类之间建立的“父子关系”,目的是将多个子类的重复“属性、行为”抽取到父类中,提高代码复用性。
public class Cat extends Animal {}
其中的Cat即为子类,继承自父类Animal。很好理解,猫隶属于动物,动物也可以有上述的属性、行为,而猫可以有如“抓老鼠”这种独有的行为,于是可以独自封装一个方法“抓老鼠”,这就是继承的另一个作用,强化子类功能。
又根据实际情况的不同,可分为单继承与多继承。特别地,若父类是一个抽象类,则其正常的子类需重写其全部抽象方法。
多态
同类型的对象,表现出不同的形态。目的是使用父类型作为参数,接收所有子类对象,体现多态的扩展性与便利性。
前提:
- 有继承/实现关系
- 有父类引用指向子类对象
- 有方法的重写
父类类型 对象名称 = 子类对象;
例如:
class Animal {
public void sound() {
System.out.println("动物发出声音");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("狗汪汪");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("猫喵喵");
}
}
public class Main {
public static void main(String[] args) {
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.sound(); // 输出:狗汪汪
a2.sound(); // 输出:猫喵喵
}
}
即在符合前提的情况下,通过传入不同子类可以创建实现同方法不同功能的实例对象。
接口 Interface
下图生动地诠释了接口的定义与作用。
接口与类之间是实现关系,由implements关键字表示
public interface 接口名 {} // 关键字interface用于定义接口,类似于class关键字
public class 类名 implements 接口名 {}
666