Fork me on GitHub

Java面向对象基础总结

目录

  • 背景
  • 第一部分 开发、测试环境项目部署
  • 第二部分 项目打包
  • 第三部分 生产环境部署
  • 第四部分 总结
  • 参考文献及资料

背景

第一部分 方法

1.1 类变量的私有性

1
2
3
4
5
6
7
8
9
10
11
public class Person {
private String name;
private int age;
}

public class PersonMain {
public static void main(String[] args) {
Person xiaoming = new Person();
xiaoming.name = "xiao ming";
xiaoming.age = 21;
}

运行报错,Person中变量的私有,外部无法直接修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class Person {
private String name;
private int age;

public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age < 0 || age > 100) {
throw new IllegalArgumentException("invalid age value");
}else {
this.age = age;
}
}
public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

public class PersonMain {
public static void main(String[] args) {
Person xiaoming = new Person();
xiaoming.setName("xiao ming");
xiaoming.setAge(21);
System.out.println(xiaoming.getAge());

}
}

1.2 this变量

在方法内部,可以使用一个隐含的变量this,它始终指向当前实例。因此,通过this.field就可以访问当前实例的字段。例如下面的案例:

1
2
3
4
5
6
7
8
public void setAge(int age) {
if (age < 0 || age > 100) {
throw new IllegalArgumentException("invalid age value");
}else {
this.age = age;
//前面的this不可少,少了就变成局部变量name了
}
}

1.3 方法参数和可变参数

1
2
3
4
5
6
7
class Group {
private String[] names;

public void setNames(String[] names) {
this.names = names;
}
}

1.4 参数绑定

调用方把参数传递给实例方法时,调用时传递的值会按参数位置一一绑定。

基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。

第二部分 构造方法

2.1 自建构造方法

能否在创建对象实例时就把内部字段全部初始化为合适的值?这就是构造方法:

1
2
3
4
public Person(String name, int age) {
this.name = name;
this.age = age;
}

2.2 默认构造方法

如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句。

没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false

1
2
3
4
class Person {
public Person() {
}
}

如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法。

第三部分 方法重载

在一个类中,我们可以定义多个方法。如果有一系列方法,它们的功能都是类似的,只有参数有所不同,那么,可以把这一组方法名做成同名方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Hello {
public void hello() {
System.out.println("Hello, world!");
}

public void hello(String name) {
System.out.println("Hello, " + name + "!");
}

public void hello(String name, int age) {
if (age < 18) {
System.out.println("Hi, " + name + "!");
} else {
System.out.println("Hello, " + name + "!");
}
}
}

这种方法名相同,但各自的参数不同,称为方法重载(Overload)。

第四部分 继承

继承是面向对象编程中非常强大的一种机制,它首先可以复用代码。当我们让StudentPerson继承时,Student就获得了Person的所有功能,我们只需要为Student编写新增的功能。

1
2
3
4
5
6
7
8
class Student extends Person {
// 不要重复name和age字段/方法,
// 只需要定义新增score字段/方法:
private int score;

public int getScore() { … }
public void setScore(int score) { … }
}

另外由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。

super 关键字的功能:

  • 在子类的构造方法中显式的调用父类构造方法
  • 访问父类的成员方法和变量。
1
2
3
4
5
6
7
8
public class Student extends Person {
public Student(String name, int age, String birth) {
super(name, age); // 调用父类中含有2个参数的构造方法
}
public Student(String name, int age, String sex, String birth) {
super(name, age, sex); // 调用父类中含有3个参数的构造方法
}
}

在OOP的术语中,我们把Person称为超类(super class),父类(parent class),基类(base class),把Student称为子类(subclass),扩展类(extended class)。

Java只允许一个class继承自一个类,因此,一个类有且仅有一个父类。只有Object特殊,它没有父类。

当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。

第五部分 多态

在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)。

例如,在Person类中,我们定义了run()方法:

1
2
3
4
5
class Person {
public void run() {
System.out.println("Person.run");
}
}

在子类Student中,覆写这个run()方法:

1
2
3
4
5
6
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}

Override和Overload不同的是,如果方法签名不同,就是Overload,Overload方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override

第六部分 抽象类

如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。

因为无法执行抽象方法,因此这个类也必须申明为抽象类(abstract class)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {
public static void main(String[] args) {
Person p = new Student();
p.run();
}
}

abstract class Person {
public abstract void run();
}

class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}

第七部分 接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main {
public static void main(String[] args) {
Person p = new Student("Xiao Ming");
p.run();
}
}

interface Person {
String getName();
default void run() {
System.out.println(getName() + " run");
}
}

class Student implements Person {
private String name;

public Student(String name) {
this.name = name;
}

public String getName() {
return this.name;
}
}

第八部分 静态字段和静态方法

第九部分 包

第十部分 作用域

第十一部分 classpath和jar

第十二部分 模块

参考文献及资料

1、vue项目文档,链接:https://vuejs.org/

本文标题:Java面向对象基础总结

文章作者:rong xiang

发布时间:2021年03月20日 - 13:03

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/a938fa6a/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%