14.Java学习笔记第十四节——面向对象<下>(一)(尚硅谷视频整理)

文章目录

  • 一、static 关键字
      • 1.使用范围
      • 2. static 修饰属性
            • (1)实例变量
            • (2)静态变量
            • (3)如以下代码
            • (4)说明
            • (5)内存解析
      • 3. static 修饰方法
            • (1)调用方法
            • (2)调用关系
            • (3)以下代码
            • (4)注意
      • 4.如何确定是否使用 static
            • (1)属性
            • (2)方法
  • 二、单例 (Singleton)设计模式
      • 1.定义
            • (1)设计模式
            • (2)类的单例设计模式
            • (3)单例设计模式设计思想
      • 2.饿汉式
      • 3.懒汉式
      • 4.饿汉式与懒汉式的对比
      • 5.单例模式应用场景
  • 三、main方法的语法
  • 四、类的成员之四:代码块 block(初始化块)
      • 1.作用
      • 2.形式
      • 3.分类
  • 五、final 关键字
      • 1.作用范围
      • 2.final 修饰类
      • 3.final 修饰方法
      • 4.final 修饰变量
      • 5.static final
      • 6.举例


一、static 关键字

1.使用范围

在Java类中,可用 static 修饰属性、方法、代码块、内部类。

2. static 修饰属性

属性按照是否使用 static 修饰,又分为:静态属性(类变量)和非静态属性(实例变量)。

(1)实例变量

我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态变量。当修改其中一个对象的非静态属性时,不会导致其他对象中同样的属性值的修改。

(2)静态变量

我们创建了类的多个对象,多个对象共享一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。

(3)如以下代码
public class StaticTest
{public static void main(String[] args){Chinese c1=new Chinese();c1.name="花花";c1.age=30;c1.nation="CHN";Chinese c2=new Chinese();c2.name="华晨宇";c2.age=27;c2.nation="China";Ststem.out.println(c1.nation);  //此时输出结果是"China"}
}
class Chinese
{string name;int age;static String nation;
}
(4)说明
  • 静态变量随着类的加载而加载。
  • 静态变量加载早于对象的创建。访问权限允许时,可不创建对象,直接被类调用: Chinese.nation="CHN";
  • 由于类只加载一次,所以静态变量在内存中也只会存在一份,存在方法区的静态域中。
(5)内存解析

在这里插入图片描述

3. static 修饰方法

(1)调用方法

没有对象的实例时,可以用类名.方法名()的形式访问由static修饰的类方法。

(2)调用关系

静态方法中只能调用静态的方法和属性;非静态方法中既可以调用静态的方法和属性,也可以调用非静态的方法和属性;

(3)以下代码
class Chinese
{public void sing(){System.out.println("华晨宇鸟巢演唱会连开第一人");public static void show(){sing(); //是错误的System.out.println(nation);//是正确的,nation前省略的不是this.而是Chinese.System.out.println("华晨宇演唱会太嗨了!");
}
(4)注意
  • 在静态方法内,不能使用this 、super 关键字。(此时还没有对象)
  • static修饰的方法不能被重写。

4.如何确定是否使用 static

(1)属性
  • 属性是可以被多个对象共享的,不会随着对象的不同而不同的。
  • 类中的常量也常常声明为static。
(2)方法
  • 操作静态属性的方法,通常设置为 static 的。
  • 工具类中的方法,习惯声明为 static 的。

二、单例 (Singleton)设计模式

1.定义

(1)设计模式

是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模免去我们自己再思考和摸索。就像是经典的棋谱,不同的棋局,我们用不同的棋谱。”套路”

(2)类的单例设计模式

就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。

(3)单例设计模式设计思想

如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。

2.饿汉式

class Singleton 
{private Singleton()   // 1.私有化构造器{}private static Singleton single = new Singleton(); //2.内部提供一个当前类的实例  4.此实例也必须静态化public static Singleton getInstance() // 3.提供公共的静态的方法,返回当前类的对象{return single;} 
}

3.懒汉式

class Singleton 
{private Singleton() // 1.私有化构造器{}private static Singleton single=null;  //2.声明当前类的对象,没有初始化 4.此实例也必须静态化public static Singleton getInstance() 	// 3.提供公共的静态的方法,返回当前类的对象{if(single == null) {single = new Singleton();}return single; }
}

4.饿汉式与懒汉式的对比

好处坏处
饿汉式线程安全对象加载时间过长
懒汉式延迟对象的创建目前写法线程不安全(多线程时修改)

5.单例模式应用场景

  • 网站的计数器 ,一般也是单例模式实现,否则难以同步。

  • 应用程序的日志应用 ,一般都使用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

  • 数据库连接池 的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。

  • 项目中, 读取配置文件的类 ,一般也只有一个对象。没有必要每次使用配置文件数据,都生成一个对象去读取。

  • Application 也是单例的典型应用。

  • Windows的Task Manager (任务管理器) 就是很典型的单例模式。

  • Windows的Recycle Bin (回收站) 也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。


三、main方法的语法

1.main()方法作为程序的入口。
2.main()方法也是一个普通的静态方法。

public class MainTest
{public static void main(String[] args){Main.main(new String[100]);}
}
class Main
{public static void main(String[] args){for(int i=0;i<args.length;i++){args[i]="args_"+i;System.out.println(args[i]);}}
}

3.main()方法可以作为我们与控制台交互的方式。(之前使用过Scanner)


四、类的成员之四:代码块 block(初始化块)

1.作用

对Java类或对象进行初始化。

2.形式

以一对大括号的形式展现

{
}

3.分类

代码块只能用 static 修饰,故分为 ① 静态代码块:

static{
}

(1)内部可以有输出语句。
(2)随着类的加载而执行,而且只执行一次。
(3)初始化类的信息。
(4)如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行。
(5)静态代码块先于非静态代码块执行。
(6)静态代码块只能调用静态属性、方法。

② 非静态代码块:

{
}

(1)内部可以有输出语句。
(2)随着对象的创建而执行,每创建一次就执行一次非静态代码块。
(3)可以在创建对象时,对对象的属性等进行初始化。
(4)如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行。
(5)非静态代码块既可以调用静态属性、方法,又可以调用非静态属性、方法。

于是对属性赋值的位置又多了一种,即在代码块中赋值。

代码块的执行先于构造器。


五、final 关键字

1.作用范围

在Java中声明类、变量和方法时,可使用关键字final来修饰,表示“最终的”。

2.final 修饰类

  • final标记的类不能被继承,如 String类、System类、StringBuffer类 。

3.final 修饰方法

  • final标记的方法不能被子类重写。比如:Object类中的getClass()。

4.final 修饰变量

  • final标记的变量(成员变量或局部变量)即称为常量。名称大写,且只能被赋值一次。

    • final修饰属性:可以考虑赋值的位置 显示初始化、构造器中初始化、代码块中初始化。
final int a=0;//显示初始化final int b;
{b=1;
}//代码块中赋值final c;
public FinalTest()
{c=2;
}//构造器中赋值
  • final修饰局部变量:尤其是修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参。一旦赋值以后,就只能在方法体内使用此形参,但不能重新赋值。

5.static final

static final 共同修饰一个属性:全局常量。

6.举例

public class Something {
public int addOne(final int x) {
return ++x;     //错误,因为修改了x的值
// return x + 1;   //正确,只返回x+1后的值,并未修改x
} }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部