JAVA--创建对象的多种方法、方法重载、方法覆盖

一、创建对象的几种方式

其实对象的初始化就是在创建对象的时候由jvm完成的。对于创建对象,主要是研究创建对象的几种方式。下面一一的解答.这里给出6种方式,面试的时候足够了。但目前掌握第一种就够用了。

1.使用new关键字
2.Class对象的newInstance()方法
3.构造函数对象的newInstance()方法
4.对象反序列化
5.Object对象的clone()方法
6.使用Unsafe类创建对象

(1)使用new关键字
在这里插入图片描述
创建一个对象包含下面两个过程:

1、类构造器完成类初始化(分配内存、赋予默认值)

2、类实例化(赋予给定值)

Test1完成1、2步骤 但是2实例化赋值为空
Test2完成1、2步骤 赋值为java的。。。。
(2)class的newInstance()方法
在这里插入图片描述
首先我们通过Class.forName()动态的加载类的Class对象,

然后通过newInstance()方法获得Test类的对象

(3)构造函数的newInstance()方法
在这里插入图片描述
类Constructor也有newInstance方法,这一点和Class有点像。从它的名字可以看出它与Class的不同,Class是通过类来创建对象,而Constructor则是通过构造器。

(4)序列化
在这里插入图片描述
首先我们要对Test实现Serializable接口。然后开始序列化数据。最后得到反序列化的对象。

(5)clone方式

Object对象中存在clone方法,它的作用是创建一个对象的副本。
在这里插入图片描述
(6)使用Unsafe类创建对象

Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Java官方并不建议使用的,官方文档也几乎没有。Oracle正在计划从Java 9中去掉Unsafe类,如果真是如此影响就太大了。

我们无法直接创建Unsafe对象。这里我们使用反射方法得到
在这里插入图片描述
拿到这个对象后,调用其中的native方法allocateInstance 创建一个对象实例

Object event = unsafe.allocateInstance(Test.class);

二、方法的定义和调用
public class MethodDemo01 { //public定义类
public static void main(String[] args) { //方法的具体语法格式,此处为构造方法,无返回值
int area = getArea(3, 5); // 调用 getArea方法 3*5
System.out.println(" The area is " + area);
}

// 下面定义了一个求矩形面积的方法,接收两个参数,其中x为高,y为宽
public static int getArea(int x, int y) {    //成员方法,返回值为int型
	int **temp** = x * y;    // 使用变量temp记住运算结果
	return **temp**;    // 将变量temp的值返回  
}

}
结果为:
在这里插入图片描述
三、方法的重载

Java允许在一个类中定义多个名称相同的方法,但是参数的类型或个数必须不同,这就是方法的重载。
下面的三个方法互为重载关系

public static int add(int x,int y) {逻辑} //两个整数加法

public static int add(int x,int y,int z) {逻辑} //三个整数加法

public static double add(double x,double y) {逻辑} //两个小数加法

通过方法重载方式进行修改之后代码如下:

public class MethodDemo03 {
public static void main(String[] args) {
// 下面是针对求和方法的调用
int sum1 = add(1, 2);
int sum2 = add(1, 2, 3);
double sum3 = add(1.2, 2.3);
// 下面的代码是打印求和的结果
System.out.println(“sum1=” + sum1);
System.out.println(“sum2=” + sum2);
System.out.println(“sum3=” + sum3);
}

// 下面的方法实现了两个整数相加
**public static int add(int x, int y) {
	return x + y;**
}
// 下面的方法实现了三个整数相加
**public static int add(int x, int y, int z) {
	return x + y + z;**
}
// 下面的方法实现了两个小数相加
**public static double add(double x, double y) {
	return x + y;**
}

}
运行结果与前一个代码运行结果相同。

方法的重载与返回值类型无关,它只有两个条件,一是方法名相同,二是参数个数或参数类型不相同。

四、方法覆盖:
方法覆盖: 父类和子类有相同的方法和参数
public class Parent{ //父类Parent
public void test(){
System.out.println(“这是父类方法”)
}
}
public class Children extends Parent{ //子类Children
public void test(){
System.out.println(“这是子类方法”)
}
}

结果:这是子类方法

构造方法
作用:构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法。
格式: 方法的名字必须和类的名字完全一致。构造方法不允许写返回值类型,void也不能写。命名格式如下
public 类名称(参数类型 参数名称) {
方法体
}
构造方法的使用——用个例子来体会
Person类
public class Person {
private String name;
private int age;

//定义Person类的构造方法
public Person(){
	System.out.println("我是一个空参数的构造方法");
}

}
Test测试类
public class Test {
public static void main(String[] args) {
Person p = new Person();
}
}
打印出来的是这样的~我是一个空参数的构造方法
如何给构造方法赋值
person类
public class Person {
private String name;
private int age;
//定义Person类的构造方法
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}

public void setName(String name) {
	this.name = name;
}

public int getAge() {
	return age;
}

