技术文章-类和对象与构造方法
1.Java是一门面向对象的编程语言,所谓面向对象,就是主张在程序编译中的一切皆为对象,程序用人的思维解决问题。面向对象编程就是在模拟现实生活。
面向对象的程序都是由类组成的,所以类与对象是面向对象编程的基础核心。类也是Java中最基本的单位。
而面向对象编程的首要目标就是了解需求中有哪些对象:
对象的定义:一个具体的事物就是一个对象。
生活中的例子:具体的某一台电脑、某一部手机。
了解到需要的对象以后,怎样去描述这个对象?
例如:
针对某一台电脑,我们可以用该电脑有哪些外部特征(颜色、尺寸、CPU、显卡等等),还可以描述这台电脑具体可以用来做什么(开机、关机、调节音量等等)。
综上,可以从特征、功能这两方面来描述一台电脑。
2.类
定义:类就是拥有与相似特征与功能的对象的集合。
所以,我们可以用特征、功能这两方面来描述一个类。
描述类的特征叫属性,描述类的功能叫方法。
Java中定义类的格式:
public class 类名 {
//属性的格式
public 数据类型 属性名;
//方法的格式
public 返回值类型 方法名(数据类型 参数名,...){
}
}
类是拥有与相似特征与功能的对象的集合,所以类不是具体的,而是抽象的,类好比就是模板,我们想要使用一个对象,只能化用而不能直接使用模板。
所以在Java中,想要使用一个对象,就必须先实例化对象。
实例化对象的关键字:new
格式:
类名 对象名 = new 类名();
如此实例化以后,就可以使用具体对象中的属性与方法了。
调用对象中属性和方法的格式:
对象名.属性名
对象名.方法名(参数值,...);
例子:定义一个学生类,里面包含姓名、学分属性,包含有学习、游戏方法。在Manager类中定义主函数并赋值属性,调用两种方法。
class Student{
private String name;
private int scro=0;
public void setName(String n){
name=n;
}
public void study(){
scro++;
System.out.println(name+"学习中!");
}
public void play(){
scro--;
System.out.printlin(name+"正在游戏中!");
}
}
public class Manager{
public static void main(Srting args[]){
Student st1=new Student();
st1.setName("BillGates");
st1.study();
Student st2=new Student();
st1.setName("Jobs");
st1.study();
for(int i=0;i<5;i++){
st2.study();
}
st2.play();
}
}
由此可见,想要使用一个对象,必须首先实例化对象:
Student st1=new Student();
Student st2=new Student();
3.实例化对象的实际分析
实例化对象的格式如下:
类名 对象名 = new 类名();
实际上“=”后的“类名()”是一个构造方法。所以真正的实例化对象格式如下:
类名 对象名 = new 构造方法名(参数值,...);
4.构造方法
一个类中的方法可以大体分为两类——普通方法与构造方法。
普通方法书写格式:
访问修饰符 返回值类型 方法名(数据类型 参数名,...){
}
构造方法书写格式:
访问修饰符 构造方法名[类名](数据类型 参数名,...){
}
由上可以发现,就书写格式而言构造方法和普通方法的区别是:
1.方法名不同:
构造方法的方法名必须与类名相同,而普通方法的方法名没有这个要求。
2.返回值不同
构造方法不写返回值,而普通方法要注明返回值类型,如果没有返回值还是要写void。
普通方法的用途:
(1)用来提供模板以实现具体对象里的行为。
构造方法的用途:
(1)用来实例化对象(由上面实例化对象的例子可以说明);
(2)用来初始化属性值:
People类中:
public People(String name){
this.name =name;
}
主函数中:
People stu= new People("张三");
以上代码实现可以发现,stu对象中name属性拥有初始化了初始化值“张三”。
构造方法的注意事项:
(1)构造方法是不能定义返回值类型;
(2)构造方法的名字必须要和类名完全一致;
(3)如果类中没有定义构造方法,Java会默认给你提供一个无参数的构造方法。
针对(3)的说明:
定义一个People类:
public class People{
……
}
类中没有定义构造方法。
现在在主函数中实例化对象:
People stu = new People();
主函数中实例化stu对象,调用了People()这个People类的构造方法。程序没有报错,所以可以发现People类中程序自带了一个People()构造方法。
但是如果在People类中定义了一个含参数的构造方法:
public class People{
public People(String name){
this.name =name;
}
}
在People类中定义含有name参数的构造方法。
主函数中调用:
People stu = new People();
People()会报错,因为People类中已经定义过含参构造方法public People(String name),所以系统不会再自带People()方法。此时调用必须按照类中定义构造方法的格式:
People stu= new People("张三");
加入String参数“张三”。
5.方法的重载
在生活中可能遇见这样的例子:一个人搭乘交通工具从A地前往B地,可能搭乘出租车,也可能搭乘公交车。搭乘的方法都可以抽象为把人从A地送往B地,但是具体的工具出租车与公交车类型不同。
面对这样的情况,在Java中可以用方法重载可以解决。
首先,从上面那个例子可以得出,想要使用方法重载的条件是:
(1)方法名完全一致;(都是搭乘交通工具从A到B)
(2)方法所带的参数不同(参数个数,参数类型,参数顺序)。(车辆的类型不同)
在什么情况下用方法重载?
构造方法:
初始化初始值不同的对象。
例如,在People类中重载多种构造方法:
public People(){
}
public People(String name){
this.name =name;
}
在主函数中实例化对象:
People stu1 = new People();
People stu2 = new People("张三");
都不会报错,即实现了初始化不同值的对象。
普通方法:
需要调用参数不同的同种方法体的方法,People类中:
protected void study() {
score++;
System.out.println(name + "在学习中,学分是" + score);
}
public int study(String str) {
System.out.println(name+"在学习"+str+"中");
return 0;
}
在主函数中可以调用:
stu1.study();
stu2.study("Java");
含有参数和没含参数的同种方法,实现不同的运行结果。
而方法重载的调用,会根据你给予的参数来决定。
6.this关键字
当使用Java编程时,会遇到这样的情况:
public People(String name,int score){
name = name;
score = score;
}
方法中带有参数,但是参数的名字恰好与类中定义的属性名相同。Java会采用就近原则,默认都当做是参数,所以编程时需要来区分它们,上this.就可以表示是属性,没有加的则表示参数。如:
public People(String name,int score){
this.name = name;
this.score = score;
}
This关键字的特殊用法:
People类中定义两个构造方法:
public People(){
this("无名");
}
public People(String name){
this.name =name;
}
主函数中实例化对象:
People stu = new People();
结果发现,运行结果stu对象的默认name为“无名”。
观察以上例子可以发现:
this(参数值,...);
实则是调用带对应参数的构造方法。防止用户在实例化对象时忘记给属性设置初始值。
注意:this关键字表示的是当前对象。