面向对象01-java基础

一、thissuper的异同:

1)super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句) 

2)this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

3)super:: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名    super.成员函数据名(实参)

4)this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

6super()this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

7super()this()均需放在构造方法内第一行。

8)尽管可以用this调用一个构造器,但却不能调用两个。

9thissuper不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

10this()super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

11)从本质上讲,this是一个指向本对象的指针然而super是一个Java关键字。

二:递归:

递归:对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。 
关键要抓住的是: 
1)递归出口 
2)地推逐步向出口逼近 
eg:

public class Demo04 {

public static void main(String[] args){

int n = 5;

long m = demo(n);

System.out.println(n + "!=" + m);

}

public static long demo(int n){

long value = 0;

if(n == 1){

value = 1;

}else{

value = n * demo(n-1);

}

return value;

}

}

三、值传递和引用传递

我看了好多资料,来了解值传递和引用传递,我总结的最终是:值传递就是一种值得复制

1:按值传递是什么
指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:

public class TempTest {
private void test1(int a){
//做点事情
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//这里传递的参数a就是按值传递
}
}

按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
示例如下:

public class TempTest {
private void test1(int a){
a = 5;
System.out.println("test1方法中的a==="+a);
}
public static void main(String[] args) {
TempTest t = new TempTest();
int a = 3;
t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
System.out.println(main方法中的a===+a);
}
}

运行结果是:
test1方法中的a===5
main方法中的a===3

2:按引用传递是什么
指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
示例如下:

public class TempTest {
private void test1(A a){

}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
t.test1(a); //这里传递的参数a就是按引用传递
}
}
class A{
public int age = 0;
}

3:按引用传递的重要特点
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
示例如下:

1行 public class TempTest {
2行 private void test1(A a){
3行 a.age = 20;
4行 System.out.println("test1方法中的age="+a.age);
5行 }
6行 public static void main(String[] args) {
7行 TempTest t = new TempTest();
8行 A a = new A();
9行 a.age = 10;
10行 t.test1(a);
11行 System.out.println(main方法中的age=+a.age);
12行 }
13行 }
14行 class A{
15行 public int age = 0;
16行 }

运行结果如下:
test1方法中的age=20
main方法中的age=20

4:理解按引用传递的过程——内存分配示意图
要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
用上面的例子来进行分析:
1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:

2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:

3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

内存分配示意如下:

由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:


也就是说:是两个变量都指向同一个空间。

4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:

此时A实例的age值的变化是由test1方法引起的

5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20
6):运行第11行,根据此时的内存示意图,输出main方法中的age=20

5:对上述例子的改变
理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:


1行 public class TempTest {
2行 private void test1(A a){
3行 a = new A();//新加的一行
4行 a.age = 20;
5行 System.out.println("test1方法中的age="+a.age);
6行 }
7行 public static void main(String[] args) {
8行 TempTest t = new TempTest();
9行 A a = new A();
10行 a.age = 10;
11行 t.test1(a);
12行 System.out.println(main方法中的age=+a.age);
13行 }
14}
15class A{
16行 public int age = 0;
17}

运行结果为:
test1方法中的age=20
main方法中的age=10

为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下

6:再次理解按引用传递
1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:

2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:

3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。

内存分配示意如下:

由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:

也就是说:是两个变量都指向同一个空间。

4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:

5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:

注意:这个时候test1方法中的变量aage被改变,而main方法中的是没有改变的。

6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20
7):运行第12行,根据此时的内存示意图,输出main方法中的age=10

7:说明
1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = Java私塾”;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: JMU Java 03面向对象基础-01-构造函数和toString方法。 构造函数是一种特殊的方法,在创建对象时自动调用,用于初始化对象的状态。 toString方法是Java中的一个方法,它可以返回对象的字符串表示形式,方便调试和打印输出。 ### 回答2: 构造函数和toString()是Java语言中的两个重要概念,它们是面向对象编程中的基础知识。本文将从以下几个方面来回答该问题: 一、构造函数 构造函数是一种特殊的方法,用于创建对象并初始化该对象的属性。一个可以有多个构造函数,每个构造函数可以接受不同的参数,从而实现不同的对象初始化方式。在Java中,构造函数的名称与名称相同,它没有任何返回值,包括void。 有两种型的构造函数,即默认构造函数和带参数构造函数。默认构造函数没有任何参数,Java会自动为每个提供一个默认的构造函数,它会执行以下操作: 1、初始化属性。 2、如果继承自其他,则会自动调用父的构造函数。 如果一个定义了带参数构造函数,则默认构造函数就不再自动提供。带参数构造函数可以自定义对象的初始化方式,提供不同的参数初始化对象的属性。带参数构造函数的声明格式为: public 名(参数列表){ } 二、ToString()方法 toString()是对象中的一个方法,它返回一个表示该对象的字符串。通常情况下,该字符串包括了对象的名和属性值,以便于在需要时打印对象信息。 在Java中,如果没有显式地定义toString()方法,则默认使用Object中的默认方法,该方法返回一个格式为“名@哈希值”的字符串。但通常情况下,我们需要重新定义toString()方法,以便获取对象的更详细的信息,比如对象的属性。 对象中重写toString()方法的格式如下: public String toString(){ } 值得注意的是,toString()方法可以被覆盖或者重新定义,但它必须返回一个字符串对象,否则将会出现编译错误。 结论: 构造函数和toString()是Java面向对象编程中的两个基本概念,这两者的作用分别是为对象初始化和展示对象信息。在实际工作中,我们需要充分理解这两个概念的含义和用途,从而更好的利用Java面向对象编程方式。 ### 回答3: Java是一门面向对象的语言,构造函数和toString面向对象编程中常用的两种方法之一。构造函数是用于创建对象的特殊方法,它可以在创建新对象时执行必要的初始化操作。而toString方法则是将对象转化为指定格式的字符串。在Java开发中,学习和熟练使用构造函数和toString方法对于编写高效,易于维护且易于阅读的代码非常重要。 首先,构造函数是一个的特殊方法,它与同名,并且不需要显式调用。当我们创建一个新对象时,构造函数被自动调用。在构造函数中,通常会执行一些初始化操作,如为对象的属性赋初始值。构造函数可以根据参数列表的不同,有多个重载版本。这样,我们可以根据需要以不同的方式创建对象,并且可以灵活地控制对象的初始化过程。 其次,toString方法是将对象转化为字符串的常用方法之一。它通常在输出对象时调用,将对象的属性转化为字符串并输出。在自定义中,我们可以自己实现toString方法来控制对象转换成字符串的格式。对于调试和日志记录等任务,toString方法非常有用。它可以方便地将对象的状态输出到控制台或日志文件中,便于我们了解程序的运行状态和调试程序。 在使用构造函数和toString方法时,我们需要注意一些问题。首先,构造函数应该执行必要的初始化操作,但不应该执行过多的计算或IO操作。因为构造函数执行的时间可能很长,这会导致性能问题。其次,toString方法应该返回一个稳定的字符串。这样,我们在不同的场景下输出这个对象时,可以获得相同的输出。最后,我们需要为自己的实现好构造函数和toString方法,以方便其他人阅读、使用和理解我们的代码。 总的来说,构造函数和toString方法是Java面向对象编程中重要的基础知识。它们是我们创建和操作对象不可或缺的工具。通过熟练掌握这两个方法,我们可以写出更加健壮和易于维护的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值