【达内课程】面向对象之构造方法和重载

2024-05-12 10:32

本文主要是介绍【达内课程】面向对象之构造方法和重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 构造方法
  • 举例说明构造方法
  • 关键字 this
  • 举例说明 this 关键字
  • 方法重载 Overload

构造方法

概念了解
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值

作用:一般用来初始化成员属性和成员方法的,即 new 对象产生后,就调用了对象的属性和方法。

几点说明
1、构造方法是新建实例时执行的特殊方法
例如我们上一章新建 Soldier 类时也就调用一个构造方法

s1 = new Soldier();

2、一个类必须有构造方法,如果不写构造方法,编辑器编译代码时,会默认添加一个构造方法,如下:

public class A(){//添加的默认无参空方法,没有返回类型public A(){}
}

3、构造方法可以有多个,但参数不一样,称为构造方法的重载。这样增加了程序的灵活性

public class A(){public A(int i){...}public A(double d){...}public A(int i,double d){...}
}

如果类中有显示的构造方法,那么默认构造方法将无效。也就是创建实例时,就不能写new A();因为已经写了构造参数,运行时就不会再添加默认的构造方法。所以如果有显示的构造方法,还想保留默认构造 方法,需要显示的写出来。一个好的编程习惯是要保留默认的构造方法。(为了方便一些框架代码使用反射来创建对象)。

4、构造方法的作用,通常用来给成员变量赋值
给对象初始化数据可以使用构造方法或 setter 方法,通常情况下,两者都会保留

5、构造方法的名称必须与类名完全相同,构造方法不允许声明返回值

6、super(); 表示调用父类的构造方法,只有在子类的构造方法中,才能调用父类的构造方法。其中super(); 必须在有效代码的第一行,上边写注释是可以的,但不能放其他非注释代码

举例说明构造方法

首先我们创建一个宠物狗类,它的成员属性有 名字(name)、饥饿度(hungry)、快乐度(happy)。当我们喂食(feed)时,它的饥饿度降低。当我们陪它玩耍(play)时,饥饿度增高,快乐度增高。当我们惩罚(punish)它时快乐度降低。

Dog

public class Dog {public String name;//名字public int hungry;//饥饿度public int happy;//快乐度//喂食public void feed(TextView textView) {if (hungry == 0) {textView.setText(name + "吃饱了\n" + textView.getText());return;}hungry -= 10;textView.setText("给" + name + "喂食,hungry:" + hungry + "\n" + textView.getText());}//玩public void play(TextView textView) {if (hungry == 100) {textView.setText(name + "很饿了\n" + textView.getText());return;}happy += 10;hungry += 10;textView.setText("陪" + name + "玩耍,happy:" + happy + ",hungry:" + hungry + "\n" + textView.getText());}//惩罚public void punish(TextView textView) {happy -= 10;textView.setText("打" + name + "," + name + "哭叫:汪,happy:" + happy + "\n" + textView.getText());}
}

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:columnCount="4"android:orientation="vertical"android:rowCount="6"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="创建宠物狗" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="play" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="feed" /><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="punish" /><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#222222"android:textSize="18sp"/></LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity {Dog dog;Button create;Button play;Button feed;Button punish;TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);create = (Button) findViewById(R.id.button1);play = (Button) findViewById(R.id.button2);feed = (Button) findViewById(R.id.button3);punish = (Button) findViewById(R.id.button4);textView = (TextView) findViewById(R.id.textView);}public void doClick(View view) {switch (view.getId()) {case R.id.button1:f1();break;case R.id.button2:f2();break;case R.id.button3:f3();break;case R.id.button4:f4();break;}}private void f1() {dog = new Dog();dog.name = "蠢狗";dog.hungry = 50;dog.happy = 50;textView.setText("电子狗已经创建");}private void f2() {dog.play(textView);}private void f3() {dog.feed(textView);}private void f4() {dog.punish(textView);}
}

运行程序:
在这里插入图片描述

例子1:给Dog类添加无参构造方法

public class Dog {public String name;//名字public int hungry;//饥饿度public int happy;//快乐度//构造方法public Dog() {Log.d("Dog", "执行了构造方法");}//喂食......
}

那么在点击创建宠物狗按钮来创建 Dog 类时,会执行Log输出
在这里插入图片描述
例子2,给Dog类添加有参构造方法

public class Dog {public String name;//名字public int hungry;//饥饿度public int happy;//快乐度//构造方法public Dog(String name, int hungry, int happy) {//如果局部变量与成员变量同名,必须用this.xx来引用成员变量,如果不同名,可以直接写this.name = name;this.happy = hungry;this.happy = happy;}//喂食......
}

那么我们创建 Dog 类对象的写法需要改成这样:

dog = new Dog("蠢狗",50,50);

