Java学习笔记 day1

ps是开博记录的day1 其实已经学了一小段时间java基础

static关键字的使用

static 静态的
static 可以用来修饰:属性、方法、代码块、内部类
使用static 修饰属性:静态变量/类变量。
3.1 属性,按是否使用static修饰,又分为静态属性 和非静态属性(实例变量)

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

静态变量:创建类的多个对象,每一个对象都共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是被修改过得。

3.2 static 修饰属性的其他说明:

①静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
②静态变量的加载要早于对象的创建
③由于类只会加载一次,则静态变量在内存中也只会存在一份。存在在方法区的静态域中。
④             类变量        实例变量

    类        yes                no

    对象       yes               yes

类变量 vs 实例变量的内存解析

4.使用static修饰的方法:静态方法

① 随着类的加载而加载,可以通过 "类.静态方法" 的方式进行调用

②             静态方法        非静态方法

    类        yes                no

    对象       yes               yes

③ 静态方法中,只能调用静态的方法或属性

    非静态方法中,既可以调用静态的也可以调用

    非静态的方法和属性


  1. static 注意点:

    在静态的方法内,不能使用this、super关键字

  1. 开发中如何确定一个属性是否要声明为static?

属性是可以被多个对象共享的,不随着对象的不同而不同的
开发中如何确定一个方法是否要声明为static?
操作静态属性的方法,通常设置为static的
工具类中的方法,习惯上声明为static的
eg: Math、Arrays、Collections

单例设计模式

要解决的问题

采取一定的方法,保证在整个软件系统中,对某个类只能存在一个对象实例。

具体代码的实现:

饿汉式:


//1.私化类的构造器

class Bank(){

private Bank(){

}



//2.内部创建类的对象

//4.要求此对象也必须声明为静态的

private static Bank instance = new Bank();



//3.提供公共的静态的方法,返回类的对象


public static Bank getInstance(){

        return instance;

}

}

懒汉式


class Order{

//1.私化类的构造器

private Order(){

//2.声明当前类的对象,不初始化

//4.此对象也必须声明为静态的



//3.声明public static的返回当前类对象的方法

public static Order getInstance(){

    if(instance == null){

            instance = new Order();

    }

    return instance;

}

两种方式的对比

饿汉式:

坏处:对象加载时间过长

好处:饿汉式是线程安全的

懒汉式:

好处:延迟对象的创建

目前写法的坏处:线程不安全 --->到多线程内容时再修改

main()方法的使用说明

main() 方法作为程序的入口
main() 方法加上static也是一个普通的静态方法
main() 方法可以作为我们与控制台交互的方式(之前,用Scanner)

代码块

代码块的作用

初始化类、对象的信息

分类

代码块如果使用修饰符,只能用static

静态代码块 vs 非静态代码块

实例化子类对象时,涉及到子父类中静态代码块,非静态代码块,构造器的加载顺序

由父及子,静态先行。

父类静态代码块 → 子类静态代码块 → 父类非静态代码块、构造器的执行 → 子类非静态代码块、构造器的执行

对属性可赋值的位置:

默认初始化
显示初始化
构造器中初始化
有了对象后,通过“对象.属性”或“对象.方法”的方式进行赋值
在代码块中赋值

执行的先后顺序 1 →2/5 → 3 → 4

final

可以用来修饰:

类、方法、变量(属性、局部变量)

具体的

final用来修饰一个类:此类不能被其他类所继承

        比如:String System StringBuffer

final用来修饰方法:此方法不可以被重写

        比如:Object类中的getClass();

final用来修饰变量:此时“变量”就称为是一个常量

        ①修饰属性

        ②修饰局部变量

            尤其是使用final修饰形参时,表明此形参

            是一个常量。当调用此方法时,给常量形

            参赋一个实参,一旦赋值,就只能在方法体内使用此形参,但不能重新赋值。


static final 用来修饰属性:全局常量

抽象类 abstract关键字

用来修饰 类和方法

abstract用来修饰的类 称为 抽象类

此类不能实例化
抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作

——> 抽象的使用前提 :继承性

abstract修饰方法:抽象方法

抽象方法只有方法的声明,没有方法体
包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法
若子类重写了父类中所有的抽象方法后,此子类方可实例化

 若子类没有重写父类中所有的抽象方法,则此子类也是一个抽象类,需要用abstract修饰


注意点

abstract不能用来修饰属性、构造器等结构
也不能修饰private方法,static方法,final的方法,final的类

模板方法设计模式

在软件开发中实现一个算法时,整体步骤很固定、通用,这些步骤已经在父类中写好了。但是某些部分易变,易变部分可以抽象出来,供不同的子类实现。这就是一种模板模式。

接口

概述

由于java不支持多重继承,有了接口,就可以得到多重继承的效果

接口使用interface来定义

Java中,接口和类是两个并列的结构

一个类可以实现多个接口

如何定义接口:定义接口中的成员

JDK7以前,只能定义全局常量和抽象方法

全局常量:public static final的 但书写时,可以省略

抽象方法:public abstract的

JDK8:除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法

接口中不能定义构造器的,意味着接口不能实例化

implements

Java开发中,接口通过让类去实现(implements)的方式来使用

如果实现类覆盖了接口中所有的抽象方法,则此实现类就可以实例化

如果实现类没覆盖接口中所有的抽象方法,则此实现类仍未一个抽象类

Java可以实现多个接口

弥补了单继承性的局限性

格式:class AA extends BB implements CC,DD,EE

**接口与接口之间可以继承,而且可以多继承

接口的具体使用,体现多态性

接口,实际上可以看做是一种规范

**体会面向接口编程

内部类

Java允许将一个类A声明在另一个类B中,则类A就是内部类,B称为外部类

你可能感兴趣的:(java学习笔记)