Java入门(二十)
类与对象的关系
类是一种抽象的数据类型,他可以将一类事物共性抽象出来。他不能代表某一个具体的事物
动物、植物、手机、电脑 Person类、Pet类、Car类
张三是人的一个具体实例,张三家里的旺财就是狗的一个具体事例。狗也是一个具体的实例。 具体的对象能体现具体的特性,展示出功能的是具体的实例,而不是一个抽象的概念。类是对象的模板。
如何创建对象?用new关键字,new创建时会分配内存的空间和默认的对象。 从现在起养成一个习惯,不要在每个类里面都创建一个main方法,这样子是不好的。一个程序应该只有一个主启动类。 我们在这可以定义一个大的启动类或者测试类。定义一个Application类,作为入口
package base.oop.demo02;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
}
}
public class Student {
//属性: 字段
String name;
int age;
//方法
public void study(){
System.out.println(this.name+"学生在学习"); // this代表当前这个类
}
}
那么我们现在要把这个类实例化出来,类是抽象的,需要实例化。类实例化后会返回自己的对象。student对象就是Student类具体的实例。比如我产生了两个Student的类,一个是小明,一个是小红
package base.oop.demo02;
//一个项目应该只存在一个main方法
public class Application {
public static void main(String[] args) {
Student student = new Student();
Student xiaoming = new Student();
Student xiaohong = new Student();
}
}
同一个类可以产生不同的对象,但是他们都有共同的特性,他们肯定都有name、age。比如我们现在输出xiaoming.name,看看能不能输出东西 现在name没有赋任何值,所以是null。使用new创建对象的时候,除了分配空间,还会创建的对象给初始化以及对类中的构造进行调用。比如String name在没有初始化之前就是null的。int age默认是0. 而你不能再Student类里面直接把name写死为xiaoming,那么所有的学生名字都会被叫做xiaoming。比如我们现在赋值 可以看到赋值成功了,和正常的赋值时一模一样的。小明有名字了。那么小明有名字,小红有吗? 类是一个抽象的模板,而我们可以通过new关键词创建不一样的实例,虽然都是new Student,但是new完之后就变成具体的实例了。相当于把世界想象成程序,那么所有人他都是一个模板。比如一个Person类,他都会有身高、体重、年龄。 面向对象编程本质是:以类的方式组织代码,以对象的方式组织(封装)数据。
构造器
我们造一个最简单的构造器,比如Person。我们要new这个Person的时候他会调一个方法即时Person里面什么都没写,但他依旧能new出一个方法,就说明他存在一个空的Person的方法。 然后就有public Person(){}这样一个东西,就是一个空的构造,虽然我们没写但是他也能调用出来。所以他里面肯定有什么默认的东西 我们就这样运行这个项目看看,他在java运行之后会生成一个class文件,我们去class文件里面看看。先打开项目结构 可以看到他默认帮我们加了一个方法,而且这个方法没有返回值。他这个方法跟类名相同,这就是一个构造器。 一个类即使什么都不写,他也会存在一个构造器。这个public的方法就是一个构造方法。构造方法的特点是,必须和类的名字相同。第二必须没有返回值类型,也不能写void。 我们可以显式地定义构造方法,这就是一个无参构造。
public class Person {
public Person(){
}
}
无参构造可以给我们初始化一些信息。现在这个name应该是一个null 构造器第一个作用就是可以初始化一些值,就是他在new的时候他会进入这个方法。比如 this.name=“qinjiang”,这个时候他就不是null而是qinjiang了 那么我们再来断点调试一下 到了下一步变成了null 走完qinjiang之后,this.name变成了秦疆了 然后构造器走完了,这句话才生成对象 构造器核心的作用
使用new关键字的时候,必须要有构造器,否则会报错。new 对象的时候本质还是调用构造器。
我们来写个有参构造。this.name = name 代表 String name传递下来的name。this.name代表对象本身的name。一旦定义了有参构造,无参构造就必须显示定义。否则无效。
public Person(String name){
this.name = name;
}
假如把右边无参定义删掉,左边就报错了 跑一下程序看报错,看到是没有参数。 我们尝试传一个值,传了之后肯定会走某个方法,因为他也是调方法的。通过new关键词来调用方法。
Person person = new Person("kuangshen");
打个断点来跑一下 这个地方直接跑到了有参构造,自动根据参数来判断,因为方法是可以重载的。
构造器一般是用来初始化值
alt + insert 会生成构造器 (windows) ,ctrl + enter(mac) 上面生成的是有参的,那么怎么生成无参的呢?用 select none 总结: 1 构造器和类名相同 2 没有返回值 作用: 1 new 本质在调用构造方法 2 初始化对象的值 注意点: 1 定义了有参构造,如果使用无参构造,必须显式定义无参构造