Skip to content

Commit 035a340

Browse files
authored
更新Chapter1.md
2 parents 91daf07 + b59d5f4 commit 035a340

File tree

1 file changed

+78
-205
lines changed

1 file changed

+78
-205
lines changed

Chapter1/Chapter1.md

Lines changed: 78 additions & 205 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
类和对象
44
======
55

6-
欢迎来到程谱Java面向对象教程第一章节——类和对象😁
6+
欢迎来到程谱Python面向对象教程第一章节——类和对象😁
77

8-
类和对象是Java面向对象编程中的思想基础。深入理解类和对象的概念并且熟练掌握其应用将为你的Java学习打下坚实的基础
8+
类和对象是Python面向对象编程中的思想基础。深入理解类和对象的概念并且熟练掌握其应用将为你的Python学习打下坚实的基础
99

1010
开始学习吧!💖
1111

@@ -22,15 +22,12 @@
2222
由此图可见,从左至右的三辆车各有独自的属性(状态):颜色、厂家、品牌、动力类型,等等。但他们都作为对象(object)共同属于“车(Car)”这个类。
2323

2424
类的定义方法很简单,如下:
25-
```java
26-
public class 类名 {
27-
//类的内容
28-
}
25+
```python
26+
class 类名(object)
27+
//类的内容
2928
```
3029

31-
之后在介绍继承的时候我们还会介绍extends关键字,这里我们先记下最简单的用法。
32-
33-
我们这个教程里面的类,无特殊说明,指的都是公有类(public class),对于私有类我们不需要掌握。
30+
之后在介绍继承的时候我们还会介绍括号里的填法,这里我们先记下最简单的用法``(object)``
3431

3532
属性和方法
3633
------
@@ -41,268 +38,144 @@ public class 类名 {
4138
### 方法
4239
方法(method)其实就是函数(function),它可以指导一个类中的对象如何执行具体的行为动作,不过一般如果我们想强调这个函数在一个类里面的作用,我们就会用“方法”这个词,比如`refuel()`就是用来操作这些属性的方法。我们还可以用过参数来告诉这个函数具体的内容,比如`setSpeed(double newSpeed)`这个函数就可以让我们给一个浮点参数`newSpeed`,让我们告诉它要设定的车的具体速度,这里的`newSpeed`写在函数定义里,称为形式参数(parameter),形式参数**一定**是要是一个合法的变量名,参数与参数用**逗号**隔开,每一个参数前面**都需要有一个参数类型**
4340

44-
Java的方法以如下格式呈现:
45-
```java
46-
public/private + 可能有 static 关键字 + 返回值类型 + 方法名(形式参数列表){
47-
方法体
48-
}
41+
Python的方法以如下格式呈现:
42+
```python
43+
def 方法名(参数1类型 参数1名, 参数2类型 参数2...):
44+
 //方法体
4945
```
5046

51-
`public``private``static`这三个关键字在“三个关键字”一节中会详细说明。
52-
5347
对于没有参数的函数,参数列表留空即可。
5448

55-
返回值可以理解为这个操作的结果,例如`getSpeed()`返回了一个`double`,代表当前的速度,那么用如下的方法就可以把当前的速度赋值给变量`carSpeed`
56-
```java
57-
carSpeed = getSpeed();
58-
```
59-
6049
在一个函数里面,我们通过`return`来终止整个函数的运行并给出返回值。
61-
例如`getSpeed()`可以这么定义(假定函数内有一个`double`类型的`speed`):
62-
```java
63-
public double getSpeed(){
64-
return speed;
65-
}
50+
例如`getSpeed()`可以这么定义(假定类里面已经定义了`speed`变量):
51+
```python
52+
def getSpeed():
53+
return speed
6654
```
6755

6856
我们还可以定义一个`setSpeed(double newSpeed)`
69-
```java
70-
public void setSpeed(double newSpeed){
71-
speed = newSpeed;
72-
}
57+
```python
58+
def setSpeed(double newSpeed):
59+
speed = newSpeed
7360
```
7461

75-
你可能会发现,上面出现了一个`void`,这是因为我们的`setSpeed`不需要任何返回值,因此我们通过这个关键字直接告诉Java这个函数无返回值。
76-
7762
### 类内访问方法和属性
7863
如果是在类的内部调用本类的函数,那么直接用如下格式调用即可:
79-
```java
80-
函数名(实际参数列表);
64+
```python
65+
函数名(实际参数列表)
8166
```
8267

8368
比如如果`car`类中的`speedUp`方法要调用`setSpeed`方法加速,就可以直接调用:
84-
```java
85-
setSpeed(getSpeed() + 10); // 把当前的速度加上10作为参数给setSpeed
69+
```python
70+
setSpeed(getSpeed() + 10) // 把当前的速度加上10作为参数给setSpeed
8671
```
8772
上面的`getSpeed() + 10`作为一个整体,就是实际参数(argument)了,实际参数不需要是一个变量名,它可以是任意的表达式(比如`1+10``getSpeed() + 10`),调用函数的时候会先算出这个表达式的值,把这个值给形式参数(比如给了`setSpeed``newSpeed`参数),再运行函数的内容。
8873

