Java面向对象的三要素:封装,继承,多态;
类的三要素:属性,方法,构造器;
格式为:权限修饰符 类名(形参){},其中类名一定要与本类同名;
1.创建对象;
2.给对象的属性赋值;
1.设置类的时候若不显示设置构造器,系统会自动提供一个空参的构造器;
2.一旦显示的设置了一个构造器,系统默认的构造器将会失效;
3.类的多个构造器构成重载;
代码:
public class Main {
public static void main(String[] args)
{
Person age=new Person(1,2,3,4,5,6,8,9,10,11);
System.out.println(age.getAge());
}
}
class Person{
private int a;
public Person(int...arg) //自定的构造器,这里直接用可变个数的形参来表示重载;
{ int sum=0;
for (int i = 0; i <arg.length ; i++) {
sum+=arg[i];//使用方法还是和数组一样;
}
a=sum;
}
public int getAge()
{
return a;
}
}
应我为数不多的关注者的响应,在这里补上this关键字的用法以及一些事项;
1.用途:可以用来修饰方法、属性、构造器;
2.用法:this.对象 以及 this(形参);
3.作用:(1)用于在类中处理构造器以及方法中形参和对象的属性(成员变量)重名;
(2)用于在构造器中调用与该构造器构成重载的其它构造器(仅限于构造器中使用);
4.注意:this(形参)的用法在构造器中必须写在第一行,并且一个构造器最多写一个this(形参)
用简单的代码来说明具体的用法:
代码一(this.对象的用法):
首先,写这样一段代码;
public class Main {
public static void main(String[] args) {
Zoom dog =new Zoom("小白",5);
dog.getZoom();
}
}
class Zoom
{ private String name;
private int age;
public Zoom(String name,int age){
name=name;//需要注意的是这里方法的属性和实参重名了,但是没有报错,输出的结果是默认值,原因也很明朗,系统分不清那个name是属性那个name是实参;
age=age;//同理
}
public void getZoom(){
System.out.println("名字:"+name+" 年龄:"+age);
}
}
public Zoom(String name,int age){
this.name=name;
this.age=age;
}
结果:
很明显,赋值成功了,这样就说明了this的第一个用法——用来指明该变量名为该类下的属性。当然,在名字不重复的情况下,this是默认省略的。
代码二(this(形参)的用法):
public class Main {
public static void main(String[] args) {
Zoom dog =new Zoom("小白",5,1002);
dog.getZoom();
}
}
class Zoom
{ private String name;
private int age;
private int id;
public Zoom(int id)
{ System.out.println("使用了我");
this.id=id;
}
public Zoom(String name,int age,int id){
this(id);//此处调用了第一个构造器
this.name=name;
this.age=age;
}
public void getZoom(){
System.out.println("名字:"+name+" 年龄:"+age+" 编号:"+id);
}
}
这里将输出的结果作一下分析,并体会this(具体注意用法)
1.很明显,this起到了调用的效果,
优点:如果出现多个构造器对一个特定的属性赋相同的值,那么完全可以使用this优化代码,起到共用的机制;
2.刚刚试了一下,如果想在N个构造器之间使用this,那么最多只能用N-1次,否则会出现死循环;
3.对于主构造器没有的属性,不能用this调用别的构造器内的该属性;
public Zoom(int id)
{
this.id=id;
}
public Zoom(String name,int age){
this(id);//here!!
this.name=name;
this.age=age;
}
输出会报错
这个原因也不难理解,构造器的参数不符合调用的参数,所以说,这个方法仅仅可以做调用和改值,并不能完全取代赋值;
当然,赋值的操作也不仅仅只限于用构造器吧~~~~
2020年2月15日,第一次修改