Java基础(3)- 面向对象(1)
面向对象基础
面向对象程序设计(Object Oriented Programming)
对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼,我们要做一个月饼首先需要一个模具,模具就是我们的类,而做出来的月饼,就是类的实现,也叫做对象)
类是抽象的数据类型,并不能代表某一个具体的事物,类是对象的一个模板。类具有自己的属性,包括成员变量、成员方法等,我们可以调用类的成员方法来让类进行一些操作。
1
2
3
4Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println("你输入了:"+str);
sc.close();所有的对象,都需要通过
new
关键字创建,基本数据类型不是对象!Java不是纯面对对象语言!不是基本类型的变量,都是引用类型,引用类型变量代表一个对象,而基本数据类型变量,保存的是基本数据类型的值,我们可以通过引用来对对象进行操作。(最好不要理解为引用指向对象的地址,初学者不要谈内存,学到JVM时再来讨论)
对象占用的内存由JVM统一管理,不需要手动释放内存,当一个对象不再使用时(比如失去引用或是离开了作用域)会被JVM自动清理,内存管理更方便!
类的基本结构
- 为了快速掌握,我们自己创建一个自己的类,创建的类文件名称应该和类名一致。
成员变量
在类中,可以包含许多的成员变量,也叫成员属性,成员字段(field)通过
.
来访问我们类中的成员变量,我们可以通过类创建的对象来访问和修改这些变量。成员变量是属于对象的!1
2
3
4
5
6
7
8
9
10public class Test {
int age;
String name;
}
public static void main(String[] args) {
Test test = new Test();
test.name = "奥利给";
System.out.println(test.name);
}成员变量默认带有初始值,也可以自己定义初始值。
成员方法
我们之前的学习中接触过方法(Method)吗?主方法!
1
2
3public static void main(String[] args) {
//Body
}方法是语句的集合,是为了完成某件事情而存在的。完成某件事情,可以有结果,也可以做了就做了,不返回结果。
比如计算两个数字的和,我们需要得到计算后的结果,所以说方法需要有返回值;又比如,我们只想把数字打印在控制台,只需要打印就行,不用给我结果,所以说方法不需要有返回值。
方法的定义和使用
在类中,我们可以定义自己的方法,格式如下:
1
2
3
4[返回值类型] 方法名称([参数]){
//方法体
return 结果;
}返回值类型:可以是引用类型和基本类型,还可以是void,表示没有返回值
方法名称:和标识符的规则一致,和变量一样,规范小写字母开头!
参数:例如方法需要计算两个数的和,那么我们就要把两个数到底是什么告诉方法,那么它们就可以作为参数传入方法
方法体:方法具体要干的事情
结果:方法执行的结果通过return返回(如果返回类型为void,可以省略return)
非void方法中,
return
关键字不一定需要放在最后,但是一定要保证方法在任何情况下都具有返回值!1
2
3
4
5
6
7int test(int a){
if(a > 0){
//缺少retrun语句!
}else{
return 0;
}
}return
也能用来提前结束整个方法,无论此时程序执行到何处,无论return位于哪里,都会立即结束个方法!1
2
3
4
5
6void main(String[] args) {
for (int i = 0; i < 10; i++) {
if(i == 1) return; //在循环内返回了!和break区别?
}
System.out.println("淦"); //还会到这里吗?
}传入方法的参数,如果是基本类型,会在调用方法的时候,对参数的值进行复制,方法中的参数变量,不是我们传入的变量本身!
1
2
3
4
5
6
7
8
9
10
11
12
13public static void main(String[] args) {
int a = 10, b = 20;
new Test().swap(a, b);
System.out.println("a="+a+", b="+b);
}
public class Test{
void swap(int a, int b){ //传递的仅仅是值而已!
int temp = a;
a = b;
b = temp;
}
}传入方法的参数,如果是引用类型,那么传入的依然是该对象的引用!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class B{
String name;
}
public class A{
void test(B b){ //传递的是对象的引用,而不是值
System.out.println(b.name);
}
}
public static void main(String[] args) {
int a = 10, b = 20;
B b = new B();
b.name = "lbw";
new A().test(b);
System.out.println("a="+a+", b="+b);
}方法之间可以相互调用
1
2
3
4
5
6
7void a(){
//xxxx
}
void b(){
a();
}当方法在自己内部调用自己时,称为递归调用(递归很危险,慎重!)
1
2
3int a(){
return a();
}成员方法和成员变量一样,是属于对象的,只能通过对象去调用!
方法的重载
一个类中可以包含多个同名的方法,但是需要的形式参数不一样。(补充:形式参数就是定义方法需要的参数,实际参数就传入的参数)方法的返回类型,可以相同,也可以不同,但是仅返回类型不同,是不允许的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public class Test {
int a(){ //原本的方法
return 1;
}
int a(int i){ //ok,形参不同
return i;
}
void a(byte i){ //ok,返回类型和形参都不同
}
void a(){ //错误,仅返回值类型名称不同不能重载
}
}现在我们就可以使用不同的参数,但是支持调用同样的方法,执行一样的逻辑:
1
2
3
4
5
6
7
8
9public class Test {
int sum(int a, int b){ //只有int支持,不灵活!
return a+b;
}
double sum(double a, double b){ //重写一个double类型的,就支持小数计算了
return a+b;
}
}现在我们有很多种重写的方法,那么传入实参后,到底进了哪个方法呢?
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
35public class Test {
void a(int i){
System.out.println("调用了int");
}
void a(short i){
System.out.println("调用了short");
}
void a(long i){
System.out.println("调用了long");
}
void a(char i){
System.out.println("调用了char");
}
void a(double i){
System.out.println("调用了double");
}
void a(float i){
System.out.println("调用了float");
}
public static void main(String[] args) {
Test test = new Test();
test.a(1); //直接输入整数
test.a(1.0); //直接输入小数
short s = 2;
test.a(s); //会对号入座吗?
test.a(1.0F);
}
}
练习
- 学生应该具有以下属性:名字、年龄
- 学生应该具有以下行为:学习、运动、说话