Java重新来过五(类和对象,)

一、类和对象

1、引用:如果一个变量的类型是 类类型,而非基本类型,那么该变量又叫做引用。

使用引用来代表(指向)一个对象,引用用来访问这个对象。

(一个引用同一时间,只能指向一个对象;        一个对象可以有多个引用)

2、继承(属性)

3、方法重载:方法名一样,参数类型不一样(在同一个类里)

可变数量的参数:在方法里,使用操作数组的方式处理参数即可

   public void attack(Hero... heros) {

        for (int i = 0; i < heros.length; i++) {

            System.out.println(name + " 攻击了 " + heros[i].name);

        }

    }

4、构造方法:

通过一个类创建一个对象,这个过程叫做实例化

实例化是通过调用构造方法(构造器)实现的。

    // 方法名和类名一样(包括大小写)

    // 没有返回类型

    public Hero() {     //这个无参的构造方法,如果不写,就会默认提供一个

        System.out.println("实例化一个对象的时候,必然调用构造方法");

    }

    public static void main(String[] args) {

        //实例化一个对象的时候,必然调用构造方法

        Hero h = new Hero();

    }

一旦提供了一个有参的构造方法 
同时又没有显式的提供一个无参的构造方法 
那么默认的无参的构造方法,就“木有了“

和普通方法一样,构造方法也可以重载

5、 this:this即代表当前对象

    public void showAddressInMemory(){

        System.out.println("打印this看到的虚拟地址:"+this);

    }

    //参数名和属性名一样
    //在方法体中,只能访问到参数name
    public void setName1(String name){
        name = name;
    }
     
    //为了避免setName1中的问题,参数名不得不使用其他变量名
    public void setName2(String heroName){
        name = heroName;
    }
     
    //通过this访问属性
    public void setName3(String name){
        //name代表的是参数name
        //this.name代表的是属性name
        this.name = name;
    }

 如果要在一个构造方法中,调用另一个构造方法,可以使用this()

    //带一个参数的构造方法
    public Hero(String name){
        System.out.println("一个参数的构造方法");
        this.name = name;
    }
      
    //带两个参数的构造方法
    public Hero(String name,float hp){
        this(name);
        System.out.println("两个参数的构造方法");
        this.hp = hp;
    }

6、传参:

变量有两种类型 基本类型 和类类型 
参数也是变量,所以传参分为 
基本类型传参 
类类型传参

基本类型传参 :
在方法内,无法修改方法外的基本类型参数

类类型传参:

类类型又叫引用 ,可以改变方法外的类类型参数值

如果一个变量是基本类型
比如 int hp = 50;
我们就直接管hp叫变量
=表示赋值的意思。
如果一个变量是类类型
比如 Hero h = new Hero();
我们就管h叫做引用。
=不再是赋值的意思
=表示指向的意思
比如 Hero h = new Hero();
这句话的意思是
引用h,指向一个Hero对象

7、包package

使用同一个包下的其他类,直接使用即可 
但是要使用其他包下的类,必须import

8、访问修饰符

成员变量有四种修饰符 
private 私有的 
package/friendly/default 不写     没有修饰符即代表package/friendly/default 
protected 受保护的 
public 公共的

æ»ç»

属性通常使用private封装起来
方法一般使用public用于被调用
会被子类继承的方法,通常使用protected

作用范围最小原则

9、类属性:又叫做静态属性 
对象属性: 又叫实例属性,非静态属性 

当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性 
当一个属性被声明成类属性,那么所有的对象,都共享一个值 
与对象属性对比: 
不同对象的 对象属性 的值都可能不一样。 
比如盖伦的hp 和 提莫的hp 是不一样的。 
但是所有对象的类属性的值,都是一样的

访问类属性:两种方式:                       对象.类属性           类名.类属性(建议使用这个)

如果一个属性,每个英雄都不一样,比如name,这样的属性就应该设计为对象属性,因为它是跟着对象走的,每个对象的name都是不同的

