Java基础知识问答

1.什么是空参(无参)构造方法,什么是(显示)有参构造方法?

无参构造方法又分为隐式无参构造方法和显示无参构造方法。

隐式无参构造方法

在定义类的时候,如果没有给类定义一个构造方法,Java编译器在编译时会默认提供一个隐式的构造方法,它没有任何参数,并且有一个空的方法体。

显式无参构造方法

隐式无参构造方法是由系统提供的,无法修改其内容。但有时需要在调用这个构造方法时初始化类成员属性或执行一些操作,要实现这个需求,就需要为它定义一个显式无参构造方法

显示有参构造方法

构造并初始化对象是构造方法的作用,所以有时需要给这个方法传入一些参数,定义一个显示的有参构造方法,

很好理解,看下例子就行了

public class MyClass {
    private int m;    // 定义私有变量
    MyClass() {
        // 定义无参的构造方法
        m = 0;
    }
    MyClass(int m) {
        // 定义有参的构造方法
        this.m = m;
    }
}

注意:

以下引用块来自c语言中文网 网页链接:http://c.biancheng.net/view/976.html

Java 构造方法有以下特点

  • 方法名必须与类名相同
  • 可以有 0 个、1 个或多个参数
  • 没有任何返回值,包括 void
  • 默认返回类型就是对象类型本身
  • 只能与 new 运算符结合使用,每次创建一个对象,重载一次构造方法

值得注意的是,如果为构造方法定义了返回值类型或使用 void 声明构造方法没有返回值,编译时不会出错,但 Java 会把这个所谓的构造方法当成普通方法来处理。

这时候大家可能会产生疑问,构造方法不是没有返回值吗?

为什么不能用 void 声明呢?

简单的说,这是 Java 的语法规定。实际上,类的构造方法是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。

注意:构造方法不能被 static、final、synchronized、abstract 和 native(类似于 abstract)修饰。构造方法用于初始化一个新对象,所以用 static 修饰没有意义。构造方法不能被子类继承,所以用 final 和 abstract 修饰没有意义。多个线程不会同时创建内存地址相同的同一个对象,所以用 synchronized 修饰没有必要。

2.java里面为什么要有构造方法?

使用构造方法的好处是可以在对象初始的时候就对某些变量赋值等操作,大大的减少 了代码量 ,

构造方法作用就是对类进行初始化。

如果你没有定议任何构造方法的形式,程序会为你取一个不带任何参数的构造函数,那么你产生类的对象时只能用不带参数的方法

Student s=new Student('zhangshan',15,'man'); 这是使用构造方法之后的, 在创建对象时就可以“一步到位”的设置好属性值 。

3.JAVA中构造方法私有化的作用是什么?(回答来自百度知道 --莫道無情)

将一个类的构造函数私有化,可以使得该类不被实例化,和不能被继承。要创建这个类的实例,唯一的办法是提供一个公共静态方法。这种方式被称为单例模式。

私有化代码示例如下:

