ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022-07-27 第八组 卢睿 学习心得

2022-07-27 22:01:46  阅读:118  来源: 互联网

标签:27 07 静态 子类 实例 static 2022 println public


JAVA(静态,单例模式)

今日重点

  1. 代码块
  2. static静态
  3. 外部类
  4. 内部类
  5. 面对对象设计原理
  6. 单例模式
  7. 箭头函数

学习心得

今天学习的内容有些偏多,先是了解了类的内部结构,代码块,最主要的还是static静态,static可以配合很多的知识一起去使用,内部类就是在一个类内部进行其他类结构的嵌套操作,单例模式也可以当做是一个套路,可以用这个套路写代码,箭头函数式JDK8之后才有的,说新也不算新,但也不算久,感觉十分的简便,但也有代码的可读性。

学习内容

类的内部结构

属性、方法、构造器、代码块、内部类

代码块

代码块又称为初始化块,属于类的一个成员,它是将一些逻辑语句封装在方法体中通过{}包裹。
代码块没有方法名,没有参数,没有返回值,只有方法体
它是不需要通过对象或类进显式行的调用,它会在类加载或创建对象时主动的隐式调用

(1)静态代码块

一个类被加载时会被调用一次,做一些初始化的工作

(2)实例代码块

每次创建实例,都会被调用一次,用的很少

静态代码块
static {
        System.out.println("静态代码块");
    }
实例代码块
{
        System.out.println("实例代码块");
    }
面试题

当没有继承关系时,就一个类,静态块---实例块---构造器
当有继承关系时,父类静态块---子类静态块---父类的实例块---父类的构造器---子类的实例块---子类的构造器
父优于子,静态优于非静态

public class Ch02  {
    public Ch02() {
        System.out.println("子类的构造器");
    }

    {
        System.out.println("子类的实例块");
    }

    static {
        System.out.println("子类的静态块");
    }

    public static void main(String[] args) {
        new Ch02();
    }
}

打印输出:
子类的静态块
子类的实例块
子类的构造器

带有继承的
//父类
public class Father {
    public Father() {
        System.out.println("父类的构造器");
    }
    {
        System.out.println("父类的实例块");
    }
    static {
        System.out.println("父类的静态块");
    }

    public static void main(String[] args) {
        Father father = new Father();
    }
}
子类
public class Ch02 extends Father {
    public Ch02() {
        System.out.println("子类的构造器");
    }

    {
        System.out.println("子类的实例块");
    }

    static {
        System.out.println("子类的静态块");
    }

    public static void main(String[] args) {
        new Ch02();
    }
}

打印输出:
父类的静态块
子类的静态块
父类的实例块
父类的构造器
子类的实例块
子类的构造器

static静态 类属性,类方法

可以修饰:属性,方法,代码块
用static修饰的结构,不属于任何一个对象

static内存解析

  1. 静态的变量或者静态的方法存在于方法区的,静态的结构不会被垃圾回收
  2. 不属于某一个实例对象,只存在于方法区。调用静态结构,直接用类名.的方式

实例方法和静态方法法互相调用:

1.静态方法中可以直接调用实例方法吗? 不可以!!
如果想用,必须对象.方法名
2.实例方法中可以直接调用静态方法吗? 可以

静态的结构的加载,随着类的加载而加载
非静态的结构,随着对象的创建而加载

在java中调用实例方法,必须要有主体。方法不是一等公民,不能直接调用

静态方法无论在哪里都是类名.方法名调用,同一个类的静态方法之间可以省略类名的

静态方法没有重写这个概念的

接口中的常量默认public static final
开发中,基本上常量的声明都是public static final

eg

Arrays.toString();
Arrays.sort();

public class Ch03 {
    static String name = "里奥·梅西";

    {
        //实例代码块
//        fun();
        show();
    }
    public static void show(){
        //静态方法
        System.out.println("静态方法");
    }
    public static void main(String[] args) {
        System.out.println(Ch03.name);  //类名.属性名可以直接调用
        Ch03.show();
    }
}

this和super

无论是this还是super,都不可以在静态结构中使用

this和super。this.方法。 super.方法
静态结构是属于类的。静态结构是优先于对象就存在的。
this和super,必须有对象才能出现。必须得有实例

外部类

一个public声明的类,类名必须和.java的文件名相同
生成的.class文件是两个独立的.class
外部类就是两个类

public class Ch05 {
}

