This,传递,接口,抽象类小结
我们先来定义一个Student类
public class Student {
private String name;//姓名属性
private int score;//学分属性
//构造方法
public Student(){
this("初始值");//调用带一个字符串参数的构造方法
}
public Student(String name){
//this.name = name;
this(name,1);
}
public Student(String name,int score){
this.name = name ;
this.score = score;
}
//一般方法
public void setName(String name){
this.name = name;//将参数name的值付给属性name
}
public String getName(){
return name;
}
public void study(){
score++;
System.out.println(name+"学习中,学分是"+score);
}
public void study(int score){
//this.score+=score;
//System.out.println(name+"学习中,学分是"+this.score);
score++;
System.out.println("Score = "+score);
}
}
当我们实例化这个类时
public class Test {
public static void main(String[] args) {
// 实例化一个Student类的对象
Student stu = new Student();
stu.setName("张三");
Student stu2 = new Student();
stu2.setName("李四");
// 将stu赋给stu2
stu2 = stu;
//修改stu2的姓名
stu2.setName("王五");
stu.study();
stu2.study();
// int i = 2;
// stu2.study(i);
// System.out.println("i = "+i);
}
}
this
①在一般方法中,我们知道在运行的时候,因为就近原则,当参数名和属性名相同时,会优先使用参数名。比如:
Public void setName(String name){
name=name;
}
这样是错误的,如果你非要把参数名和属性名设为一致.可以使用this关键字
Public void setName(String name){
this.name=name;
}
这样就不会出错了;在这里,this就是用来区分属性和参数的,加了this表示属性.
②在上述构造方法中,如果我们可以发现this关键字可以用来调用类中重载的构造方法,具体调用什么方法就由参数来定。比如:
public Student(String name){
//this.name = name;
this(name,1);
}
public Student(String name,int score){
this.name = name ;
this.score = score;
}
如果我们new一个对象时,虽然第一个构造方法传入的是一个name参数,但当我们调用的时候,由于this(name,1)有两个参数,实现的将是第二个构造方法.这里体现了this关键字可以用来调用类中重载的构造方法,我们可以写多个构造方法,具体调用什么方法就由this中的参数来定。
值传递
值传递适用于8大基本类型和String类,具体用法从上述中study方法可以看出:
stu2.study();
int i = 2;
stu2.study(i);
System.out.println("i = "+i);
运行结果是:学分是3,i=2,
这里很好理解,当int将值2赋给学分后,以后学分的变化不会影响到i的值.它传递的是变量中存储的值。把值传递后,那么两个变量就没有任何的关系了。其中一个改变对另一个没有任何的影响。
引用传递(地址传递)
适用于对象类型(引用类型、类类型)
传递方式从上述的例子中可以看到:
stu.setName("张三");
Student stu2 = new Student();
stu2.setName("李四");
// 将stu赋给stu2
stu2 = stu;
//修改stu2的姓名
stu2.setName("王五");
stu.study();
stu2.study();
输出的结果都是王五.我们从下面几点理解:
1.对象名中存储的是对象在内存中的首地址。
2.对象可以有多个对象名的。在上述例子中,通过赋值将对象名stu中的地址拷贝一份存入到另一个对象名stu2中,此时两个对象名存储的地址就相同了,让其中一个对象名stu2修改了对象的属性值后,那么另一个对象名stu的也会跟着改变了(因为指向的是同一个对象)。stu2对象名原来指向的对象,就由Java的垃圾回收机制(Gc)自动销毁对象,释放内存空间。
接口
根据类的继承规则,即使子类中不重写父类的方法,也会调用父类的方法;但在特定的用途上我们要求子类必须重写父类中的方法,这就需要接口,接口也是一种类,只是比较特殊,我们可以用它来丰富类的继承.定义接口的关键字是:interface
接口的格式:
public interface 接口名 extends 接口名,... {
//常量
public static final 数据类型 常量名 = 值;
//抽象方法
public 返回值数据类型 方法名(数据类型 参数名,...);
}
注意:
1.接口中只能定义常量和抽象方法。
2.接口中默认的访问修饰符是public。
3.常量名的每一个字母要全部大写。
4.接口可以继承接口,而且可以同时继承多个接口。
5.接口不能用来实例化对象。
那么接口是怎么实现的呢?我们要用到的关键字是:implements
实现格式:public class 类名 extends 类名 implements 接口名,... {}
需要注意的是当类实现了接口后,那么类必须要实现接口中所有的抽象方法。
抽象类
抽象类是介于综合类和接口的一种特殊类.它的关键字是abstract class.抽象类中定义的方法,如果没有实现,前面就必须加上abstract关键字,即抽象方法.子类继承抽象类时,使用extends关键字,在子类中,必须实现抽象类中的abstract方法.子类只能同时继承一个抽象类,这与接口的implements不同.
直观的看,抽象类介于类与接口之间,可以有实现的,也可以有未实现的方法,抽象类也不能创建对象.
我们先来定义一个Student类
public class Student {
private String name;//姓名属性
private int score;//学分属性
//构造方法
public Student(){
this("初始值");//调用带一个字符串参数的构造方法
}
public Student(String name){
//this.name = name;
this(name,1);
}
public Student(String name,int score){
this.name = name ;
this.score = score;
}
//一般方法
public void setName(String name){
this.name = name;//将参数name的值付给属性name
}
public String getName(){
return name;
}
public void study(){
score++;
System.out.println(name+"学习中,学分是"+score);
}
public void study(int score){
//this.score+=score;
//System.out.println(name+"学习中,学分是"+this.score);
score++;
System.out.println("Score = "+score);
}
}
当我们实例化这个类时
public class Test {
public static void main(String[] args) {
// 实例化一个Student类的对象
Student stu = new Student();
stu.setName("张三");
Student stu2 = new Student();
stu2.setName("李四");
// 将stu赋给stu2
stu2 = stu;
//修改stu2的姓名
stu2.setName("王五");
stu.study();
stu2.study();
// int i = 2;
// stu2.study(i);
// System.out.println("i = "+i);
}
}
this
①在一般方法中,我们知道在运行的时候,因为就近原则,当参数名和属性名相同时,会优先使用参数名。比如:
Public void setName(String name){
name=name;
}
这样是错误的,如果你非要把参数名和属性名设为一致.可以使用this关键字
Public void setName(String name){
this.name=name;
}
这样就不会出错了;在这里,this就是用来区分属性和参数的,加了this表示属性.
②在上述构造方法中,如果我们可以发现this关键字可以用来调用类中重载的构造方法,具体调用什么方法就由参数来定。比如:
public Student(String name){
//this.name = name;
this(name,1);
}
public Student(String name,int score){
this.name = name ;
this.score = score;
}
如果我们new一个对象时,虽然第一个构造方法传入的是一个name参数,但当我们调用的时候,由于this(name,1)有两个参数,实现的将是第二个构造方法.这里体现了this关键字可以用来调用类中重载的构造方法,我们可以写多个构造方法,具体调用什么方法就由this中的参数来定。
值传递
值传递适用于8大基本类型和String类,具体用法从上述中study方法可以看出:
stu2.study();
int i = 2;
stu2.study(i);
System.out.println("i = "+i);
运行结果是:学分是3,i=2,
这里很好理解,当int将值2赋给学分后,以后学分的变化不会影响到i的值.它传递的是变量中存储的值。把值传递后,那么两个变量就没有任何的关系了。其中一个改变对另一个没有任何的影响。
引用传递(地址传递)
适用于对象类型(引用类型、类类型)
传递方式从上述的例子中可以看到:
stu.setName("张三");
Student stu2 = new Student();
stu2.setName("李四");
// 将stu赋给stu2
stu2 = stu;
//修改stu2的姓名
stu2.setName("王五");
stu.study();
stu2.study();
输出的结果都是王五.我们从下面几点理解:
1.对象名中存储的是对象在内存中的首地址。
2.对象可以有多个对象名的。在上述例子中,通过赋值将对象名stu中的地址拷贝一份存入到另一个对象名stu2中,此时两个对象名存储的地址就相同了,让其中一个对象名stu2修改了对象的属性值后,那么另一个对象名stu的也会跟着改变了(因为指向的是同一个对象)。stu2对象名原来指向的对象,就由Java的垃圾回收机制(Gc)自动销毁对象,释放内存空间。
接口
根据类的继承规则,即使子类中不重写父类的方法,也会调用父类的方法;但在特定的用途上我们要求子类必须重写父类中的方法,这就需要接口,接口也是一种类,只是比较特殊,我们可以用它来丰富类的继承.定义接口的关键字是:interface
接口的格式:
public interface 接口名 extends 接口名,... {
//常量
public static final 数据类型 常量名 = 值;
//抽象方法
public 返回值数据类型 方法名(数据类型 参数名,...);
}
注意:
1.接口中只能定义常量和抽象方法。
2.接口中默认的访问修饰符是public。
3.常量名的每一个字母要全部大写。
4.接口可以继承接口,而且可以同时继承多个接口。
5.接口不能用来实例化对象。
那么接口是怎么实现的呢?我们要用到的关键字是:implements
实现格式:public class 类名 extends 类名 implements 接口名,... {}
需要注意的是当类实现了接口后,那么类必须要实现接口中所有的抽象方法。
抽象类
抽象类是介于综合类和接口的一种特殊类.它的关键字是abstract class.抽象类中定义的方法,如果没有实现,前面就必须加上abstract关键字,即抽象方法.子类继承抽象类时,使用extends关键字,在子类中,必须实现抽象类中的abstract方法.子类只能同时继承一个抽象类,这与接口的implements不同.
直观的看,抽象类介于类与接口之间,可以有实现的,也可以有未实现的方法,抽象类也不能创建对象.