使用this调用本类方法

除了调用属性之外,this也可以实现方法的调用,但是对于方法的调用就必须考虑构造与普通方法

  • 构造方法调用(this()):使用关键字new实例化对象的时候才会调用构造方法;
  • 普通方法调用(this.方法名称()):实例化对象产生后就可以调用普通方法。

普通的方法调用:

  1. package study;
  2. class Person{
  3. private int age;
  4. private String name;
  5. public Person(int age ,String name) {
  6. //this.age = age;
  7. //this.name = name;
  8. this.setAge(age);
  9. this.setName(name);//加this与不加 都表示本类方法
  10. }
  11. public void intorduce() {
  12. System.out.println("age= "+this.age+" name= "+this.name);
  13. }
  14. public void setAge(int age) {
  15. this.age = age;
  16. }
  17. public void setName(String name) {
  18. this.name = name;
  19. }
  20. public int getAge() {
  21. return this.age;
  22. }
  23. public String getName() {
  24. return this.name;
  25. }
  26. }
  27. public class xxx {
  28. public static void main(String[] args) {
  29. new Person(13,"sss").intorduce();
  30. }
  31. }

构造方法的调用

对于构造方法的调用,肯定是要放在构造函数中执行,现在假设类中一共定义有三个构造方法,但是要求不管调用哪个构造方法,都执行一行输出语句

传统实现:

  1. package study;
  2. class Person{
  3. private int age;
  4. private String name;
  5. public Person() {
  6. System.out.println("一个新的Person类对象实例化。");
  7. }
  8. public Person(int age){
  9. System.out.println("一个新的Person类对象实例化。");
  10. this.age = age;
  11. }
  12. public Person(int age ,String name) {
  13. System.out.println("一个新的Person类对象实例化。");
  14. this.age = age;
  15. this.name = name;
  16. }
  17. public void intorduce() {
  18. System.out.println("age= "+this.age+" name= "+this.name);
  19. }
  20. }
  21. public class xxx {
  22. public static void main(String[] args) {
  23. new Person(13,"sss").intorduce();
  24. }
  25. }
  26. >>>一个新的Person类对象实例化。
  27. >>>age= 13 name= sss

如果要想评价一个代码的好坏:

  • 代码结构可以重用,提供的是一个中间独立的支持;
  • 我们的目标:没有重复

利用this()构造调用优化

  1. class Person{
  2. private int age;
  3. private String name;
  4. public Person() {
  5. System.out.println("一个新的Person类对象实例化。");
  6. }
  7. public Person(int age){
  8. this();//调用无参构造方法
  9. this.age = age;
  10. }
  11. public Person(int age ,String name) {
  12. this();//调用单参构造方法
  13. this.name = name;
  14. }
  15. public void intorduce() {
  16. System.out.println("age= "+this.age+" name= "+this.name);
  17. }
  18. }
  19. public class xxx {
  20. public static void main(String[] args) {
  21. new Person(13,"sss").intorduce();
  22. }
  23. }
  24. >>>一个新的Person类对象实例化。
  25. >>>age= 0 name= sss

对于本类构造方法的互相调用需要注意以下几点重要问题:

  • 构造方法必须在实例化新对象的时候调用,所以“this()”的语句只允许放在构造方法的首行;
  • 构造方法互相调用时请保留有程序的出口,别形成死循环;

四参、三参 两参 无参构造函数


  1. public class Emp {
  2. private long empo;//员工编号
  3. private String ename;//员工名字
  4. private String dept;//部门名称
  5. private Double salary;//基本工资
  6. public Emp() {
  7. this.empo =1000l;
  8. this.ename = "无名氏";
  9. }
  10. public Emp(long empo) {
  11. this.empo = empo;
  12. this.ename = "新员工";
  13. this.dept = "未定";
  14. this.salary = 0.0d;
  15. }
  16. public Emp(long empo,String ename,String dept){
  17. this.empo = empo;
  18. this.ename = ename;
  19. this.dept = dept;
  20. salary = 2500.0d;
  21. }
  22. public Emp(long empo,String ename,String dept,double salary) {
  23. this.empo = empo;
  24. this.ename =ename;
  25. this.dept = dept;
  26. this.salary = salary;
  27. }
  28. public String tell() {
  29. return "empo:"+this.empo+" ename:"+this.ename+" dept:"+this.dept+" salary:"+this.salary;
  30. }
  31. public static void main(String[] args) {
  32. Emp emp = new Emp(130l);
  33. System.out.println(emp.tell());
  34. }
  35. }

