问题总结

发表时间:2017-05-08 17:13:26 浏览量( 15 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度

学习过程:

问题一、is-a的关系

我们前面讲过面向对象思想简单概括起来就是三个:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。这个思想大家应该作为一个整体去理解,而不是单独理解,我们继承其实也是一种封装的思想,而继承也是可以支持多态的,这里我们讲讲多态的实现。下面我们就以在abstract抽象类章节中使用过的抽象类Employee,经理类Manager,会计类Accounting来讲解一下多态的使用。

我们在建立一个类,代码如下:

/**
 * 操作类
 */
public class Cao {
    //以抽象类作为参数,但是在调用这个方法时,必须要传入的是抽象类Employee的实现类
    public void test(Employee employee){
        employee.getsalary();
    }
}

到底是给经理类还是给会计发工资呢。必须在Run类中才能知道。在以后学了发射等高级java时,会再次使用多态的技术。Run类的实现代码如下:

public class Run {
    public static void main(String[] args) {
        //这个员工既可以是
        //Employee employee=new Manager();
        Employee employee=new Accounting();
        Cao cao=new Cao();
        cao.test(employee);
    }
}

问题二、值传参,对象作为参数时的值传参

值传参和传指针在C语言里面有比较多的讨论,如果你以前学习过C语言,那么你也可以把对象理解为是一个指针,对象多有的属性的数据和方法都是由这个指针指向而已。我们先讲讲值传参吧!首先我们先看看下面这段程序。

public class Test2 {
	//值传参
	public void op(int a,int b){
		int c;
		c=a;
		a=b;
		b=c;
		System.out.println("a="+a);
		System.out.println("b="+b);
	}
	
	public static void main(String[] args) {
		int x=100,y=-1;
		
		Test2 test2=new Test2();
		test2.op(x, y);
		
		System.out.println("x="+x);//输出还是 100
		System.out.println("y="+y);//输出还是 -1	
	}
}

在这段程序中,我们想要实现一个方法,功能是交换两个数的值,但是在程序中调用这个方法后,在方法中的a和b的值已经交换了,但是x和y这两个变量的值并没有改变,这是因为程序在方法传参时使用的是值传参方式。如图所示:


attcontent/a544222e-6ff3-4729-ad79-1f3dfdacb685.png

那么我修改一下这个程序

 public class Test3 {
	
	public int a;
	public int b;
	
	public void op(Test3 tt){
		int c;
		c=tt.a;
		tt.a=tt.b;
		tt.b=c;
	}
	
	public static void main(String[] args) {
		Test3 test3=new Test3();
		test3.a=100;
		test3.b=-1;
		
		test3.op(test3);
		
		System.out.println("a="+test3.a);//输出-1
		System.out.println("b="+test3.b);//输出100

	}

}

在这里我们修改了这个方法,把变量a和b作为类的属性封装起来,同时op方法也是传递的是一个对象。这时候输出对象a的值就已经加了100。为什么会这样了?其实我们还是使用值传参的。不过这个值是一个对象,而对象是指向它的数据。所以我们把对象tt的值改变后,对象test对应的值也会发生改变。

attcontent/79ad9c24-b6a6-40fc-9bd5-17d2a8d0e633.png

如果你还不明白,你可以在main方法中再测试一下代码:

 Test3 abc=new Test3();
abc.a=100;
		
Test3 efg;
efg=abc;// 把对象abc的值赋给efg,这样两个对象指向的是同一数据
efg.a=-12;//通过efg对象修改之后
System.out.println(abc.a);//再用abc对象访问时候,数据也发生了变化