89-
比如下面这个精简版的car类就定义了一个属性fuel和一个方法addFuel(在main里没有做操作,因此什么也不会输出):
74+
比如下面这个精简版的``Car``类就定义了一个属性``speed``和一个方法``setSpeed``(在main里没有做操作,因此什么也不会输出):
9075

91-
<lab lang="java" parameters="filename=car.java">
76+
<lab lang="python" parameters="filename=car.py">
9277
<notice>练习环境在此无法显示,请移步至[程谱 coderecipe.cn](https://coderecipe.cn/learn/8)查看。</notice>
93-
public class car {
94-
double speed = 50; // 定义了一个属性
95-
public void setSpeed(double newSpeed) { // 定义了一个方法
96-
speed = newSpeed; // 操作这个属性
97-
}
98-
public static void main(String[] args) { // main是整个Java程序的入口
99-
}
100-
}
78+
class Car(object):
79+
speed = 50 // 定义了一个属性
80+
def setSpeed(newSpeed): // 定义了一个方法
81+
speed = newSpeed // 操作这个属性
10182
</lab>
10283

103-
你可能已经发现了,在这里文件名是`car.java`,这是因为Java要求我们让类的名称和类所处的文件名的名称保持一致。
104-
10584
对象和对象类型
10685
------
107-
一个对象(object),或一个类的实例(instance),指的是类的实体,比如一辆特定的奔驰就是`Car`这个类的实体。除了后面例外的`static`关键字声明的属性,每一个对象都有自己的一套属性(比如一辆奔驰和另一辆奔驰的`fuel`燃料就可以不一样多)。
86+
一个对象(object),或一个类的实例(instance),指的是类的实体,比如一辆特定的奔驰就是`Car`这个类的实体。每一个对象都有自己的一套属性(比如一辆奔驰和另一辆奔驰的`fuel`燃料就可以不一样多)。
10887
![对象](Pic2.png)
10988

110-
要从一个类里面新建对象,我们可以使用`new`这个操作符。`new`最简单的用法如下:
111-
```java
112-
类名 变量名 = new 类名();
89+
要从一个类里面新建对象,直接令一个新创建的变量为某个类即可
90+
91+
```python
92+
变量名 = 类名()
11393
```
11494

11595
比如定义一个`myCar`
116-
```java
117-
car myCar = new car();
96+
```python
97+
myCar = car()
11898
```
11999

120100
这句代码先定义了`car`类型的变量`myCar`,通过类新建了一个实例,并且把这个实例赋值给了一个变量。
121101

122-
如果要调用一个类里面的方法,或是要访问或修改一个类里面的属性,我们可以使用`.`操作符,例如我们可以用`myCar.fuel`来访问`myCar`对象的`fuel`,也可以用`myCar.addFuel(90)`来调用`myCar`对象的`addFuel`方法。
102+
如果要调用一个类里面的方法,或是要访问或修改一个类里面的属性,我们可以使用`.`操作符,例如我们可以用`myCar.speed`来访问`myCar`对象的`speed`,也可以用`myCar.setSpeed(90)`来调用`myCar`对象的`setSpeed`方法。
123103

124-
<lab lang="java" parameters="filename=car.java">
104+
<lab lang="python" parameters="filename=car.py">
125105
<notice>练习环境在此无法显示,请移步至[程谱 coderecipe.cn](https://coderecipe.cn/learn/8)查看。</notice>
126-
public class car {
127-
double fuel = 10; // 定义了一个属性
128-
public void addFuel(double fuelValue) { // 定义了一个方法
129-
fuel += fuelValue; // 操作这个属性
130-
}
131-
public static void main(String[] args) { // main是整个Java程序的入口
132-
car myCar = new car(); // 生成了一个car实例
133-
myCar.addFuel(90); // 调用这个方法
134-
System.out.println("The car's fuel value is: " + myCar.fuel + "."); // 输出我们的fuel属性的值
135-
}
136-
}
106+
class Car(object):
107+
speed = 0 // 定义了一个属性
108+
def setSpeed(newspeed): // 定义了一个方法
109+
speed = newSpeed // 操作这个属性
110+
myCar = car() //实例化了Car类,命名为myCar
111+
myCar.speed //调用myCar里的speed属性
112+
myCar.setSpeed(50) //调用myCar里的setSpeed方法(函数)
137113
</lab>
138114

139-
作用域和三个关键字
140-
------
141-
142-
### 作用域
143-
前面说过,作用域其实就是访问范围。在函数内定义的变量,作用域是在变量定义后到函数结束。在更内部(比如`for`循环的初始化内)定义的变量,作用域就仅限于那一个部分,到大括号结束为止。
144115

145-
那么接下来我们来看一下下面这三个关键字分别有什么效果,对作用域有什么影响吧。
116+
### 调用类的构造器
146117

147-
### `public`关键字
148-
`public`关键字说明的是这个变量或者方法在类外是可见的,不仅可以在类本身里面调用,而且可以在类外通过`.`运算符调用。
118+
``class``就相当于一个模版,可以通过这个模版创造出各种可以干同一件事,有同一类属性的实例。如果我们在用这个模版创建新物体时**强制需要**传入物体参数时,我们可以定义一个``__init__()``方法来让每次实例化该类时都必须传入某些参数。
149119

150-
151-
**注意,如果没有明确使用`public`关键字来修饰一个类或一个方法,该类或方法默认即为`public`属性。例如:**
152-
```java
153-
public class Dog{
154-
//类的内容
155-
}
156-
```
157-
158-
```java
159-
class Dog{
160-
//类的内容
161-
}
162-
```
163-
都是`public`的类。
164-
165-
同样,
166-
```java
167-
public void bark();
120+
```python
121+
class Student(object): //定义一个类,类的名字为student
122+
   def __init__(self,name,gender) //定义一个__init__方法,self即为这个新创建的实例
123+
self.name=name
124+
      self.gender=gender
125+
jerry = Student("Jerry","Male") //在创建实例时,self本身是不需要输进去的,python会自动传入该实例
168126
```
169-
170-
```java
171-
void bark();
172-
```
173-
也都是`public`的方法。
174-
175-
### `private`关键字
176-
177-
使用private修饰符所修饰的方法、属性仅能在本类中使用。如果在其他类中访问`private`变量会在编译时报错误,出现`Compile Error`
178-
179-
为了避免外界程序能够随意访问、调用、修改我们的属性值,我们需要将我们的这些程序给“包裹”住,让外界不能够那么轻易地修改。如果我们在编写一个银行账户`BankBalance`的类时,不用`private`去修饰我们的存款余额等敏感信息的话,任何人都有权限去修改我们银行账户的钱,这是极其不安全的。因此,我们要用`private`修饰符,来把这些信息(属性)给隐藏住。这就是Java中“封装”的理念。
180127

181-
### `static`关键字
128+
### 访问限制
182129

183-
带有`static`关键字定义的方法被称为静态方法(static method)实际上也被称为类方法(class method)。相反,不带有`static`方法的就被称为实例方法了。静态方法并不随着我们的对象的创建才能使用,静态方法是与对象无关的。静态方法能够直接通过类的调用来使用。换句话说,实例方法是面向实例,也就是对象的(对象就是类的实例),而静态方法是面向类的
130+
有时候,我们不希望其他人随意访问我们某个类里的一些数据,比如说你的电话号码,银行密码等等。这时候我们就可以用到访问限制来进行**封装**,保证数据的隐私性。这时候,我们可以用两个下划线``__变量名``来表示这个变量,这样这个数据就只能从这个类里面被访问了
184131

185-
`MyClass.java`里有:
186-
```Java
187-
public static class MyClass {
188-
public static void sayHi(){
189-
System.out.println("Hi!");
190-
}
191-
}
192-
```
193-
`Hello.java`里有:
194-
```Java
195-
public class Hello {
196-
public static void main(String[] args) {
197-
MyClass.sayHi();
198-
}
199-
}
200-
```
201-
202-
最后程序会输出“Hi!”的结果,而我们却没有用`new`创建实例。这是因为`static`关键字让sayHi这个方法不需要实例运行。这下你知道为什么`main`的前面有个`static`了吧,这是因为我们程序运行的时候Java可没有帮我们用`new`新建一个`Hello`实例呀。
203-
204-
`static`关键字除了可以修饰方法以外,还可以修饰变量,称为静态变量,静态变量同样和实例无关,尽管在实例里面也可以访问这个变量,但要注意一点——静态变量是所有实例共有的,一个类**只有一个**。也就是说比如我们在一个奔驰的实例里面修改了一个Car的静态变量,那么其他所有的Car的实例里面的都这个静态变量会被修改。
205-
206-
最后要注意的一点是,静态方法不能调用实例变量(毕竟在静态方法的视野中可是没有实例变量的)。
207-
208-
我们之前学的`Math`类里面的方法其实就是实例方法(如`Math.random`,不需要新建一个`Math`类的实例),`Math`里面的常数也都是实例变量(如`Math.PI`)。
209-
210-
`this`关键字
211-
-----
212-
213-
### 引用成员变量
214-
215-
在Java中,一个实例方法或实例变量【也就是不是静态方法/变量(类方法/变量)的方法/变量】总是被一个特定的对象所调用的。而这一个『特定的对象』,就是其所调用的实例方法的一个『隐传入参数』(implicit parameter),相当于传入了『是哪个对象调用了这个方法?』这样一个信息。在Java中,这一个特定的对象,可以用关键字`this`来方便地引用。
216-
217-
```java
218-
public class dog {
219-
String name;
220-
void bark(){
221-
System.out.println("I'm barking!");
222-
}
223-
public static void main(String[] args){
224-
dog dog1 = new dog();
225-
dog1.name = "bobo";
226-
dog1.bark();
227-
}
228-
}
229-
```
230-
231-
例如,在这个例子中,dog1是类中的一个对象,而name、bark()则分别为实例变量、实例方法。在这里,bark()的传入参数为空,也就是说bark()方法没有"显式传入参数,但其『隐式传入参数』就是其引用者:dog1。
232-
233-
```java
234-
public class Student {
235-
String name; //定义一个成员变量name
236-
private void SetName(String name)//定义一个参数(局部变量)name
237-
{
238-
this.name=name; //将局部变量的值传递给成员变量
239-
}
240-
}
132+
```python
133+
class BankAccount(object):
134+
def __init__(self,password):
135+
   self.__password = password
241136
```
242137

243-
`this`这个关键字代表的就是对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个`this`关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。
138+
### 封装
244139

245-
### 调用类的构造方法
140+
如果我们不能直接访问一些隐私性的数据,这时候我们应该如何修改他们呢?这时候我们就可以用到**封装**。我们可以新建一个方法来修改密码。
246141

247-
```java
248-
public class Student { //定义一个类,类的名字为student
249-
public Student() { //定义一个方法,名字与类相同故为构造方法
250-
this("Hello!");
251-
}
252-
public Student(String name) { //定义一个带形式参数的构造方法
253-
}
254-
}
142+
```python
143+
def setPassword(newPassword):
144+
self.__password = newPassword
255145
```
256146

257-
Student方法有两个构造方法,一个没有参数,一个有参数。在第一个没有带参数的构造方法中,使用了this(“Hello!”)这句代码,这句代码表示使用this关键字调用类中的有一个参数的构造方法。
258-
259-
### 返回对象的值
260-
261-
this关键字除了可以引用变量或者构造方法之外,还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。
262-
如代码在上面student类中使用return this,那么代码代表的含义就是return student。
263-
可见,这个this关键字除了可以引用变量或者成员方法之外,还可以作为类的返回值,这才是this关键字最引人注意的地方。
264-
265147
小练习
266148
-----
267-
1.Which of the following represents correct implementation code for the constructor with parameters?
149+
1.Which of the following code segment correctly initialize an object called ``Iphone`` from a class called ``Phone``?
268150

269151

270152
(A)
271-
```java
272-
hrs = 0;
273-
mins = 0;
274-
secs = 0;
153+
```python
154+
initianize Iphone from Phone
275155
```
276156
(B)
277-
```java
278-
hrs = h;
279-
mins = m;
280-
secs = s;
157+
```python
158+
Iphone = Phone(object)
281159
```
282160
(C)
283-
```java
284-
resetTime(hrs, mins, secs);
161+
```python
162+
Iphone = Phone()
285163
```
286164
(D)
287-
```java
288-
h = hrs;
289-
m = mins;
290-
s = secs;
165+
```python
166+
new Iphone = class Phone()
291167
```
292168
(E)
293-
```java
294-
Time = new Time(h, m, s);
169+
```python
170+
self.Iphone = Phone()
295171
```
296172

297-
<cr type="hidden"><notice>隐藏内容功能在此无法正常显示,请移步至[程谱 coderecipe.cn](https://coderecipe.cn/learn/8)查看。</notice>E</cr>
173+
<cr type="hidden"><notice>隐藏内容功能在此无法正常显示,请移步至[程谱 coderecipe.cn](https://coderecipe.cn/learn/8)查看。</notice>C</cr>
298174

299175
### 实验室
300176
在这里练习吧:
301-
<lab lang="java" parameters="filename=Hello.java">
177+
<lab lang="python" parameters="filename=Hello.py">
302178
<notice>练习环境在此无法显示,请移步至[程谱 coderecipe.cn](https://coderecipe.cn/learn/8)查看。</notice>
303-
public class Hello {
304-
public static void main(String[] args) {
305-
// 在这里添加你的代码
306-
}
307-
}
308-
</lab>
179+
def func():
180+
//your code goes here
181+
</lab>

0 commit comments

Comments
 (0)