如果一个属性,所有的英雄都共享,都是一样的,那么就应该设计为类属性。比如血量上限,所有的英雄的血量上限都是 9999,不会因为英雄不同,而取不同的值。 这样的属性,就适合设计为类属性

10、类方法

类方法: 又叫做静态方法 

对象方法: 又叫实例方法,非静态方法 

访问一个对象方法,必须建立在有一个对象的前提的基础上 
访问类方法,不需要对象的存在,直接就访问

访问类方法:两种方式:                       对象.类方法           类名.类方法(建议使用这个)

类方法不随对象的改变而变化,对象方法随对象的改变而改变

11、属性初始化

对象属性初始化有3种:

package charactor;
 
public class Hero {
    public String name = "some hero"; //声明该属性的时候初始化
    protected float hp;
    float maxHP;
     
    {
        maxHP = 200; //初始化块
    }  
     
    public Hero(){
        hp = 100; //构造方法中初始化
         
    }
     
}

 类属性初始化有2种:

    //物品栏的容量
    public static int itemCapacity=8; //声明的时候 初始化
     
    static{
        itemCapacity = 6;//静态初始化块 初始化
    }

12、单例模式:又叫做 Singleton模式,指的是一个类,在一个JVM里,只有一个实例存在。

饿汉式:无论如何都会创建一个实例

懒汉式:只有在调用getInstance的时候,才会创建实例

                  1. 构造方法私有化private GiantDragon(){  //私有化构造方法使得该类无法在外部通过new 进行实例化
                  2. 静态属性指向实例  private static GiantDragon instance; //一个类属性,用于指向一个实例化对象,暂指向null
                  3. public static的 getInstance方法,返回第二步的静态属性

package charactor;
 
public class GiantDragon {
  
    //私有化构造方法使得该类无法在外部通过new 进行实例化
    private GiantDragon(){       
    }
  
    //准备一个类属性,用于指向一个实例化对象,但是暂时指向null
    private static GiantDragon instance;
      
    //public static 方法,返回实例对象
    public static GiantDragon getInstance(){
        //第一次访问的时候,发现instance没有指向任何对象,这时实例化一个对象
        if(null==instance){
            instance = new GiantDragon();
        }
        //返回 instance指向的对象
        return instance;
    }
      
}

什么时候使用饿汉式,什么时候使用懒汉式

饿汉式是立即加载的方式,无论是否会用到这个对象,都会加载。
如果在构造方法里写了性能消耗较大,占时较久的代码,比如建立与数据库的连接,那么就会在启动的时候感觉稍微有些卡顿。

懒汉式,是延迟加载的方式,只有使用的时候才会加载。 并且有线程安全的考量(鉴于同学们学习的进度,暂时不对线程的章节做展开)。
使用懒汉式,在启动的时候,会感觉到比饿汉式略快,因为并没有做对象的实例化。 但是在第一次调用的时候,会进行实例化操作,感觉上就略慢。

看业务需求,如果业务上允许有比较充分的启动和初始化时间,就使用饿汉式,否则就使用懒汉式

13、枚举类:枚举enum是一种特殊的类(还是类),使用枚举可以很方便的定义常量

public enum Season {

    SPRING,SUMMER,AUTUMN,WINTER

}

public class HelloWorld {
    public static void main(String[] args) {
        Season season = Season.SPRING;
        switch (season) {
        case SPRING:
            System.out.println("春天");
            break;
        case SUMMER:
            System.out.println("夏天");
            break;
        case AUTUMN:
            System.out.println("秋天");
            break;
        case WINTER:
            System.out.println("冬天");
            break;
        }
    }
}

假设在使用switch的时候,不是使用枚举,而是使用int,而int的取值范围就不只是1-4,有可能取一个超出1-4之间的值,这样判断结果就似是而非了。(因为只有4个季节)

但是使用枚举,就能把范围死死的限定在这四个当中

遍历枚举:使用增强for循环

        for (Season s : Season.values()) {

            System.out.println(s);

        }

猜你喜欢

转载自blog.csdn.net/DH2264664169/article/details/86476919
今日推荐