当前位置: 首页 > news >正文

Java面向对象(二)

this关键字

在java中,this关键字是一个最重要的概念。使用this关键字可以完成以下的操作:

  • 调用类中的属性
  • 调用类中的方法或构造方法
  • 表示当前对象:在方法被调用的过程中,哪个对象调用了方法,在方法内的this就表示谁
  • 可以使用当前的类名.this
public class Test2{
    public static void main(String[] args){
        Cat cat = new Cat();
        cat.setName("咪咪");
        cat.setAge(3);

        cat.eat();
         }
         }
class Cat{
   //属性的封装
   private String name;//成员变量,在类中定义
   private int age;//成员变量,在类中定义
   //getter and setter
   //对外提供一个对name属性设值的方法
   public void setName(String name){//name=咪咪
       this.name=name;//this代表的是当前对象
       }
      //对外提供一个获取name属性的方法
   public void getName(String name){
       return name;
       }
   //对外提供一个对age属性设值的方法
   public void setAge(int age){
       this.age=age;
       }
   //对外提供一个获取age属性的方法
   public void getAge(int age){
       return age;
       }
   public void eat(){
   //在方法中使用this调用类中的其它方法或属性,this可以省略
       System.out.println("我是"+this.getName()+",我爱吃鱼")
       //System.out.println("我是"+Cat.this.getName()+",我爱吃鱼")
       //System.out.println("我是"+Cat.this.name()+",我爱吃鱼")
       }
}
   }

值传递与引用传递

引用传递的本质是传递内存空间地址,而非值本身,通过内存图充分理解栈内存和堆内存

  1. 值传递
public class ValueDemo{
    public static void main(String[]args){
        int x = 10;
        method(x);
        System.out.println("x="+x);
        }
        public static void method(int mx){
             mx=20;
}
        }

在这里插入图片描述
2. 引用传递

public class RefDemo1{
    public static void main(String[] args){
            Duck d = new Duck();
            method(d);
            System.out.println("Duck age="+d.age);
            }
            public static void method(Duck duck){
                    duck.age=5;
                    }
   }
   class Duck{
       int age=2;//省略封装
     }

在这里插入图片描述

  1. String 传递
    字符串本身就是一个对象
public class RefDemo2{
    public static void main(String[] args){
            String name="小飞";
            method(name);
            System.out.println("name="+name);
            }
     public static void method(String sname){
             sname="小备";
}
}

在这里插入图片描述
4. String 传递

public class RefDemo3{
    public static void main(String[] args){
        Person p=new Person();
        method(p);
        System.out.println("person name="+p.name);
        }
     public static void method(Person p){
         p.name="备备";
         }
  }
class Person{
     String name="飞飞";//省略封装
  }

在这里插入图片描述

对象的一对一关系

表达对象的一对一关系,其实就是把对象类型作为属性定义
两个对象之间的一对一关系:
比如:
一个英雄(Hero)对一个兵器(Weapon)
代码如何表示?
双向一对一
单向一对一

public class Test5{
    public static void main(String[] args){
        Hero hero=new Hero("刘备"300);
        Weapon weapon = new Weapon("双股剑"3);
        //把两个对象关联起来
        hero.setWeapon(weapon);
        weapon.setHero(hero);

       //通过英雄来获取他的信息
       String name=hero.getName();
       int age=hero.getAge();
       Weapon w=hero.getWeapon();
       System.out.println("我是"+name+",我"+age+"岁,我的武器是: "+w.getName()+",排行"+w.getGrade()+"级");
       
    }
 }
 //英雄类
 class Hero{
     private String name;
     private int age;
     private Weapon weapon;//一对一
     public void setWeapon(Weapon weapon){
         this.weapon=weapon;
         } 
     public Weapon getWeapon(){
         return weapon;
       }
     public Hero(){}
     public Hero(String name,int age){
         this.name=name;
         this.age=age;
         }
     public void setName(String name){
         this.name=name;
         }
     public String getName(int age){
         return name;
         }
     public void setAge(int age){
         this.age=age;
         }
     public int getAge(){
         return age;
         }
 }
 //兵器类
 class Weapon{
     private String name;
     private int grade;
     public Weapon(){}
     public Weapon(String name,int grade){
         this.name=name;
         this.grade=grade;
         }
     public void setName(String name){
          this.name=name;
          }
     public String getName(){
         return name;
         }
     public void setGrade(int grade){
         this.grade=grade;}}

static关键字