//外部类
class Outer{

}

类的组成结构

属性、方法、构造器、代码块(块),内部类

内部类:

在一个类内部进行其他类结构的嵌套操作

我们之前写过的链表,Node类其实主要就是给SuperLink,我们可以把Node类定义在SuperLinked中

public class Ch01 {
    static {
        System.out.println("外部列被加载");
    }
    //实例内部类
    public class Inner{
        {
            System.out.println("实例内部列被加载");
        }
        public void show(){

        }
        public Inner(){

        }
        class Innerinner{

        }
        private String name;
    }

    //静态内部类
    public static class InnerStatic{
        static {
            System.out.println("静态内部类被加载");
        }
    }

    public static void main(String[] args) {
        //这就是实例内部类的对象
        Inner inner = new Ch01().new Inner();

        //静态内部类的对象
        InnerStatic innerStatic = new Ch01.InnerStatic();
    }
}

设计模式

设计模式是人们为软件开发中抽象出可重复利用的解决方案
软件开发工程师之间沟通的“行话”

面对对象的设计原理

1. 开闭原则(Open Close Principle)
对扩展开放,对修改关闭(继承,实现接口)
我们可以通过“抽象约束,封装变化”来实现开闭原则。
通过接口或者抽象类为软件定义一个相对稳定的抽象层。
将相同的可变因素封装在相同的具体实现类中。派生一个实体类就可以了
2.里氏代换原则
子类继承父类时,除了添加新的方法完成新增的功能外,尽量不要重写父类的功能
3. 依赖倒转原则
要面向接口编程,不要面向实现编程

  • 每个类尽量提供接口或抽象类,或者两者兼备
  • 变量的类型声明尽量是接口或者是抽象类
  • 任何类都不应该从具体类派生
  • 使用继承是,要遵循里氏代换原则

4. 接口隔离原则
使用多个隔离的接口。
5. 迪米特法则
6. 合成复用原则
7. 单一原则:一个类只做一件事

单例模式

一个类只有一个实例

思路:
  1. 别人不能new,构造器私有化,不能在类的外部通过new去实例化
  2. 在该类内部产生一个唯一的实例对象,把它封装成static类型
  3. 定义一个静态方法返回这个唯一的对象
饿汉式单例模式

不管以后会不会使用到该实例化对象,先创建了再说,很着急的样子。
实现的办法就是直接new实例化。

public class Ch03 {
    private static Ch03 ch03 = new Ch03();

    private Ch03(){}

    public static Ch03 getInstance(){
        return ch03;
    }
}

懒汉式(延迟加载)

什么时候调用getInstance方法,什么时候new
这种懒汉式在多线程环境中完全错误,根本不能保证单例的状态,(需要加锁)

public class Ch04 {
    //将自身实例化对象设置为一个属性,现在是没有赋值的
    private static Ch04 ch04;

    //构造器私有化

    private Ch04() {
    }

    public static Ch04 getInstance(){
        if (ch04 == null){
            ch04 = new Ch04();
        }
        return ch04;
    }
}
内部类实现单例

也是懒汉式的一种,这种懒汉式没有线程的问题
结合了饿汉式和懒汉式的优点:
只要不调用getInstance方法,就不会使用内部类
内部类一旦被使用一次只会被初始化一次,以后一直用的是INSTANCE静态常量。

public class Ch05 {
    //私有化构造器
    private Ch05(){
    }
    public static Ch05 getInstance(){
        return SingletonHolder.INSTANCE;
    }
    private static class SingletonHolder{
        private static final Ch05 INSTANCE = new Ch05();
    }
}

箭头函数(JDK8的新特性)

函数式接口:如果一个接口只有一个抽象方法,这个接口就称为函数式接口。
可以用注解@FunctionalInterface标识

总结:

 * 1.有参数,有返回值
 * (i,j)->{
 *     return i+j
 * }
 * 如果方法体只是一句返回值(i,j)->i+j
 * 2.有参数,无返回值
 * (i,j)->{
 *     //方法体
 * }
 * 如果方法体只是一句话(i,j)->方法体的一句话
 * 3.无参数
 * ()->{
 *     方法体
 * }
 *
---
 * 第一部分:小括号包裹形参,类型不要
 * 第二部分: ->
 * 第三部分: ->方法体

标签:27,07,静态,子类,实例,static,2022,println,public
来源: https://www.cnblogs.com/lurui711/p/16526670.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有