[Java]基础入门-Day 2
[Java]基础入门-Day2
学习使用工具
黑马2023新版Java视频教程 https://www.bilibili.com/video/BV1Fv4y1q7ZH?p=8&vd_source=03da0cdb826d78c565cd22a83928f4c2
Java程序员进阶之路 https://tobebetterjavaer.com/overview/java-can-do-what.html
一、Java包
Java 定义了一种名字空间,称之为包:package
。一个类总是属于某个包,类名只是一个简写,真正的完整类名是包名.类名。为了避免名字冲突,我们需要确定唯一的包名。
位于同一个包的类,可以访问包作用域的字段和方法。不用public
、protected
、private
修饰的字段和方法就是包作用域。
二、Java方法
-
方法的声明
访问权限:它指定了方法的可见性。Java 提供了四种访问权限修饰符:
- public:该方法可以被所有类访问。
- private:该方法只能在定义它的类中访问。
- protected:该方法可以被同一个包中的类,或者不同包中的子类访问。
- default:该方法如果没有使用任何访问权限修饰符,Java 默认它使用 default 修饰符,该方法只能被同一个包中类可见。
-
实例方法
没有使用 static 关键词修饰,但在类中声明的方法被称为实例方法,在调用实例方法之前,必须创建类的对象。实例方法有两种特殊类型:
- getter 方法:用来获取私有变量(private 修饰的字段)的值
- setter 方法:用来设置私有变量的值
-
静态方法
有 static 关键字修饰的方法就叫做静态方法。
-
抽象方法
没有方法体的方法被称为抽象方法,它总是在抽象类中声明。这意味着如果类有抽象方法的话,这个类就必须是抽象的。可以使用 atstract 关键字创建抽象方法和抽象类。
-
构造方法
构造方法是一种特殊的方法,当一个类被实例化的时候,就会调用构造方法。只有在构造方法被调用的时候,对象才会被分配内存空间。每次使用
new
关键字创建对象的时候,构造方法至少会被调用一次。- 构造方法的名字必须和类名一样
- 构造方法没有返回类型,包括 void
- 构造方法不能是抽象的、静态的、最终的、同步的,也就是说,构造方法不能通过 abstract、static、final、synchronized 关键字修饰
可以通过构造方法复制对象:
CopyConstrutorPerson p1 = new CopyConstrutorPerson("沉默王二",18); CopyConstrutorPerson p2 = new CopyConstrutorPerson(p1);
-
方法重写(override)
如果子类具有和父类一样的方法(参数相同、返回类型相同、方法名相同,但方法体可能不同),我们称之为方法重写。方法重写用于提供父类已经声明的方法的特殊实现,是实现多态的基础条件。
-
方法重载(overload)
如果一个类有多个名字相同但参数个数不同的方法,称这些方法为方法重载。
区别点 方法重写 方法重载 结构上 垂直结构,是一种父子类之间的关系 水平结构,是一种同类之间关系 参数列表 不可以修改 可以修改 访问修饰符 子类的访问修饰符范围必须大于等于父类访问修饰符范围 可以修改 抛出异常 子类方法异常必须是父类方法异常或父类方法异常子异常 可以修改
三、访问权限
-
默认访问权限(包访问权限)
如果一个类的方法或变量被包访问权限修饰,也就意味着只能在同一个包中的其他类中显示地调用该类的方法或者变量,在不同包中的类中不能显式地调用该类的方法或变量。
-
private
如果一个类的方法或者变量被 private 修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能显式的进行访问。
-
protected
如果一个类的方法或者变量被 protected 修饰,对于同一个包的类,这个类的方法或变量是可以被访问的。对于不同包的类,只有继承于该类的类才可以访问到该类的方法或者变量。
-
public
被 public 修饰的方法或者变量,在任何地方都是可见的。
四、代码初始化块
public class Car {
Car() {
System.out.println("构造方法");
}
{
System.out.println("代码初始化块");
}
public static void main(String[] args) {
new Car();
}
}
五、接口
接口通过 interface 关键字来定义,它可以包含一些常量和方法。
- 接口不允许直接实例化,需要定义一个类去实现(implements)接口,然后再实例化。
- 接口可以是空的,既可以不定义变量,也可以不定义方法。
- 接口不可以被final修饰。
- 接口的抽象方法不能是 private、protected 或者 final。
- 接口的变量是隐式
public static final
(常量),所以其值无法改变。
优点
- Java 原则上只支持单一继承,但通过接口可以实现多重继承的目的。如果有两个类共同继承(extends)一个父类,那么父类的方法就会被两个子类重写。然后,如果有一个新类同时继承了这两个子类,那么在调用重写方法的时候,编译器就不能识别要调用哪个类的方法了。
- 可以实现多态。多态存在的 3 个前提:
- 要有继承关系。
- 子类要重写父类的方法。
- 父类引用指向子类对象。
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
六、this关键字与super关键字
this
可以作为引用变量,指向当前对象。除此之外, this 关键字还可以完成以下工作。
- 调用当前类的方法;
this()
可以调用当前类的构造方法,在构造方法中使用this()
表示调用当前类的其他构造方法;this
可以作为参数在方法中传递;this
可以作为参数在构造方法中传递;this
可以作为方法的返回值,返回当前类的对象。
super
关键字的用法主要有三种。
- 指向父类对象;
- 调用父类的方法;
super()
可以调用父类的构造方法。
this()
和super()
都只能在构造方法的第一行出现
七、static关键字与final关键字
static 关键字的作用可以用一句话来描述:“方便在没有创建对象的情况下进行调用,包括变量和方法”。
- 静态变量:如果在声明变量的时候使用了 static 关键字,那么这个变量就被称为静态变量。静态变量只在类加载的时候获取一次内存空间。
- 静态方法:静态方法属于这个类而不是这个类的对象,调用静态方法的时候不需要创建这个类的对象,静态方法可以访问静态变量。
- 静态代码块:用一个 static 关键字,外加一个大括号括起来的代码。加载类时执行,仅执行一次(与代码初始化块不同)
被 final 修饰的变量无法重新赋值,被 final 修饰的方法不能被重写。一个类不是 final,但它所有的方法都是 final 的,说明该类可以被继承,然后追加一些非 final 的方法。
八、Java面向对象三大特性
-
封装
是对类的封装,封装是对类的属性和方法进行封装,只对外暴露方法而不暴露具体使用细节,所以我们一般设计类成员变量时候大多设为私有而通过一些 get、set 方法去读写。
-
继承
子类继承(extends)或实现(implements)父类,子类拥有父类除私有的所有属性和方法,自己还能在此基础上拓展自己新的属性和方法。主要目的是复用代码。
在 Java 继承中,父子类初始化先后顺序为:
- 父类中静态成员变量和静态代码块
- 子类中静态成员变量和静态代码块
- 父类中普通成员变量和代码块,父类的构造方法
- 子类中普通成员变量和代码块,子类的构造方法
总的来说,就是静态>非静态,父类>子类,非构造方法>构造方法。同一类别(例如普通变量和普通代码块)成员变量和代码块执行从前到后,需要注意逻辑。
-
多态
多态是同一个行为具有多个不同表现形式或形态的能力。即一个父类可能有若干子类,各子类实现父类方法有多种多样,调用父类方法时,父类引用变量指向不同子类实例而执行不同方法,这就是所谓父类方法是多态的。