zoukankan      html  css  js  c++  java
  • 面向对象(1)

    面向对象(1)

    创建及实例化对象

    public class Item {
        //类属性
        String name; //姓名
        int price; //价格
    	
        //实例化对象
        public static void main(String[] args) {
            Item xuePing =  new Item();
            xuePing.name = "血瓶";
            xuePing.price = 50;      
    
            Item caoXie =  new Item();
            caoXie.name = "草鞋";
            caoXie.price = 300;    
        }
    }	
    
    • 当一个变量被声明在类下面,变量就叫做字段 或者属性成员变量Field,其作用域就是从其声明的位置开始的整个类

    • 属性的类型可以是基本属性,比如int整数,float 浮点数也可以是类类型,比如String 字符串

    • 属性名称一般为小写,当为多个单词时后面单词首字母大写

    • new Item() 代表创建对象,而 Item xuePing = new Item() 代表引用xuePing指向对象,xuePing这个变量是Item类型

    对象方法

    public class Hero {
        String name; //姓名   
        float hp;//血量 
        float armor; //护甲    
        int moveSpeed; //移动速度
     
        //获取护甲值,返回值为float类型
        float getArmor(){
            return armor;
        }
         
        //回血
        void recovery(float blood){
            hp = hp + blood;
        }
        
        //增加移动速度,具有方法参数
        void addSpeed(int speed){
            //在原来的基础上增加移动速度
            moveSpeed = moveSpeed + speed;
        }
        
        public static void main(String[] args){
            Hero garen = new Hero();
            garen.name = "盖伦";
            garen.moveSpeed = 350;
            garen.addSpeed(100);
        }
         
    }
    
    • 方法主要用于表明对象功能,通常用函数表示

    • 方法函数中可以有返回值,返回值类型记得与函数开头保持一致;也可以有方法参数

      • 如果一个变量,是声明在一个方法上的,就叫做参数,参数的作用域为该方法内的所有代码
    • 声明在方法内的变量,叫做局部变量,其作用域在声明开始的位置,到其所处于的块结束位置

    继承

    //Armor类继承了Item类及其属性
    public class Armor extends Item {
    	int ac;//护甲等级
    	
        //实例化对象
        public static void main(String[] args) {
            Armor buJia =  new Armor();
            buJia.name = "布甲";
            buJia.price = 300;  
            buJia.ac = 15;
            System.out.println(buJia.name);
            System.out.println(buJia.ac);
    
            Armor suoZiJia =  new Armor();
            suoZiJia.name = "锁子甲";
            suoZiJia.price = 500; 
            suoZiJia.ac = 40;
            System.out.println(suoZiJia.name);
            System.out.println(suoZiJia.ac);
        }
    }	
    
    • 继承主要解决共性抽取

    • Armor通过继承Item类,除了自己设计的ac属性,也具备了name和price属性

    • 子类可以拥有父类中的内容,也可以有自己的内容

    • Java 继承的三个特点

      • Java语言是单继承的

      • Java语言可以多级继承

      • 一个子类的父类是唯一的,但是一个父类可以拥有很多个子类

    方法重载

    public class Support extends Hero {
        
        //heal方法名一样,但参数列表不同
    	public void heal(){
    		System.out.println(name + "提供治疗");
    	}
    
    	//可变数量的参数,可使用操作数组的方式处理参数heros
    	public void heal(Hero...heros){
    		for (int i = 0; i < heros.length; i++){
    			System.out.println(name + "对" + heros[i].name + "进行了一次治疗 " + "血量为:" + heros[i].hp);
    		}	
    	}
        
    	public void heal(Hero h, float hp){
    		System.out.println(h.name + "加血量为:" + hp + "血量为:" + (h.hp+hp));
    	}
        
    	public static void main(String[] args){
    		Hero h1  = new Hero();
    		h1.name = "盖伦";
    		h1.hp = 50;
    		Hero h2 = new Hero();
    		h2.name = "提莫";
    		h2.hp = 40;
    		Support h = new Support();
    		h.name = "奶妈";
            //调用方法时,根据传递的参数类型以及数量,自动调用对应的方法
    		h.heal();
    		h.heal(h1, h2);
    		h.heal(h1, 20);
    		h.heal(h2, 30);
    	}
    }
    
    • 方法的重载指的是方法名一样,但是参数类型不一样

    • 采用可变数量的参数时只需要设计一个方法,public void attack(Hero ... heros) 即可代表上述所有的方法,在方法里使用操作数组的方式处理参数heros

    • 在调用方法的时候,会根据传递的参数类型以及数量,自动调用对应的方法

    构造方法

    public class Hero {
        String name;
        float hp;
        
        // 方法名和类名一样(包括大小写)
        // 没有返回类型
        public Hero() {
            System.out.println("实例化一个对象的时候,必然调用构造方法");
        }
        
        //有参的构造方法
        //上述默认的无参的构造方法就失效了
        //有参的构造方法可以简化类的编写
        public Hero(String heroname){  
            name = heroname;
        }
        
        //当没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数和方法体,即
        //public Hero(){}
        
        public static void main(String[] args) {
            //实例化一个对象的时候,必然调用构造方法
            Hero garen =  new Hero("盖伦");  
            Hero h = new Hero();//有参时此构造方法失效
        }
    }
    
    • 构造方法是专门用来创建对象的方法,当我们通过关键字new创建对象时,其实就是在调用构造方法

    • 构造方法的名称必须和所在类名称完全一样(包括大小写)

    • 构造方法不能return一个具体返回值,所以构造方法不要写返回值类型,连void都不写

    • 如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数和方法体

    • 一旦编写至少一个构造方法,那么编译器将不再赠送

    • 构造方法也可以进行重载

    继承中的构造方法

    public class Hero {
        public Hero(){
            System.out.println("父类无参构造");
        }
        
        public Hero(int num){
            System.out.println("父类有参构造");
        }
    }
    //////////////////////////////////////
    public class Support extends Hero{
        public Support(){
        	//当未调用父类构造方法时默认隐含super()
            //super();
            super(20);//根据有参无参调用父类不同的构造方法
            System.out.println("子类构造方法");
        }    
        public static void main(String[] arags){
      		Support h = new Support();
        }
    }
    
    • 子类构造方法中有一个默认隐含的 super() 调用,所以先调用父类构造,后执行子类构造

    • 子类构造可以通过super关键字来调用父类重载构造

    • super的父类构造调用必须是子类构造方法的第一个语句,即不能一个子类构造调用多次super构造

      • super关键字的用法:在子类成员方法中访问父类成员变量或成员方法,在子类构造方法中访问父类构造方法

    private关键字

    public class Hero {
    	String name; //姓名   
        private float hp;//血量
        private float armor; //护甲    
        int moveSpeed; //移动速度
        
        //向armor设置数值
        public void setArmor(float num){
        	if(num < 0)
            	System.out.println("数据不合理");
            else
            	armor = num;
        }
        //获取成员数据,返回值为float类型
        public float getArmor(){
            return armor;
        }
         
        //向hp设置数值
        public void setHp(float num){
            if(num < 0)
            	System.out.println("数据不合理");
            else
            	hp = num;
        }
        
        //获取成员数据,返回值为float类型
        public float getHp(){
        	return hp;
        }
    }
    
    ///////////////////////////////////////////////////////////
    
    //Support继承Hero同时,对成员变量进行了保护
    public class Support extends Hero {
        
    	//可变数量的参数,使用操作数组的方式处理参数heros
    	public void heal(Hero...heros){
    		for (int i = 0; i < heros.length; i++){
    			System.out.println(name + "对" + heros[i].name + "进行了一次治疗 " + "血量为:" + heros[i].getHp());
    		}	
    	}
    	public void heal(Hero h, float hp){
    		System.out.println(h.name + "加血量为:" + hp + "血量为:" + (h.getHp()+hp));
    	}
    	public static void main(String[] args){
    		Hero h1  = new Hero();
    		h1.name = "盖伦";
    		h1.setHp(50);
    		Hero h2 = new Hero();
    		h2.name = "提莫";
    		h2.setHp(40);
    		Support h = new Support();
    		h.name = "奶妈";
    		h.heal(h1, h2);
    		h.heal(h1, 20);
    		h.heal(h2, 30);
    	}
    }
    
    • private关键字可以将需要保护的成员变量进行修饰。

    • 一旦使用private进行修饰,那么本类中仍然可以随意访问,但超出本类范围之外就不能随意访问

    • 需要间接访问private成员变量,即定义一对Getter/Setter方法,命名规则为 setXxxgetXxx 。对于Getter来说不能有参数,返回值类型和成员变量对应;对于Setter来说不能有返回值,参数类型和成员变量对应。

    this关键字

    • this即代表当前对象(通过谁调用方法,谁就是this)

    • 当方法的局部变量和类的成员变量重名时,根据就近原则,优先使用局部变量,如果需要访问本类中的成员变量可以通过 this.成员变量 访问

      //通过this访问属性
      public void setName(String name){
          //name代表的是参数name
          //this.name代表的是属性name
          this.name = name;
      }
      
    • 在本类成员方法中,调用另一个成员方法,可以使用 this.成员方法

    • 在本类构造方法中,调用另一个构造方法,可以使用 this(...)

      此调用也必须是构造方法的第一个语句,且super和 this两种构造调用不能同时使用

      public class Hero{
          public Hero(){
             //super();//同时调用会报错,
              this(12);//可以通过this()调用有参构造方法
             // this(1, 2);//同时调用时会报错,即必须是构造方法的第一个语句
          }
          public Hero(int i){
              this(1, 2);
          }
           public Hero(int i, int j){
          }
      }
      
  • 相关阅读:
    [读书笔记] 代码整洁之道(五): 系统
    [读书笔记] 代码整洁之道(四): 类
    [读书笔记] 代码整洁之道(三): 错误处理及边界接口处理
    [读书笔记] 代码整洁之道(二):对象和数据结构
    程序猿的书单
    selenium自动化-java-封装断言
    java环境变量详细配置步骤
    Selenium-java-TestNg-的运行
    quicktest Professional下载地址,无限制使用方法
    常用网站收集
  • 原文地址:https://www.cnblogs.com/geqianLee/p/12917444.html
Copyright © 2011-2022 走看看