一些java基础 - Alias的博客

Java基础

面向对象三大基本特征和五大基本原则

面向对象三大基本特征

封装

封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏(对内部数据提供了不同级别的保护)

继承

继承是指他可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能扩展。

继承实现方法分为实现继承和接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅仅使用属性和方法名称,但是子类必须提供实现能力

多态

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。

面向对象五大基本原则

单一职责原则

一个类,最好只做一件事,只有一个引起他的变化(低耦合,高内聚)

开放封闭原则

软件实体应该是可扩展的,而不可修改。对扩展开放,对修改封闭

Liskov替换原则

子类必须能够替换其基类(对继承机制的约束规范)

依赖倒置原则

其核心思想是:依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。当两个模块之间存在紧密的耦合关系时,最好的方法就是分离接口和实现:在依赖之间定义一个抽象的接口使得高层模块
调用接口,而底层模块实现接口的定义,以此来有效控制耦合关系,达到依赖于抽象的设计目标。

接口隔离原则

使用多个小的专门的接口,而不要使用一个大的总接口。

接口应该是内聚的,应该避免“胖”接口。一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。

成员变量和方法作用域

public : 表明该成员变量或者方法是对所有类或者对象都是可见的,所有类或者对象都可以直接访问。
private : 表明该成员变量或者方法是私有的,只有当前类对其具有访问权限,除此之外其他类或者对象都没有访问权限.子类也没有访问权限。
protected : 表明成员变量或者方法对类自身,与同在一个包中的其他类可见,其他包下的类不可访问,除非是他的子类。
default : 表明该成员变量或者方法只有自己和其位于同一个包的内可见,其他包内的类不能访问,即便是它的子类。

平台无关性

平台无关性就是一种语言在计算机上的运行不受平台的约束,一次编译,到处执行

所以,Java 之所以可以做到跨平台,是因为 Java 虚拟机充当了桥梁。

Java中的值传递

值传递、引用传递

实参和形参

形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。
实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.test;

/**
* @author lisihan
* @Description TODO
* @date 2022/10/25-20:30
*/
public class demo {
public static void main(String[] args) {
//实参
String name = "Alias";
print(name);
}

public static void print(String name) {
// 这里的name为形参
System.out.println(name);
}
}

值传递和引用传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

为什么Java只有值传递?

对于基本数据类型的值传递,写一个小demo就能看出,这里我们略过

对于Java中的对象传递,我们写一个demo

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package com.test;

/**
* @author lisihan
* @Description TODO
* @date 2022/10/25-20:30
*/
public class demo {
public static void main(String[] args) {
User hollis = new User();
hollis.setName("Alias");
hollis.setGender("Male");
pass(hollis);
System.out.println("print in main , user is " + hollis);
}
public static void pass(User user) {
user.setName("holly");
System.out.println("print in pass , user is " + user);
}
}
class User {
private String name;
private String gender;

public User() {
}

public User(String name, String gender) {
this.name = name;
this.gender = gender;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getGender() {
return gender;
}

public void setGender(String gender) {
this.gender = gender;
}

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

可以看到,对象类型在被传递到 pass 方法后,在方法内改变了其内容,最终调用方main 方法中的对象也变了。
所以,很多人说,这和引用传递的现象是一样的,就是在方法内改变参数的值,会影响到调用方。但是,其实这是走进了一个误区。

无论是值传递,还是引用传递,都只不过是求值策略中的一种,而Java中的对象传递,就是共享对象传递

共享对象传递:传共享对象调用中,先获取到实际参数的地址,然后将其复制,并把该地址的拷贝传递给被调函数的形式参数。因为参数的地址都指向同一个对象,所以我们也称之为”传共享对象”,所以,如果在被调函数中改变了形式参数的值,调用者是可以看到这种变化的。传共享对象调用其实是传值调用的一个特例

如果我们把pass中的代码加一行user=new User(); 那结果就会截然不同

因此,编程语言中需要进行方法间的参数传递,这个传递策略为求值策略,常见的求值策略为值传递和引用传递,还有一种值传递的特例——共享对象传递。值传递和引用传递最大的区别就是传递过程中有没有复制出一个副本。在Java之中,是通过值传递来实现参数传递,只不过对于Java对象的传递,传递的内容是对象的引用。

评论