java面向对象编程(2)

46 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

类的成员

成员变量/属性/字段

在类中, 但是方法外部定义的变量, 这样的变量我们称为 "字段" 或 "属性" 或 "成员变量"(三种称呼都可以, 一般不会严格区分)。

就是说成员变量/属性/字段,在类中在方法外部上方。

class Animal {
		//name,age都是成员变量
    public String name; 
    public int age;
    public void eat(){
        System.out.println(name+"::eat()");
    }
}

注意事项

  • 我们通过.访问成员变量
  • 成员变量可以不初始化,并且有默认初始值!
  • 成员变量

不同类型成员变量的初始值:

类型初始值
整型和浮点型0
引用类型null
布尔类型false

null null为空引用不指向任何对象!类似C语言中的空指针。记得是小写!而和C语言中的NULL空指针一样,不能通过null引用进行访问实例成员,否者为报空指针异常! 在这里插入图片描述 我们也可以对类中的成员变量进行初始化!不过这样的操作就使得该类的实例化对象的成员变量都有相同的值,有点鸡肋!

假如我们创建一个Animal类,如果我们将成员变量name初始化成一个固定的名字!就显得很不合理,毕竟每个动物读都有自己的名字!

成员方法

用于描述对象的行为

我们已经知道方法就好比C语言中的函数!我们通过成员方法将该类的某个行为,封装成一个方法!就好比Animal类中的eat方法。然后我们通过该类对象的引用调用该方法,展现该类的某种行为!

class Animal {
    public String name;
    public int age;
    public void eat(){
        System.out.println(name+"::eat()");
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
public class Test {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.setName("浩浩"); //通过类中的setName方法将animal对象name赋值
        String name = animal.getName(); //getName方法获得name
        System.out.println(name);
        animal.eat();   //展现eat() 行为
    }

在这里插入图片描述

构造方法

类中还有一种比较特殊的方法构造方法!

方法名和类名相同

基本语法

  • 方法名和类名相同
  • 方法无返回值
  • 方法的参数列表(个数和种类)不做要求
  • 一个类可以有多个构造方法,(构造方法重载)且必须有一个构造方法!
class People{
   public String name;
   public byte age;
   //无参数的构造方法
   public People(){
       System.out.println("name:"+name);
   }
   //含有一个参数的构造方法
    public People(String name){
       this.name = name;
    }
    //含有两个参数的构造方法
    public People(String name,byte age){
       this.name = name;
       this.age = age;
    }
    //含有多个参数的构造方法
    //........
    //上面这些构造方法构造了方法重载!
}

构造方法的作用

 public class Test {
        public static void main(String[] args) {
            People people = new People();
            //实例化一个People对象
        }
}

运行结果 在这里插入图片描述 我们运行一下发现,我们并没有调用People类中无参数的构造方法,但是运行时却调用了!!! 这是什么原因呢? 构造方法的作用 这是不得不提构造方法的作用!

如何实例化一个对象呢? 可能你会问:bug你刚刚不是讲过了吗,不就是通过new关键字实例化一个对象嘛! 确实如此,but还有些重要的细节没说。 创建一个对象先要通过类创建一个引用,然后通过引用指向一个实例化对象。其实我们也可以不通过父类引用创建一个对象,后面bug郭学习!

实例化一个对象

  • 通过new 关键字为创建并为对象分配空间
  • 调用该类的合适的构造方法

这时你可能又有疑问! 在这里插入图片描述bug郭你刚刚创建Animal对象,也没见你类中有构造方法,更不要说调用构造方法了! 我们创建一个类时,编译器会默认给我们创建一个不带参数的构造方法,并不会在类中显示,并且该构造方法中不含有语句! 所以实例化一个对象时,都会调用该类的构造方法,如果类的创建者没有创建构造方法,编译器就会调用默认不带参数的的构造方法!

class Book{
    public String name;
    public double price;
//    public Book(){  //编译器会默认帮我们创建这个不带参数的构造方法
//    }
}

在这里插入图片描述

//自己创建构造方法!
class Book{
    public String name;
    public double price;
//    public Book(){  //编译器会默认帮我们创建这个不带参数的构造方法
//    }
    public Book(String name){  //当我们创建一个构造方法

    }
}
public class Test {
        public static void main(String[] args) {
            Book book = new Book(); 
            //创建对象需要调用合适的构造方法
        }
}

在这里插入图片描述为啥但我们自己创建构造方法时,实例化一个对象却报了错误! 系统不是默认调用不带参数的构造方法嘛!

但我们自己书写了构造方法时,编译器就会将默认的构造方法删除,而我们 new Book();实例化对象时是要调用类中不带参数的构造方法!但是该类中已经没有不带参数的构造方法,所以报错!

  • 创建对象时调用合适的构造方法!
class People{
   public String name;
   public byte age;
   //无参数的构造方法
   public People(){
       System.out.println("name:"+name);
   }
   //含有一个参数的构造方法
    public People(String name){
       this.name = name;
    }
    //含有两个参数的构造方法
    public People(String name,byte age){
       this.name = name;
       this.age = age;
    }
    //含有多个参数的构造方法
    //........
    //上面这些构造方法构造了方法重载!
}
class Book{
    public String name;
    public double price;
//    public Book(){  //编译器会默认帮我们创建这个不带参数的构造方法
//    }
    public Book(String name){  //当我们创建一个构造方法
        this.name = name;
        System.out.println(this.name);
    }
    public Book(String name,double price){
        this.name = name;
        this.price = price;
        System.out.println("name:"+this.name+" price:"+this.price);
    }
}
public class Test {
        public static void main(String[] args) {
            //传递一个参数调用带有一个参数的构造方法,实例化一个对象
            Book book = new Book("富婆通讯录"); //创建对象需要调用合适的构造方法
            //传递两参数调用带有两个参数的构造方法
            Book book1 = new Book("富婆通讯录",198.9);
        }
}

在这里插入图片描述

  • 构造方法不能有返回值 在这里插入图片描述

注意事项

  • 实例化一个对象要调用合适的构造方法
  • 实例化对象时通过传递不同参数列表,调用不同的构造方法
  • 构造方法方法名与类名相同
  • 构造方法无返回值
  • 构造方法可以有多个,参数列表不同构成了方法的重载