static作用大,内存只有独一份,同类对象都共享,三种用法各不同,谨记静态初始化,它与对象创建没关系
static关键字的作用:
1.使用static关键字修饰一个属性

声明为static的变量实质上就是全局变量
2.使用static关键字修饰一个方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法
3.使用static关键字修饰一个类(内部类)
4.静态变量或方法不属于对象,依赖类
5.静态变量是全局变量,生命周期从类被加载后一直到程序结束
6.静态变量只存一份,在静态方法区中存放
7.静态变量是本来所有对象共享一份
8.建议不要使用对象名去调用静态数据,直接使用类名调用
9.static修是一个方法,那么该方法属于类,不属于对象,直接用类名调用

public class Test6{
    public static void main(String[] args){
    Role beibei=new Role("刘备","蜀国");
    Role yunchang =new Role("云长","蜀国");
    Role feifei=new Role("张飞","蜀国");
    System.out.println(beibei.geiInfo());
   System.out.println(yunchang.geiInfo());
    System.out.println(feifei.geiInfo());
    }
 }
class Role{
    private String name;
    private String country;
    public Role(String name,String country){
         this.name=name;
         this.country=country;
         }
     public void setName(String name){
         this.name=name;
         }
     public String getName(){
         return name;}
         }
     public void setCountry(String country){
         this.country=country;
         }
     public String getCountry(){
         return country;
     public String getInfo(){
         return "name="+name+",country="+country;}
         }

在这里插入图片描述

public class Test6{
    public static void main(String[] args){
    Role beibei=new Role("刘备");
    Role yunchang =new Role("云长");
    Role feifei=new Role("张飞");
    System.out.println(beibei.geiInfo());
   System.out.println(yunchang.geiInfo());
    System.out.println(feifei.geiInfo());
    }
 }
class Role{
    private String name;
    private static String country="蜀国";//静态变量(全局变量)
    public Role(String name,String country){
         this.name=name;
         this.country=country;
         }
     public void setName(String name){
         this.name=name;
         }
     public String getName(){
         return name;}
         }
     public void setCountry(String country){
         this.country=country;
         }
     public String getCountry(){
         return country;
     public String getInfo(){
         return "name="+name+",country="+country;}
         }

在这里插入图片描述

main方法分析

代码块

单例设计模式

对象数组与管理

相关文章:

  • 【spring】bean的生命周期
  • R语言ggplot2可视化:使用ggpubr包的ggline函数可视化分组折线图(点线图、line plot)、palette参数自定义不同分组折线图的颜色
  • Dubbo之注册与发现
  • R语言使用df函数生成F分布密度函数数据、使用plot函数可视化F分布密度函数数据(F Distribution)
  • Java--正则表达式
  • java计算机毕业设计家政服务管理源码+数据库+系统+lw文档+mybatis+运行部署
  • Java常量池理解
  • Dubbo入门介绍及学习笔记总结
  • 【SpringMVC】重定向和转向详解
  • ocr的场景应用--发票识别
  • Dubbo入门(四)Provider和Consumer的注解实现
  • dubbo分布式日志调用链追踪
  • 软件测试周刊(第87期):天下就没有偶然,那不过是化了妆的、戴了面具的必然。
  • 灵性图书馆:好书推荐-《把好运吸过来》
  • 关于Springboot的@Profile的写法以及多个profile的写法排坑(“!profile1 !profile2“ 的写法)
  • __proto__ 和 prototype的关系
  • JavaScript 基本功--面试宝典
  • Javascript弹出层-初探
  • JavaScript实现分页效果
  • js数组之filter
  • KMP算法及优化
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vim Clutch | 面向脚踏板编程……
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 数组大概知多少
  • 算法-图和图算法
  • 小而合理的前端理论:rscss和rsjs
  • Spring第一个helloWorld
  • 第二十章:异步和文件I/O.(二十三)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (175)FPGA门控时钟技术
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (bean配置类的注解开发)学习Spring的第十三天
  • (LeetCode) T14. Longest Common Prefix
  • (Oracle)SQL优化技巧(一):分页查询
  • (Ruby)Ubuntu12.04安装Rails环境
  • (windows2012共享文件夹和防火墙设置
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (转)EOS中账户、钱包和密钥的关系
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Framework .NET Core与 .NET 的区别
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NetCore部署微服务(二)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET命令行(CLI)常用命令
  • /bin、/sbin、/usr/bin、/usr/sbin
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • [C# 开发技巧]实现属于自己的截图工具
  • [C#]科学计数法(scientific notation)显示为正常数字