例子3,给Dog类同时添加无参和有参构造方法

public class Dog {public String name;//名字public int hungry;//饥饿度public int happy;//快乐度//构造方法public Dog() {}public Dog(String name, int hungry, int happy) {//如果局部变量与成员变量同名,必须用this.xx来引用成员变量this.name = name;this.happy = hungry;this.happy = happy;}//喂食......
}

创建Dog对象的时候写法有两种

dog = new Dog("蠢狗",50,50);
dog = new Dog();

关键字 this

this关键字指向的是当前对象的引用
调用类中的属性
this.属性名称,指的是访问类中的成员变量,用来区分成员变量和局部变量(重名问题)
比如我们上边的 Dog 类,类中的成员变量和构造方法中的成员变量是重名的,所以用 this.属性名称 访问类中的成员变量,以此区分
在这里插入图片描述

调用类中的方法this.方法名称,用来访问本类的成员方法
调用类构造方法this();访问本类的构造方法,()中可以有参数的。如果有参数,就是调用指定的有参构造。但需要注意两点:
1.this() 不能使用在普通方法中,只能写在构造方法中
2.必须是构造方法中的第一条语句

举例说明 this 关键字

我们创建一个学生类 Student。属性包括唯一编号(id)、姓名(name)、性别(gender)、年龄(gender)

public class Student {public int id;public String name;public String gender;public int age;//无参构造方法public Student() {}//有参构造方法public Student(int id, String name) {//减少代码重复,调用3个参数方法,没有的参数gender可以传默认值null/*this.id = id;this.name = name;*/this(id, name, null);}public Student(int id, String name, String gender) {//减少代码重复,调用3个参数方法,没有的参数age可以传默认值0/* this.id = id;this.name = name;this.gender = gender;*/this(id, name, gender, 0);}public Student(int id, String name, String gender, int age) {this.id = id;this.name = name;this.gender = gender;this.age = age;}public String toString() {return "\n姓名:" + name + "\n性别:" + gender + "\n年龄:" + age + "\nid:" + id;}
}

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="student()" /><Buttonandroid:id="@+id/button2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="student(id,name)" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="student(id,name,gender)" /><Buttonandroid:id="@+id/button4"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="doClick"android:text="student(id,name,gender,age)" /><TextViewandroid:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#222222"android:textSize="18sp" /></LinearLayout>

MainActivity

public class MainActivity extends AppCompatActivity {Button create;Button button1;Button button2;Button button3;TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);create = (Button) findViewById(R.id.button1);button1 = (Button) findViewById(R.id.button2);button2 = (Button) findViewById(R.id.button3);button3 = (Button) findViewById(R.id.button4);textView = (TextView) findViewById(R.id.textView);}public void doClick(View view) {switch (view.getId()) {case R.id.button1:f1();break;case R.id.button2:f2();break;case R.id.button3:f3();break;case R.id.button4:f4();break;}}private void f1() {Student s = new Student();textView.setText(s.toString());}private void f2() {Student s = new Student(9527, "张三");textView.setText(s.toString());}private void f3() {Student s = new Student(9528, "lili", "女");textView.setText(s.toString());}private void f4() {Student s = new Student(9529, "苏菲", "女", 22);textView.setText(s.toString());}
}

运行程序:
在这里插入图片描述

方法重载 Overload

重载(Overloading)的定义:如果有两个方法的方法名相同,但参数不一致,那么可以说一个方法是另一个方法的重载。

在上边 举例说明 this 关键字 的例子中,Student 类我们写了 4 个构造方法,有无参的构造方法、有只能传 id 和 name 的构造方法、还有能传 id、name 和 gender 的构造方法。这就是构造方法的重载。

这篇关于【达内课程】面向对象之构造方法和重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982380

相关文章

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

C++可以被重载的操作符Overloadable operators

C++允许绝大多数操作符被重载,也就是重新定义操作符实现的功能,这样它们的行为可以被设计出来以适应所有的数据类型,包括类。 以下是C++可以被重载的操作符(Overloadable operators): //四则运算符+ - * / %+= -= *= /= %=//比较运算符> >= == != //赋值运算符= //位操作

c++/《重载操作符》

为什么要对运算符进行重载:         C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。 <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P98

更改为 差分的数学表达式从泰勒级数展开式可得: 后悔没听廖老师的。 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

Java封装构造方法

private/public的分装 被public修饰的成员变量或者是成员方法,可以被类的调用对象直接使用 而private修饰的成员变量和方法,不能被类的调用对象使用 例如: 可以看到我们是不能在main方法中直接调用被private修饰的变量 当然我们可以在我们定义的TestMode类中可以定一个方法show,然后在调用show方法实现 这里我们可以清楚了解 private 不光可以修