package test;`

class Some{`

 `private Some(){}`

 `public static void dosome(){`

    `System.out.println("dnali");`

 `}`

}`

public class Singeleton {`

 `public static void main(String[] args) {`

    //Some s=new Some();                          无法实例化Some的对象`

    `Some.dosome();`

 `}`

}`


4.this 关键字是用来干嘛的?

我们定义变量的时候要做到见名知意,变量不规范,亲人两行泪!!!!**

比如: 我们在写一个构造方法时, 括号里面的形参我们不能写成和Student类中的属性值(成员变量)名称相同,

(为什么不能相同,相同之后name=name,自己给自己赋值,这个name的优先级比Student中成员变量中的name优先级高),所以我们写成了如下的形式

public Student (String n, int a,String i,char g,int r){

    name=n;

    age=a;

    id=i;

    gender=g;

    rank=r;

}

但是写成这样之后我们发现这样代码的可读性实在太差漏了,我们无法一眼得知n,a,i,g,r这几个变量具体代表什么含义

那我们怎么既做到见名知意又要做到区分成员变量和参数,用this访问成员变量,

改完之后就是这个样子

public Student (String name, int age,String id,char gender,int rank){

    this.name=name;

    this.age=age;

    this.id=id;

    this.gender=gender;

    this.rank=rank;

}

是不是舒服多了

this总结:

当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。

因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。

1、 使用this来区分当前对象。

Java中为解决变量的命名冲突和不确定性问题,引入关键字this代表其所在方法的当前对象的引用:

  1. 构造方法中指该构造器所创建的新对象;
  2. 方法中指调用该方法的对象;
  3. 在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。

​ this只能用在构造器或者方法中,用于获得调用当前的构造器方法的对象引用。可以和任何的对象引用一样来处理这个this对象。

说明:

(1)当实例变量和局部变量重名,JAVA平台会按照先局部变量、后实例变量的顺序寻找。即,方法中使用到的变量的寻找规律是先找局部变量,再找实例变量。如果没用找到,将会有一个编译错误而无法通过编译。

(2)如果使用this.a,则不会在方法(局部变量)中寻找变量a,而是直接去实例变量中去寻找,如果寻找不到,则会有一个编译错误。

(3)在一个方法内,如果没有出现局部变量和实例变量重名的情况下,是否使用this关键字是没有区别的。

(4)在同一个类中,Java普通方法的互相调用可以省略this+点号,而直接使用方法名+参数。因为Java编译器会帮我们加上。

2、 在构造器中使用this来调用对象本身的其他构造器

在构造器中使用this([args_list]);可以调用对象本身的其他的构造器。直接使用this()加上类构造器所需要的参数。就可以调用类本身的其他构造器了。如果类中有多个其他构造器定义,系统将自动根据this()中的参数个数和类型来找出类中相匹配的构造器。

注意: 在构造器中可以通过this()方式来调用其他的构造器。但在一个构造器中最多只能调用一个其他的构造器。并且,对其他构造器的调用动作必须放在构造器的起始处(也就是构造器的首行),否则编译的时候将会出现错误,另外不能在构造器以外的地方以这种方式调用构造器。

3、 this关键字还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this来返回某个类的引用。此时,这个this关键字就代表类的名称。

5.什么时候要用private?

private是访问控制修饰符,用来使用访问控制符来保护对类、变量、方法和构造方法的访问。

在程序中需要隐藏类的实现细节和保护类的数据时,就要使用private来修饰。

一般情况下我们会把类里面的属性都私有化,提高容错,防止属性值轻易被修改

那么当我们想要操作这些变量时该怎么怎么办呢??

通过set、get方法

set是设置,而get是获取(访问),这两个方法是对数据进行设置获取用的。而且,在类中使用set和get方法时,都是在set和get后面跟上一些特定的词来形成特定意思的方法名,比如set xxx()和get xxx(),表示设置xxx和获取xxx。

get方法里面一般写个return,而set方法则要把需要修改的参数传进来,并且用this关键字来访问成员变量并作出修改,提供set方法的时候需要谨慎,确定是否要给外界提供set方法

从私有化到给外界提供set、 get方法,这就提现了面向对象的三大特性之一 ----------- 封装性

static关键字

可以修饰成员变量和成员方法

可以通过类和对象来调用(调用的是同一个)

修饰成员变量表示静态变量,静态变量是所有对象公用的,在内存中只占有一份内存

修饰成员方法表示静态方法,静态方法里面只能访问静态变量,不能访问非静态变量

main方法就是静态方法

static 随着类的加载而加载,优先于对象存在,所有对象共享(可以通过对象或者类来访问)

6.为什么要用static,什么时候用static?

有时候我们并不想去new一个对象,只是单纯的想要调用一个函数,并且希望这个函数不会与包含它的类的其他对象有所关联。说得通俗点,即使没有创建对象,也能通过类本身来调用函数

在使用一些工具类的时候,一般设置成static方法,方便调用

把工具类的构造方法私有化,就不能实例化出一个对象来使用工具类里的方法了,防止别人使用麻烦的方法来使用我们的工具类

静态方法方便系统调用,那为什么不全用static方法呢?

这个问题回答得不好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。