首页 > 其他分享 >面向对象(四)

面向对象(四)

时间:2023-07-29 21:31:38浏览次数:20  
标签:变量 静态 面向对象 static guoJi public name

1、static关键字

1.1、如果想让一个成员变量被类的所有实例共享,就可以用static修饰,它属于类的没一个对象,称为类变量。

例如,每个中国人的国籍都属于中国,那么就不需要对每个中国人的对象都创建一个国籍的属性。

1.2、在类中的方法必须通过类实例出对象才能调用,但是有些时候我们想不创建对象也能调用类里面的方法,这种我们称为类方法,需要在类的申明时给方法加上static关键字。

1.3、static可以修饰的结构:属性、方法、代码块、内部类。

==注意:静态方法不可以调用非静态变量,但是非静态方法可以调用静态变量或者静态方法,并且在调用的时候要通过通过类来调用,不建议使用对象来调用(也不可以使用this来调用相关的静态属性或者方法,因为this要在对象被创建后才有,针对的是某个具体的类,但是静态成员变量或者方法是属于整个类的,并不属于某个具体的对象,所以不可以这样调用。)==

如下的代码所示:

Chinese类:

public class Chinese {
    private static String guoJi = "中国!";
    String name;
    int age;


    public Chinese() {
    }

    public Chinese(String guoJi, String name, int age) {
        this.guoJi = guoJi;
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     *
     * @return guoJi
     */
    public static String getGuoJi() {
        return guoJi;
    }

    /**
     * 设置
     *
     * @param guoJi
     */
    public static void setGuoJi(String guoJi) {
        Chinese.guoJi = guoJi;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Chinese{guoJi = " + guoJi + ", name = " + name + ", age = " + age + "}";
    }

    //静态方法
    public static void showInformation(){
        System.out.println("我的国籍:" + Chinese.guoJi);
    }
    
}

测试类:

public class ChineseTest {
    public static void main(String[] args) {
        Chinese chinese = new Chinese();
        chinese.showInformation();          //不建议通过这种方式调用
        //应该通过类来调用
        Chinese.showInformation();
    }

}

输出结果:

我的国籍:中国! 我的国籍:中国!

静态变量在jdk7之前,存放在方法区中,在jdk7及以后,静态变量存放在堆区中。静态变量的消亡时间为随着类的卸载而消亡。

1.4、什么时候需要使用静态变量?

①、判断当前类的多个实例是否能够共享此成员变量,且共享的成员变量的值是相同的,因为静态变量一旦修改,就会修改整个类的。

②、开发中,常将一些常量声明是静态的,比如Math类中的PI

1.5、什么时候需要使用静态方法?

①、方法内操作的变量如果是静态变量(而非实例变量)的话,则此方法建议声明为静态方法。

②、开发中,工具类中的方法都声明为静态方法。

2、单例设计模式和对main的理解

2.1、设计模式是在大量的实践中总结和理论化之后优选的代码结构,编程风格,以及解决问题的思考方式。就像是经典的棋谱,不同的棋局,我们用不同的棋谱来解局。所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象的实例的方法。

2.2、实现类的单例设计模式的思路:把类的构造器权限设置为private,要获取类里面的东西,需要通过类来调用类里面的静态方法。

饿汉式单例模式:

public class Person1 {
    private static Person1 person1 = new Person1();
    private Person1(){}

    //返回对象
    public static Person1 getPerson1(){
        return person1;
    }
}

懒汉式单例模式:

public class Person2 {
    private static Person2 person2 = null;

    //获取对象
    public static Person2 getPerson2() {
        if (person2 == null) {
            person2 = new Person2();
        }
        return person2;
    }

}

两种写法的优缺点:

饿汉式:(优点)写法简单,由于在内存中较早加载,所以使用更方便,更快,是线程安全的。(缺点)内存中占用时间较长。==推荐使用这种方式。==

懒汉式:(优点)在调用时再创建,内存占用较低。(缺点)线程不安全。

2.3、main方法

2.3.1、用static修饰,表名main方法随着类的加载而加载。

2.3.2、形参的作用:与控制台交互

3、代码块(初始化块)

3.1、代码块的修饰:只能使用static进行修饰,也可以不使用。所以分为静态代码块和非静态代码块。

如下所示:

Person3类:

public class Person3 {

    public Person3() {
    }

    public String toString() {
        return "Person3{}";
    }

    //静态代码块
    static {
        System.out.println("我是静态代码块!");
    }

    //非静态代码块
    {
        System.out.println("我是非静态代码块!");
    }

