JAVASE基础07

01-面向对象(构造函数-概述)

在这里插入图片描述
构造函数是一种特殊的函数,比如写了一个Person类,

class Person
{
private String name;
private int age;
//定义一个Person类的构造函数。
Person()//构造函数,而且是空参数的。
{

}

}
Person()就是Person类的构造函数,可以看到函数名称跟类名一样且没有返回值。
在创建对象Person代码如下:
Person p = new Person();
注意:这里不是说Person()构造函数返回一个对象实例,构造函数没有返回值,而且开发人员不能直接调用Person拿到实例,构造函数给系统调用的,new关键字的作用时开辟一个某类型的空间,并且放回该空间的地址,而决定所开辟空间的类型就是new后面的构造函数。

02-面向对象(构造函数-默认构造函数)

构造函数的作用就是给对象初始化。而且创建对象必须通过构造函数初始化。
一个类中如果没有定义过构造函数,那么该类中会有一个默认的空参数构造函数。
如果在类中定义了指定的构造函数,那么类中的默认构造函数就没有

03-面向对象(构造函数-构造函数和一般函数的区别)

构造函数:对象创建时,就会调用与之对应的构造函数,对对象进行初始化。
一般函数:对象创建后,需要函数功能时才调用。

构造函数:对象创建时,会调用只调用一次。
一般函数:对象创建后,可以被调用多次。

04-面向对象(构造函数-重载)

思考一个问题:什么时候定义构造函数呢?
在描述事物时,该事物一存在就具备的一些内容,这些内容都定义在构造函数中。
比如希望在创建Person对象时默认名字为baby,年龄为1,我们可以这样定义构造函数。
Person()
{

	name = "baby";
	age = 1;
}

或者出生时名字已知,我们需要通过一个name参数来初始化对象。
//如果有的孩子一出生就有名字。
Person(String n)
{
name = n;
}
又或者,想创建一个已知姓名和年龄的对象
Person(String n,int a)
{
name = n;
age = a;
}
这些不同的情况,我们可重载多些不同的构造函数

05-面向对象(构造函数-内存图解)

class Person
{
private String name;
private int age;

//定义一个Person类的构造函数。
Person()//构造函数,而且是空参数的。
{
	
	name = "baby";
	age = 1;
	System.out.println("person run");

}


//如果有的孩子一出生就有名字。
Person(String n)
{
	name = n;
}


public void setName(String n)
{
	name = n;	
}

Person(String n,int a)
{
	name = n;
	age = a;		
}

public void speak()
{
	System.out.println(name+":"+age);
}

}
看下面代码:
public static void main(String[] args)
{
Person p2 = new Person(“小强”,10);
p2.speak();}
main方法压栈后,之后有创建Person类引用变量p2,new关键字,在堆中开辟一个空间初始化person实例后返回该对象地址,这时候构造函数进栈,将“先强“和10分别赋值。然后构造函数出栈,p2赋值上该对象的地址。在这里插入图片描述

在这里插入图片描述

06-面向对象(构造函数-细节)

构造函数的功能就是给对象初始化,也可以执行一些输出语句这样的公共方法。
但在构造函数里面不能直接使用speak方法。因为该方法属于Person类的,要使用它首先的有一个Person对象。构造函数中是有return语句的,当执行到return时,构造函数出栈。

07-面向对象(this关键字-使用场景一&this的原理图解)

在这里插入图片描述
当成员变量和局部变量重名,可以用关键字this来区分。

this : 代表对象。代表哪个对象呢?当前对象。
this就是所在函数所属对象的引用。
简单说:哪个对象调用了this所在的函数,this就代表哪个对象。

08-面向对象(this关键字-使用场景二以及细节)

在这里插入图片描述
当Person(name,age)进栈后,在堆内存开辟号的实例地址就自动赋予给Person(name,age)方法的this成员,而且显示地还有一个name和age成员,this代表当前对象的引用。然后到this(name)时,代表执行当前对象的person(name)构造方法,这时person(name)进栈,并且将Person(name,age)里面的name成员赋值给person(name)里面的name成员,所以他们的值都为“旺财”
在这里插入图片描述

this也可以用于在构造函数中调用其他构造函数。
注意:只能定义在构造函数的第一行。因为初始化动作要先执行。

09-面向对象(this关键字-应用)

除了在set get方法里面区别成员变量和局部变量重名的情况,我们也可以将this用于比较场景,比如添加一个方法比较两个对象是否是同龄人:
public boolean compare(Person p)
{
/*
if(this.agep.age)
return true;
else
return false;
*/
return this.age
p.age;
}

10-面向对象(static关键字-数据共享)

在这里插入图片描述
用static修饰的成员,被所以对象共享,比如设计的一个Person类,如果里面的String类型变量name被static修饰后,该变量就会被所有对象共享,能被对象调用,还能被类名调用,两个·对象操作该变量时是共享的,根据最后操作的结果更新。

11-面向对象(static关键字-特点)

static的特点:
1,static是一个修饰符,用于修饰成员。
2,static修饰的成员被所有的对象所共享。
3,static优先于对象存在,因为static的成员随着类的加载就已经存在了。
4,static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。
5,static修饰的数据是共享数据,对象中的存储的是特有数据。

12-面向对象(static关键字-成员变量和静态变量的区别)

成员变量和静态变量的区别?
1,两个变量的生命周期不同。
成员变量随着对象的创建而存在,随着对象的被回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。

2,调用方式不同。
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。

3,别名不同。
成员变量也称为实例变量。
静态变量称为类变量。

4,数据存储位置不同。
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据.
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据.

13-面向对象(static关键字-注意事项)

class Person
{
String name;//成员变量,实例变量
static String country = “CN”;//静态变量。类变量
public static void show()
{
System.out.println(country+":"+name);
}
}
这个类编译不会通过,因为show方法为静态方法,随着类的加载就已经加载了,里面的输出语句里包括非静态的变量name,因为编译这个类的时候还没有任何该类对象的存在,而name成员属于对象的.所以这时候它自然还没错在,编译不通过。还有一些注意事项:
1,静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
2,静态方法中不可以使用this或者super关键字。
3,主函数是静态的
同样的道理下面的类编译也不通过:
class StaticDemo
{
int num = 4;
public static void main(String[] args)
{
show();
}

public void show()
{
	System.out.println(num);
}

}
原因是无法在静态的主函数里面调用非静态的方法show。给show添加上static关键字后还是会报错无法在静态的上下文引用非静态的变量,还需要用static修饰num,又或者使用new StaticDemo().show()匿名对象的方式调用show方法。

14-面向对象(static关键字-main函数解析)

主函数特殊之处:
1,格式是固定的。
2,被jvm所识别和调用。

public:因为权限必须是最大的。
static:不需要对象的,直接用主函数所属类名调用即可。
void:主函数没有具体的返回值。
main:函数名,不是关键字,只是一个jvm识别的固定的名字。
String[] args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值