优化 得带赋值 四参构造足以撑起所有赋值


  1. public class Emp {
  2. private long empo;//员工编号
  3. private String ename;//员工名字
  4. private String dept;//部门名称
  5. private Double salary;//基本工资
  6. public Emp() {
  7. this(1000l,"无名氏",null,0.0d);
  8. // this.empo =1000l;
  9. // this.ename = "无名氏";
  10. }
  11. public Emp(long empo) {
  12. this(empo,"新员工","未定",0.0d);
  13. // this.empo = empo;
  14. // this.ename = "新员工";
  15. // this.dept = "未定";
  16. // this.salary = 0.0d;
  17. }
  18. public Emp(long empo,String ename,String dept){
  19. this(empo,ename,dept,2500.0d);
  20. // this.empo = empo;
  21. // this.ename = ename;
  22. // this.dept = dept;
  23. // salary = 2500.0d;
  24. }
  25. public Emp(long empo,String ename,String dept,double salary) {
  26. this.empo = empo;
  27. this.ename =ename;
  28. this.dept = dept;
  29. this.salary = salary;
  30. }
  31. public String tell() {
  32. return "empo:"+this.empo+" ename:"+this.ename+" dept:"+this.dept+" salary:"+this.salary;
  33. }
  34. public static void main(String[] args) {
  35. Emp emp = new Emp(130l);
  36. System.out.println(emp.tell());
  37. }
  38. }

Java面向对象编程 -3.2的更多相关文章

  1. Java面向对象编程基础

    一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...

  2. java 面向对象编程。。。。

    经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...

  3. 《Java面向对象编程》

    <Java面向对象编程> 第11章 对象的生命周期 11.1  创建对象的方式 用new语句创建对象 运用反射手段,调用java.lang.Class 或者 java.lang.Const ...

  4. JAVA面向对象编程课程设计——网络版单机斗地主

    一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...

  5. JAVA面向对象编程课程设计——web版斗地主

    一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...

  6. java面向对象编程知识点总结

    一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...

  7. Java面向对象编程(一)

    由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...

  8. JAVA学习(五):Java面向对象编程基础

    Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...

  9. (一)如何理解java面向对象编程

    哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...

  10. java面向对象编程--第九章 多态和抽象

    9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...

随机推荐

  1. Mysql 慢查询之showprofile

    show profiles:返回服务器上最近执行的语句 资源的使用情况. 一.使用准备 Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后. mysql& ...

  2. spring 配置

    在context中配置 如:在base-package指明一个包: <context:component-scan base-package="cn.edu.dao"/> ...

  3. vue $router.push 传参的问题

    $router 和 $route的区别 $route为当前router跳转对象里面可以获取name.path.query.params等 $router为VueRouter实例,想要导航到不同URL, ...

  4. xhr 的 onpregress 监听上传数据的 已上传 和 总大小

    var fd=new FormData(); $('.mwd_uppingzheng_btna_ok').on('click',function () { // 数组转 str var strarr= ...

  5. springboot06(静态资源映射)

    xxxxAutoConfiguration xxxxproperties 对静态资源的映射规则 webjars @ConfigurationProperties(prefix = "spri ...

  6. vue 项目太大, 导致 javascript heap out of memory

    原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...

  7. Qt核心剖析:信息隐藏

    原文 http://devbean.blog.51cto.com/448512/326686 (一) 如果你阅读了 Qt 的源代码,你会看到一堆奇奇怪怪的宏,例如 Q_D,Q_Q.我们的Qt源码之旅就 ...

  8. nginx配置指令auth_basic、auth_basic_user_file及相关知识

    参考链接 https://www.jianshu.com/p/1c0691c9ad3c auth_basic_user_file 所需要的密码,可以通过如下方法生成 1)安装htpasswd (yum ...

  9. 每天进步一点点------Sobel算子(2)

    转载  http://blog.csdn.net/tianhai110 索贝尔算子(Sobel operator)主要用作边缘检测,在技术上,它是一离散性差分算子,用来运算图像亮度函数的灰度之近似值. ...

  10. ARM64架构下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file:

    Linux下登录mysql出错:mysql: error while loading shared libraries: libncurses.so.5: cannot open shared obj ...