java中的构造方法

构造方法:

构造方法 又称之为构造函数/构造器
1.适用性:在创建类对象时,可以快速的实现给成员变量赋值的操作。
2.定义:名字与类名相同,后面加上小括号花括号。(注意:没有返回值类型那一说,也就是不能添加返回值类型!)
3.作用:用来创建对象的必要语法。现象:如果类中不明确写构造方法的话,系统会自动提供一个‘默认的构造方法(无参数的构造方法)。构造方法在类被创建对象时会被(调用)执行!
4.注意:如果类中写了有参数的构造方法 ,系统则不再默认赠送无参数的构造方法了!
5.构造方法重载:参数个数 或参数类型不同时,名字要相同,则可构建成构造方法的重载!

package oo.day01;/**
 * 学生类:代表所有学生对象的模板
 * 类中存放所有学生对象共有的属性和行为
 */
public class Student {
    //属性
    String name;//名字   ----成员变量
    int age;//年龄
    int stuID;//学号//构造方法  名字要与类名相同
    Student(String name1, int age1, int stuID1) { //有参数的构造方法  在类被创建对象时自动调用
        name = name1;
        age = age1;
        stuID = stuID1;
    }
    //------------------------
    //行为
    void study() {//学习
        System.out.println(name + "在学习....");
    }void sayHi() {//打招呼
        System.out.println("大家好,我叫" + name + ",今年已经" + age + "岁了!我的学号:" + stuID);
    }}

测试类中:

package oo.day01;/**
 * 学生的测试类:
 */
public class StudentTest {
    public static void main(String[] args) {
        //创建一个学生类对象
        //类型    变量名    =   创建对象的语法(new 类型())
        Student  zs  = new Student("张三",18,1001);//创建一个学生对象 zs
        //zs这个变量能打点调用什么,取决于当前zs这个变量类型有什么
        zs.study();  //调用zs这个对象的学习方法
        zs.sayHi();  //调用zs这个对象的打招呼方法Student ls = new Student("李四",34,1005);
        ls.study();
        ls.sayHi();
​
​
        //----------------------------------
//        Student ls = new Student();
//        ls.name = "李四";
//        ls.age = 30;
//        ls.stuID = 2001;
//        ls.study();//调用ls这个对象的学习方法!
//        ls.sayHi();//调用ls这个对象的打招呼的方法!
        //总结:哪个对象打点调用方法,那么方法里面用的数据就是那个对象的!
    }
}

this关键字

this指代的就是当前对象,可以通过this明确调用成员的内容。
哪个对象打掉调用方法,那么this指代的就是那个对象。
Java规定:成员变量与局部变量是可以同名的!在使用变量时,遵循就近原则。
如果想要明确表示当前成员变量,可以通过this关键字来明确访问。

package oo.day01;/**
 * 学生类:代表所有学生对象的模板
 * 类中存放所有学生对象共有的属性和行为
 */
public class Student {
    //属性
    String name;//名字   ----成员变量
    int age;//年龄
    int stuID;//学号//构造方法  名字要与类名相同
    Student(String name, int age, int stuID) { //有参数的构造方法  在类被创建对象时自动调用
        this.name = name;
        this.age  = age;
        this.stuID = stuID;
    }
    //构造方法的重载
    Student(){//无参数的构造方法}//------------------------
    //行为
    void study() {//学习System.out.println(name + "在学习....");//this是一个隐式的写法
    }
    void sayHi() {//打招呼
        System.out.println("大家好,我叫" + this.name + ",今年已经" + this.age + "岁了!我的学号:" + this.stuID);
    }}
-----------------------------------------------
    
   Student zs = new Student();
   Student ls = new Student(); 
   Student ww = new Student();
    