    public void show() {
        System.out.println("我在吃饭!");
    }


}

测试类:

public class MyTest {
    public static void main(String[] args) {
        Person3 person3 = new Person3();
        person3.show();
    }
}

输出结果:

我是静态代码块! 我是非静态代码块! 我在吃饭!

静态代码(用于初始化类的信息)块只执行一次,而非静态代码块(用于初始化对象的信息)创建一个对象就会执行一次。静态代码块的调用方式和静态方法一样。

四、类中属性赋值的位置及过程

1、可以给类的非静态属性赋值的位置有:

①、默认初始化

②、显式初始化或代码块初始化

③、构造器中初始化

④、有了对象之后,通过方法进行对变量赋值

2、开发中如何选择上面的赋值方式?

①、当类中的属性在不同的对象中都相同的情况下,用显式初始化。

②、当类中的属性在不同的对象中不相同的情况下,用构造器初始化。

③、静态变量一般是在代码块中赋值。

五、final关键词

1、final关键字可以修饰的结构:类、方法、变量。

1.1、final修饰类,表示该类不可以被继承。

如下所示:

final public class Person {
    public void show(){
        System.out.println("我是父类");
    }
}

//下面的这种写法就是错误的,被final修饰的类不可以被继承
class Person1 extends Persson{
    
}

1.2、final修饰方法,表示该方法不能被重写。

public class Person {
    public final void show(){
        System.out.println("我是父类");
    }
}

1.3、final修饰变量,表示该变量就成为了一个常量,一旦被赋值过后就不可被修改(变量作为局部变量时,可以先声明,然后再赋值,只要在使用之前赋值就可,当作为形参的时候,不可以修改),与C++中的const相似。

1.4、那些地方可以对final成员变量赋值?

①、显式赋值

②、代码块赋值

③、构造器中赋值

1.5、final和static的混用:表示静态常量,如PI

标签:变量,静态,面向对象,static,guoJi,public,name
From: https://blog.51cto.com/u_15433911/6895648

相关文章

  • 笔记|《面向对象编程技术与方法(C++)》电子工业出版社
    第一章概述C++多态:https://blog.csdn.net/K346K346/article/details/82774937第二章编程基础数据类型枚举:https://www.runoob.com/w3cnote/cpp-enum-intro.html联合:https://www.runoob.com/cprogramming/c-unions.html作用域运算符:c++入门学习篇(1)之::作用域符解析c++条......
  • 面向对象编程的 SOLID 原则 - 里氏替换原则
    里氏替换原则里氏替换原则描述的是子类应该能替换为它的基类。意思是,给定classB是classA的子类,在预期传入classA的对象的任何方法传入classB的对象,方法都不应该有异常。这是一个预期的行为,因为继承假定子类继承了父类的一切。子类可以扩展行为但不会收窄。因此,当......
  • 面向对象编程的 SOLID 原则 - 依赖倒置原则
    依赖倒置原则依赖倒置原则描述的是我们的class应该依赖接口和抽象类而不是具体的类和函数。在这篇文章(2000)里,Bob大叔如下总结该原则:“如果OCP声明了OO体系结构的目标,那么DIP则声明了主要机制”。这两个原则的确息息相关,我们在讨论开闭原则之前也要用到这一模式。......
  • 面向对象编程的 SOLID 原则 - 接口隔离原则
    接口隔离原则隔离意味着保持独立,接口隔离原则是关于接口的独立。该原则描述了很多客户端特定的接口优于一个多用途接口。客户端不应该强制实现他们不需要的函数。这是一个简单的原则,很好理解和实践,直接看例子。publicinterfaceParkingLot{ voidparkCar(); //Decrease......
  • 面向对象编程的 SOLID 原则
    SOLID原则是面向对象class设计的五条原则。他们是设计class结构时应该遵守的准则和最佳实践。通常,这五个原则可以帮助我们了解设计模式和软件架构。这是每个开发人员都应该了解的主题。这篇文章介绍了在项目中使用SOLID原则的细节。首先我们先看一下SOLID原则的历史。......
  • Python面向对象编程-学习笔记(二)
    5.类的继承classEmployee:raise_amount=1.04def__init__(self,first,last,pay):self.first=firstself.last=lastself.pay=payself.email=first+'.'+last+'@company.com'cla......
  • 面向对象编程的 SOLID 原则 - 开闭原则
    开闭原则开闭原则要求“class应该对扩展开放对修改关闭”。修改意味着修改存在class的代码,扩展意味着添加新的功能。这个原则想要表达的是:我们应该能在不动class已经存在代码的前提下添加新的功能。这是因为当我们修改存在的代码时,我们就面临着创建潜在bug的风险。因此,......
  • Cache(十):面向对象基础 Cache(十一):面向对象开发
    常规概念都是一些基础概念,在学校学过很多遍了              事务 Cache面向对象的crud  cache110.40.52......
  • 面向对象的设计模式
    SOLID设计原则(面向对象)一句话归纳目的单一职责一个类或模块应该只有一个引起它变化的原因。一个类或模块应该只有一个主要职责,这样可以使代码更加清晰、易于理解和维护。开闭原则软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。强调在添加新功能时不需要修......
  • 设计模式:可复用面向对象软件的基础 pdf电子书分享
    《设计模式:可复用面向对象软件的基础》是引导读者走出软件设计迷宫的指路明灯,凝聚了软件开发界几十年设计经验的结晶。四位顶尖的面向对象领域专家精心选取了最具价值的设计实践,加以分类整理和命名,并用简洁而易于重用的形式表达出来。本书已经成为软件开发人员的圣经和词典,书中定......