Java面向对象(下)-创新互联

Java面向对象(下) 1. static关键字

static可以用来修饰类的内部结构(除了构造器):属性、方法、代码块、内部类

创新互联长期为1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为勉县企业提供专业的成都网站建设、网站制作,勉县网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。1.1 静态属性
  1. 用static修饰的属性为静态属性(类变量),非静态变量(或称实例变量)
  • 实例变量:每个对象都有属于自己的一套非静态属性,互不影响
  • 类变量:所有对象共用的。当通过一个对象修改静态变量,会导致其他变量调用此静态变量时,得到的是修改过的数值。
  1. 静态变量随着类的加载而加载,早于对象的创建。
    而实例变量是在对象创建后才加载的
    所以可以通过 “类.静态变量” 的方式进行调用
  2. 静态变量存储在方法区的静态域中
  3. 静态属性举例:System.out , Math.PI
class Chinese{String name;
    int age;
    static nation;
}
class Test{public static void main(String[] args){//不用创建对象,就可以调用静态变量
        //因为静态变量随着类的加载而加载
        Chinese.nation = "CHINA";
    }
}
1.2 静态方法
  • 随着类的加载而加载,可以通过 类.方法 来调用方法
  • 静态方法中只能调用静态的方法、静态的属性(由生命周期决定)
  • 非静态方法既可以调用静态的,也可以调用非静态的
  • 在静态的方法内,不能使用this,super关键字
1.3 什么时候声明为static

属性

  1. 该属性是被多个对象共用的,不会随着对象的不同而不同
  2. 类中的常量也常被修饰为static,如Math.PI
    方法
  3. 操作静态属性的方法,通常为static
  4. 工具类中的方法,比如Math类、Arrays类、Collections类
2.单例设计模式 2.1 什么是设计模式
  • 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格以及解决问题的思考方式。类似于棋谱。
  • 设计模式是独立于语言的(和数据结构类似),对Java、Python等编程设计都适用
2.2 单例设计模式
  • 单例设计模式的类只能由一个对象
    实现方式
  1. 将构造器设置为private的(这样类的外部就不能创建对象了)
  2. 在类的内部创建静态的类对象instance
  3. 声明public的静态方法getInstance(),返回类内部创建的对象
2.3 饿汉式和懒汉式
//单例设计模式
//饿汉式
public class SingletonTest1 {public static void main(String[] args) {Bank b1 = Bank.getInstance();
        Bank b2 = Bank.getInstance();
        //地址值相同,说明这个类只有一个对象
        System.out.println(b1 == b2);
    }
}

class Bank {//私有化类的构造器
    private Bank() {}

    //内部创建类的对象
    private static Bank instance = new Bank();

    //声明public,static的getInstance方法,返回内部创建的类
    public static Bank getInstance() {return instance;
    }
}
//单例模式
//懒汉式
public class SingletonTest2 {public static void main(String[] args) {Order order1 = Order.getInstance();
        Order order2 = Order.getInstance();
        System.out.println(order1 == order2);
    }
}

class Order{private Order(){}

    private static Order instance = null;

    public static Order getInstance(){if(instance == null){instance = new Order();
        }
        return instance;
    }
}

饿汉式和懒汉式的比较

  • 饿汉式:
    1. 坏处:对象加载时间过长
    2. 好处:饿汉式是线程安全的
  • 懒汉式:
    1. 好处:延迟对象的创建
    2. 目前的写法的坏处是线程不安全,到多线程时,可以修改
2.4 单例模式的使用场景

因为只生成一个对象,所以减少了系统的开销
image.png

3. main方法的理解
  1. main方法是程序的入口
  2. main方法也是一个普通的静态方法
  3. main()也可以作为我们与控制台交互的方式
4. 代码块(初始化块) 类的成员之四
  1. 代码块又称初始化块,作用是初始化类、对象
  2. 代码块如果有修饰的话,只能使用static
  3. 根据是否用static修饰分为:静态代码块、非静态代码块