   zs.study();  --------------this 指代的就是zs这个对象
   ls.study();  --------------this 指代的就是ls这个对象
   ww.study();  --------------this 指代的就是ww这个对象

自定义类是引用数据类型!引用类型的默认值是null(空)!
如果拿一个空的引用类型变量,访问成员,则会报空指针异常:NullPointerException。

JVM(java虚拟机)分配内存:栈区 、堆区 、方法区(后续会详细讲!)
基本数据类型变量在内存中存的是数据。
引用数据类型变量在内存中存的是地址(引用)。
1.栈区:用来存放局部变量的地方,局部变量指的就是方法中声明的变量。特性:若方法执行完毕,对应的局部变量则也会一并被销毁。
2.堆区:用来存放对象的区域,当new对象时,会将对象分配到堆区。特性:如果堆区的对象没有被使用(引用),则会变为内存垃圾,系统会自动会进行回收。(GC垃圾回收器)

基本数据类型数组在内存中的分配:

   //基本数据类型数组
        int[] arr = new int[3];//在内存中创建一块地 分了3份,每份都是int类型
        arr[0]  = 100;
        arr[1]  = 50;
        arr[2]  = 25;
//        System.out.println(arr[0]);//100
//        System.out.println(arr[1]);
//        System.out.println(arr[2]);
引用数据类型数组在内存中的分配:
//-----引用类型数组-----------------------
Student[] stus = new Student[3];
stus[0] = new Student();//先创建对象
stus[0].name = "正宇";
stus[0].age = 18;
stus[0].stuID = 1006;
System.out.println(stus[0]);
System.out.println(stus[0].name);
System.out.println(stus[0].age);
System.out.println(stus[0].stuID);
 

问题:当前项目7个类,若被创建对象时,需要依次打点调用为具体的对象初始化数据,非常麻烦。
解决:为7个类添加构造方法。

战舰类:
      Battleship() {
        x = 270;//初始x 的位置
        y = 124;// 初始y 的位置
        width = 66;//图片的宽
        height = 26;//图片的高
        speed = 20;// 步长
        life = 5;//初始 生命 5
    }
深水炸弹:
     Bomb(int x,int y){
        this.x = x;//由具体被创建对象时确定x坐标
        this.y = y;//由具体被创建对象时确定y坐标
        width = 9;//图片宽
        height = 12;//图片高
        speed = 3;//速度
    }
水雷:
 Mine(int x , int y){
        this.x = x;
        this.y = y;
        width = 11;//图片宽
        height = 11;//图片高
        speed = 2;//移动的速度
    }
鱼雷:
 Torpedo(int x, int y) {
        this.x = x;
        this.y = y;
        width = 5;//图片的宽
        height = 18;//图片的高
        speed = 2;//速度
    }
水雷潜艇:
    
    MineSubmarine(){
        width = 63;//图片的宽
        height = 19;//图片的高
        x = -width;//负一个图片的宽
        // 随机数 * (最大值- 最小值) + 最小值
        y = (int)(Math.random() *(479- height - 150) +150);//随机 y坐标
        speed = (int)(Math.random()*(3-1)+1);//随机速度
    }
鱼雷潜艇:
     TorpedoSubmarine(){
        width = 64;//图片的宽
        height = 20;//图片的高
        x = -width;//负一个图片的宽
        // 随机数 * (最大值- 最小值) + 最小值
        y = (int)(Math.random() *(479- height - 150) +150);//随机 y坐标
        speed = (int)(Math.random()*(3-1)+1);//随机速度
    }
侦察潜艇:
      ObserverSubmarine(){
        width = 63;//图片的宽
        height = 19;//图片的高
        x = -width;//负一个图片的宽
        // 随机数 * (最大值- 最小值) + 最小值
        y = (int)(Math.random() *(479- height - 150) +150);//随机 y坐标
        speed = (int)(Math.random()*(3-1)+1);//随机速度
    }

问题:除了战舰,我们其它的类都会存在多个对象,那么如何表示同一类型的多个?
解决:可以用数组解决,同一类型多个的问题。

GameWorld类上面:

Battleship ship;//声明一个战舰类型的变量
Bomb[] bombs; //声明一个深水炸弹数组的变量
MineSubmarine[] ms;//声明一个水雷潜艇数组的变量
TorpedoSubmarine[] ts;//声明一个鱼雷潜艇数组的变量
ObserverSubmarine[] os;//声明一个侦察潜艇数组的变量
Mine[] m;//声明一个水雷数组的变量
Torpedo[] t;//声明一个鱼雷数组的变量

问题:7个类,类中都存在重复的属性!代码冗余!
解决:需要使用继承来解决!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值