Java语法笔记(七):类与对象
类与对象
类定义一种全新的数据类型,包含一组变量和函数;对象是类这种类型对应的实例。
例如在一间教室中,可以将Student
定义成类,表示“学生”这个抽象的概念。那么每个同学就是Student
类的一个对象(实例)。
源文件声明规则
- 一个源文件中只能有一个
public
类。 - 一个源文件可以有多个非
public
类。 - 源文件的名称应该和
public
类的类名保持一致。 - 每个源文件中,先写
package
语句,再写import
语句,最后定义类。
类的定义
public
: 所有对象均可以访问private
: 只有本类内部可以访问protected
:同一个包或者子类中可以访问- 不添加修饰符:在同一个包中可以访问
- 静态(带
static
修饰符)成员变量/函数与普通成员变量/函数的区别:- 所有
static
成员变量/函数在类中只有一份,被所有类的对象共享; - 所有普通成员变量/函数在类的每个对象中都有独立的一份;
- 静态函数中只能调用静态函数/变量;普通函数中既可以调用普通函数/变量,也可以调用静态函数/变量。
- 所有
1 | //Point类 |
1 | //Main |
输出
1 | (3, 4) |
类的继承
每个类只能继承一个类。
1 | //ColorPoint子类 |
类的多态
同一个类的实例,调用相同的函数,运行结果不同.
1 | //Main |
输出
1 | (3, 4) |
接口
interface
与class
类似。主要用来定义类中所需包含的函数。
接口也可以继承其他接口,一个类可以实现多个接口。
接口的定义
接口中不添加修饰符时,默认为public
。
1 | //Role接口 |
接口的继承
每个接口可以继承多个接口
1 | //Hero子接口 |
接口的实现
每个类可以实现多个接口
1 | package org.ep.role.impl; |
接口的多态
1 | //Zeus |
1 | //Athena |
1 | //Main |
输出
1 | Zeus: Hello |
一个类想要实现一个接口,就必须实现接口里的所有函数
例题
斐波那契数列
输入一个整数 n,求斐波那契数列的第n项。
假定从 0开始,第 0项为 0。
输入样例
1
5
输出样例
1
5
解
1
2
3
4
5
6
7
8
9//Solution.java
package org.ep;
public class Solution {
public int Fibonacci(int n) {
if (n <= 1) return n;
else return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}替换空格
请实现一个函数,把字符串中的每个空格替换成
%20
。数据范围
0≤输入字符串的长度 ≤1000
注意输出字符串的长度可能大于 1000输入样例
1
"We are happy."
输出样例
1
"We%20are%20happy.
解
1
2
3
4
5
6
7
8
9
10
11
12
13
14//Main.java
package org.ep;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String strInput = sc.nextLine();
StringBuffer str = new StringBuffer(strInput);
Solution solution = new Solution();
System.out.println(solution.replaceSpaces(str));
}
}1
2
3
4
5
6
7
8//Solution.java
package org.ep;
class Solution {
public String replaceSpaces(StringBuffer str) {
return str.toString().replace(" ", "%20");
}
}求1+2+…+n
求
1+2+…+n
,要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)
数据范围
1≤n≤50000
输入样例
1
10
输出样例
1
55
解
1
2
3
4
5
6
7
8
9
10
11//Solution.java
package org.ep;
class Solution {
public int getSum(int n) {
int sum = 0;
for (int i = 1; i <= n; i ++)
sum += i;
return sum;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13//Main.java
package org.ep;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Solution solution = new Solution();
System.out.println(solution.getSum(n));
}
}
习题
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。
比如输入字符串”abcdefg”和数字 2,该函数将返回左旋转 2位得到的结果”cdefgab”。
数据范围
输入字符串长度 [0,1000]
输入样例
1
2abcdefg
2输出样例
1
cdefgab
解
1
2
3
4
5
6
7
8
9
10//Solution.java
package org.ep;
class Solution {
public String leftRotateString(String str,int n) {
String str1 = str.substring(n, str.length());
String str2 = str.substring(0, n);
return str1 + str2;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14//Main.java
package org.ep;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int n = sc.nextInt();
Solution solution = new Solution();
System.out.println(solution.leftRotateString(str, n));
}
}把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。
当然,不能使用 atoi 或者其他类似的库函数。
函数应满足下列条件:
- 忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;
- 整数后可能有任意非数字字符,请将其忽略;
- 如果整数长度为 0,则返回 0;如果整数大于
INT_MAX(231−1)
,请返回INT_MAX
;如果整数小于INT_MIN(−231)
,请返回INT_MIN
;
数据范围
输入字符串长度 [0,20]
输入样例
1
"123"
输出样例
1
123
解
1 | //Solution.java |
1 | //Main.java |