public void setAge(int age) {
	this.age = age;
}

}
Test类
public class Test {
public static void main(String[] args) {
Person p = new Person(“张三”,20);
//对象p调用方法getName,geAge
System.out.println(p.getName());
System.out.println(p.getAge());
}
}
结果:张三
20
构造方法和一般方法的区别
从定义上看:
构造方法的名字必须有固定的格式,不能更改(格式要求在上文)。而其他方法名字可以自己定义,可以有void等等。
从执行上看:
构造方法在对象创建时就已经执行了,而且只执行一次。其他方法可以自己手动调用,想调用几次就调用几次。
[java] view plain copy
class Code {
{
System.out.println(“Code的构造块”);
}
static {
System.out.println(“Code的静态代码块”);
}
public Code() {
System.out.println(“Code的构造方法”);
}
}
public class CodeBlock03 {
{
System.out.println(“CodeBlock03的构造块”);
}
static {
System.out.println(“CodeBlock03的静态代码块”);
}
public CodeBlock03() {
System.out.println(“CodeBlock03的构造方法”);
}
public static void main(String[] args) {
System.out.println(“CodeBlock03的main方法”);
new Code();
new CodeBlock03();
}
}
/* 运行结果:
CodeBlock03的静态代码块
CodeBlock03的main方法
Code的静态代码块
Code的构造块
Code的构造方法
CodeBlock03的构造块
CodeBlock03的构造方法*/

package com.Mubai;

public class ThisDemo {
private String name;
ThisDemo() {
System.out.println(“我是无参构造方法”);
}
ThisDemo(String name) {
//用于构造函数间的相互调用,而且只能放在构造函数的第一行
this();//表示调用本类中的无参构造方法
//如果在构造方法里使用(name=name) ,那么其是赋值给他本身,而不是赋值给类里面的属性name。
this.name = name; // this.name=p1.name:
//这里写这p1是因为p1这个对象在调用这个函数。一句话,谁调用它就在代表谁。
this.method(); //其实就==p1.method
}
public void method() {
System.out.println(“我是构造方法”);
}
public static void main(String[] args) {
ThisDemo p1 = new ThisDemo(“Mubai”);
System.out.println(p1.name);

}

}

//运行结果:
我是无参构造方法
我是构造方法
Mubai

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 覆盖,又称重写或重载,是面向对象编程中的一种重要概念。它指子类对父类中已有的方法进行重新定义,使得子类中的方法能够覆盖父类中的方法,从而实现多态性。 要使用覆盖,需要遵循如下规则: - 方法名、参数列表、返回类型必须完全一致 - 方法的访问权限不能比父类中的方法更严格 - 方法的异常类型不能比父类中的方法更广 覆盖有助于提高代码的复用性和可维护性。 ### 回答2: 面向对象编程中最重要的概念之一是覆盖覆盖发生在两个有继承关系的类之间,其中,子类覆盖了父类中的方法。简单来说,子类中的方法与父类中的方法具有相同的名称和参数列表。 覆盖主要包括三个方面的内容:方法名称、参数列表以及返回类型。在覆盖的过程中,子类可以改变任何一个或多个方面的内容,但只要方法的名称和参数列表相同,就可以进行覆盖覆盖的主要作用是实现多态性。在面向对象编程中,多态指的是同一个方法或同一个类在不同的情况下表现出不同的行为。例如,一个父类有一个run方法,这个方法被多个子类继承并覆盖,这些子类的run方法可以根据不同的需要执行不同的代码,这就是多态性的体现。 需要注意的是,在进行覆盖时,子类的方法访问控制符不能低于父类的方法访问控制符。例如,如果父类的方法是public,那么子类的方法也必须是public,不能是private或protected。 覆盖还有一些注意事项。首先,覆盖必须使用@Override注解,这样可以确保方法签名的正确性。其次,在覆盖过程中,可以使用super关键字调用父类的方法实现,这个功能非常有用。 最后,需要注意的是,覆盖只适用于非静态方法。静态方法不受覆盖影响,因为静态方法是根据类调用,而不是根据对象调用。 总之,覆盖是面向对象编程中非常重要的一个概念。它可以实现多态性,并且可以根据不同的需求调用不同的方法实现。同时,需要注意覆盖的访问控制符、使用@Override注解以及调用父类方法的方式。 ### 回答3: Java中的覆盖指的是在子类中使用相同的方法名称、参数列表和返回类型重新定义父类中已经存在的方法,从而达到替代父类中方法的效果。 父类中的方法被子类覆盖后,当调用子类对象的该方法时,实际上是优先调用子类中的方法,而不是父类中的方法。这就是覆盖的作用。 覆盖也可以称作重写,其实质是子类继承了父类的方法,并重新实现了这些方法,从而强化了子类对这些方法的掌控能力,实现了更加灵活的程序设计。 在将一个方法覆盖时,需要注意以下几点: 1.方法名称、参数列表、返回类型必须与被覆盖方法相同,否则无法实现覆盖。 2.子类中覆盖方法不能比父类中的方法访问级别更严格,例如:如果父类中的方法为public,那么子类中被覆盖方法也必须为public,不能为private或者protected。 3.被覆盖方法不能为final或者static,因为final的方法不能被重新定义,而static的方法不属于任何对象,不能被继承。 在实际程序设计中,也需要注意覆盖的使用方式。例如,当父类中的方法覆盖时,子类中的方法可以根据需要选择是完全重写父类中的方法,还是在父类方法的基础上增加新功能。同时,在使用super关键字调用父类中被覆盖方法时,需要注意调用的方式和位置,避免出现死循环或者错误的调用结果。 总的来说,覆盖Java中一个重要的特性,它使得程序设计更加灵活,同时也需要程序员在设计时根据实际需要合理使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值