class Person{//非静态代码块
    {
    }
    //静态代码块
    static{}
}
4.1 静态代码块
  1. 内部可以有输出语句
  2. 随着类的加载而执行,因而只会执行一次
  3. 可以初始化类的静态属性
  4. 如果一个类中定义了多个静态代码块,则先声明的静态代码块先执行
  5. 而所有的静态代码块的执行都先于非静态的代码块(因为静态代码块随着类的加载而执行,先于对象的创建)
  6. 静态代码块只能调用静态的结构
4.2 非静态代码块
  1. 内部可以有输出语句
  2. 随着对象的创建而执行,每创建一个对象就会执行一次非静态代码块
  3. 可以在创建对象的时候,对属性进行初始化
  4. 多个非静态代码块,执行顺序也是先声明先执行
  5. 非静态代码块既可以调用静态结构也可以调用非静态结构
5. 对属性赋值

数字表示赋值的先后顺序

  1. 默认初始化
  2. 显示初始化 代码块中初始化
    哪个先写,哪个先赋值
  3. 构造器中初始化
  4. 使用对象.属性赋值
6.final 关键字

final —— 最终的(不可修改)
final可以用来修饰类、方法、变量

6.1 final修饰类

final类不能有子类,不能被继承
比如String类、System类、StringBuffer类

6.2 final修饰方法

表示此方法不能被重写

6.3 final修饰变量

final修饰变量,此时的变量就称为一个常量

  1. final修饰属性:可以赋值的位置:显示初始化、代码块初始化、构造器初始化
  2. final修饰局部变量:表示常量,只能调用,不能修改。
    尤其是用final修饰形参时,在方法中只能使用,不能修改
6.4 static final

static final修饰属性:全局常量

7. abstract关键字

abstract 可以用来修饰类和方法

7.1 抽象类

抽象类不能实例化,只能被其他类继承

  • 抽象类一定有构造器,便于子类实例化时调用
    1. 若子类重写了所有的抽象方法,则此子类可以实例化
    1. 否则,此子类也是抽象类,需要用abstract来修饰
7.2 抽象方法

抽象方法只有方法的声明,没有方法体

  • 包含抽象方法的类一定时抽象类,反之抽象类中不一定有抽象方法
public abstract void eat();

注意点

  1. 什么时候用抽象类呢?
    举个例子:几何图形这个类就是抽象的,计算面积这种方法只能声明,不能实现。
  2. abstract不能用来修饰私有方法、静态方法、final的方法、final的类
7.3 抽象类的匿名子类
  • 一些抽象类因为有抽象方法,需要将抽象方法重写了才能创建对象
  • 目的:匿名子类只需要使用一次(省事)
//假设Person是一个抽象类
//Person中eat方法是抽象方法

//创建匿名子类,把抽象类的抽象方法给实现了
//使用多态将子类对象赋给父类的引用
Person p = new Person(){public void eat(){System.out.println("你要好好吃饭啊");
    }
}
7.4 模板方法设计模式

image.png

import java.time.format.TextStyle;

import javax.sound.midi.SysexMessage;

//模板方法设计模式
public class TemplateTest {public static void main(String[] args) {Template test = new SubTemplate();
        test.spendTime();
    }
  
}


//一个计算代码运行时间的类模板
abstract class Template{public void spendTime(){long start = System.currentTimeMillis();

        code();
        
        long end = System.currentTimeMillis();

        System.out.println("代码运行的时间为"+(end - start));
    }

    public abstract void code();
}


class SubTemplate extends Template{@Override
    public void code() {// TODO Auto-generated method stub
        for(int i = 2;i<=1000;++i){boolean isPrime = true;
            for(int j = 2;j<=Math.sqrt(i);++j){if((i%j==0)){isPrime = false;
                }
            }
            if(isPrime){System.out.println(i);
            }
        }
        
    }

}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:Java面向对象(下)-创新互联
文章起源:http://myzitong.com/article/ceocse.html