首页 > 编程语言 >javaSE学习 day07

javaSE学习 day07

时间:2024-07-21 12:28:43浏览次数:16  
标签:day07 System 接口 final 学习 println javaSE public out

目录

1.final关键字

1.1final是什么

1.2final修饰类

1.3final修饰方法

1.4final修饰变量

1.5使用final需要注意什么

2.单例设计模式

2.1是什么

2.2作用

2.3饿汉单例

2.4懒汉单例

3.枚举

3.1是什么

3.2可以表达什么

3.3定义格式

3.4特点

3.5使用场景

4.抽象类

4.1什么是抽象类

4.2什么是抽象方法

4.3定义格式

4.4作用

4.5抽象类的注意事项

4.6模板方法设计模式

5.接口

5.1接口是什么

5.2接口的特点

5.3接口与接口的关系

5.3.1什么意思

5.3.2作用

5.3.3注意

5.4继承抽象类的同时实现多个接口

5.4.1类和类的关系

5.4.2类和接口的关系

5.4.3语法

5.5使用接口的好处

5.6小案例

5.7JDK8开始接口新增的方法

5.7.1默认方法

5.7.2静态方法

5.7.3私有方法

5.8使用接口的注意事项


1.final关键字

1.1final是什么

最终的意思

1.2final修饰类

该类被称为最终类,特点是不能被继承了。

// 演示1:final修饰类 叫最终类 不能被继承
final class  LiLianying{}
class LiGang extends LiLianying{}//报错

1.3final修饰方法

该方法被称为最终方法,特点是不能被重写了。

//演示2:final修饰方法 叫最终方法 不能被重写
class ZZK{
    public final void jiMi(){
        System.out.println("重要的情报");
    }
}
class ZSF extends ZZK{
   // 方法不能被重写了
//    public void jiMi() {
//        System.out.println("变成擦屁股纸...");
//    }

1.4final修饰变量

该变量有且仅能被赋值一次。

// 演示3: final修饰变量  最终变量 指的是只能赋值一次
      final int a = 10;//final修饰基本数据类型特点: 变量的数值不能变
//      a = 20;  被final修饰的变量只能赋值一次

1.5使用final需要注意什么

final修饰基本数据类型的变量,其存储的数据不能改变。final修饰引用类型的变量,其存储的地址不能改变,但是指向的对象内容可以改变。

//数组是引用类型  final修饰引用类型数据的特点: 变量的指向地址不能变,里面内容可以变
        final int[] arr = new int[]{1,2,3};
        System.out.println(arr);
//         arr = new int[]{2,3,4};
//        System.out.println(arr);
        arr[1] = 5;

2.单例设计模式

2.1是什么

是为了解决某个问题的方案

2.2作用

保证一个类对外只能产生一个对象。

2.3饿汉单例

拿对象时,对象早就创建好了。

步骤:

(1)私有构造

(2)定义一个类变量记住类的一个对象

(3)定义一个类方法返回对象

public class A {
    // 创建 私有 构造器
    private A() {
    }

    //创建私有类变量a
    private static A a=new A();

    //创建公共方法,返回变量
    public static A instance(){
        return a;
    }
}
public static void main(String[] args) {
        A a1=A.instance();
        A a2=A.instance();
        System.out.println(a1);
        System.out.println(a2);
    }

2.4懒汉单例

拿对象时,才开始创建对象。

步骤:

(1)私有构造

(2)拿对象时,才开始创建对象。

(3)提供一个静态方法,保证返回的是同一个对象。

//懒汉式
public class B {

    // 1、单例必须私有构造
    private B(){
    }

    // 2、定义一个类变量量用于存储对象
    private static B b;

    // 3、提供一个类方法返回类的一个对象
    public static B getInstance(){
        if (b==null){
            b=new B();
        }
        return b;
    }
}
public static void main(String[] args) {
        B b1=B.getInstance();
        B b2=B.getInstance();
        System.out.println(b1);
        System.out.println(b2);
    }

 

3.枚举

3.1是什么

是一个特殊的类。可以看做是包含特定对象的"集合",设定好之后该类型只包含特定个数的对象。

3.2可以表达什么

可以表达有固定数量的类型,比如季节,星期,性别,交通灯等....

3.3定义格式

修饰符 enum 枚举类名{
    名称1,名称2...;
}

public enum A{
    X,Y,Z;
}

3.4特点

【1】枚举类中的第一行,只能写枚举类的对象名称,且要用逗号隔开。

【2】这些名称,本质是常量,每个常量都记住了枚举类的一个对象。

【3】枚举都是最终类,不可以被继承,枚举类都是继承java.lang.Enum类的。

【4】枚举类的构造器都是私有的(写不写都只能是私有的),因此,枚举类对外不能创建对象。

3.5使用场景

枚举类很适合做信息分类和标志。

控制方向场景

public enum Direction {
    UP,DOWN,LEFT,RIGHT;
}
public class Constant {
    public static final int UP=1;
    public static final int DOWN=2;
    public static final int LEFT=3;
    public static final int RIGHT=4;
}
public static void main(String[] args) {
        move(0);
        System.out.println("==================");
        move2(Direction.UP);
        move2(Direction.DOWN);
        move2(Direction.LEFT);
        move2(Direction.RIGHT);
    }
public static void move2(Direction direction){
        switch (direction){
            case UP:
                System.out.println("上");
                break;
            case DOWN:
                System.out.println("下");
                break;
            case LEFT:
                System.out.println("左");
                break;
            case RIGHT:
                System.out.println("右");
                break;
        }
    }

4.抽象类

4.1什么是抽象类

abstract修饰类,这个类就是抽象类。

4.2什么是抽象方法

abstract修饰方法,这个方法就是抽象方法。只有方法签名,不能写方法体。

4.3定义格式

修饰符 abstract class 类名{     修饰符 abstract 返回值类型 方法名称(形参列表);  }

public abstract class A{
    public abstract void test();
}

4.4作用

被子类继承。如果父类知道子类一定要做这件事,但是每个子类做的不一样,父类可以声明抽象方法,交给子类重写来实现。这个类就是抽象类了。

4.5抽象类的注意事项

【1】抽象类中不一定要有抽象方法,有抽象方法的类必须是抽象类。

【2】类有的成员:成员变量、方法、构造器,抽象类都可以有。

【3】抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现。

【4】一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类。

【5】不能用abstract修饰变量、代码块、构造器。

4.6模板方法设计模式

父类知道每个子类都要做某个行为,但每个子类要做的情况不一样,父类就定义成抽象方法,交给子类去重写实现,我们设计这样的抽象类,就是为了更好的支持多态。

public abstract class ZwModel {
    public void write(){
        System.out.println("《我的区长爸爸》");
        writeMain();
        System.out.println("他真厉害!");
    }

    public abstract void writeMain();
}
public class MyZw extends ZwModel{

    @Override
    public void writeMain() {
        System.out.println("我爸爸手眼通天哈哈哈");
    }
}
public class YouZw extends ZwModel{
    @Override
    public void writeMain() {
        System.out.println("我好羡慕你爸爸");
    }
}
public static void main(String[] args) {
        MyZw myZw=new MyZw();
        myZw.write();
        System.out.println("===============================");
        YouZw youZw=new YouZw();
        youZw.write();
    }

 

5.接口

5.1接口是什么

使用interface关键字定义的一种结构, JDK 8之前,接口中只能定义成员变量和成员方法。

public interface Driver

5.2接口的特点

【1】接口不能创建对象;接口是用来被类实现(implements)的,实现接口的类称为实现类。

【2】一个类可以实现一个或多个接口,实现类实现多个接口,必须重写完全部接口中的全部抽象方法,否则实现类需要定义成抽象类。

5.3接口与接口的关系

多继承

5.3.1什么意思

一个接口可以同时继承多个接口

5.3.2作用

规范合并,整合多个接口为同一个接口,便于子类实现。

5.3.3注意

实现子接口名的类必须实现后面所有接口中的所有抽象方法。

public interface Driver extends ha
//ha也为接口

5.4继承抽象类的同时实现多个接口

5.4.1类和类的关系

单继承

5.4.2类和接口的关系

多实现

5.4.3语法

修饰符 class 实现类 extends 父类 implement 接口1,接口2....{}

5.5使用接口的好处

【1】弥补了类单继承的不足,一个类在单继承的同时还可以实现多个接口。

【2】让程序可以面向接口编程,这样程序员就可以灵活方便的切换各种业务实现(多态思想)。

5.6小案例

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private String name;
    private char sex;
    private double score;
}
public interface ClassDataOp {
    void All(Student[] students);
    void avg(Student[] students);
}
public class Op1 implements ClassDataOp{
    @Override
    public void All(Student[] students) {
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            System.out.println(student.getName() + " " + student.getScore() + " " + student.getSex());
        }
    }

    @Override
    public void avg(Student[] students) {
        double sum = 0;//定义求和变量
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            sum += student.getScore();//求和
        }
        System.out.println("平均成绩:" + sum / students.length);
    }
}
public class Op2 implements ClassDataOp{
    @Override
    public void All(Student[] students) {
//定义统计男生人数的变量
        int count = 0;
        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            System.out.println(student.getName() + " " + student.getScore() + " " + student.getSex());
            if (student.getSex() == '男') {
                count++;
            }
        }
        System.out.println("男生人数:" + count);
        System.out.println("女生人数:" + (students.length - count));
    }

    @Override
    public void avg(Student[] students) {
        double sum = 0;//定义求和变量
        //定义最高分
        double max = students[0].getScore();
        //定义最低分
        double min = students[0].getScore();

        for (int i = 0; i < students.length; i++) {
            Student student = students[i];//获取每个学生
            sum += student.getScore();//求和
            //求最大值
            if (student.getScore() > max) {
                max = student.getScore();
            }
            //求最小值
            if (student.getScore() < min) {
                min = student.getScore();
            }
        }
        System.out.println("平均成绩:" + (sum-max-min) / (students.length-2));
    }
}
    public static void main(String[] args) {
        //1:创建5个学生对象
        Student s1 = new Student("张三",  '男',100);
        Student s2 = new Student("李四", '女',80 );
        Student s3 = new Student("王五", '男',90);
        Student s4 = new Student("赵六", '女',70);
        Student s5 = new Student("田七", '男',60);
        Student[] student= {s1, s2, s3, s4, s5};
        ClassDataOp op=new Op2();
        op.All(student);
        op.avg(student);
    }

5.7JDK8开始接口新增的方法

5.7.1默认方法

类似之前写的普通实例方法:必须用default修饰。默认会public修饰。需要用接口的实现类的对象来调用。

default void defaultMethod(){
    System.out.println(“接口中的默认方法”);
}

5.7.2静态方法

默认会public修饰,必须static修饰。接口的静态方法必须用本身的接口名来调用。

static void staticMethod(){
    System.out.println(“接口中的静态方法”);
}

5.7.3私有方法

必须使用private修饰,从JDK 1.9才开始有的。根据是否有static关键字修饰,私有方法可以分为非静态私有方法和静态私有方法。非静态私有方法只能在本类中被其他的默认方法或者私有方法访问。静态私有方法还能在本类的其他静态方法中访问。

private void privateMethod(){
    System.out.println(“接口中的私有方法”);
}

5.8使用接口的注意事项

【1】接口不能创建对象

【2】一个类实现多个接口,多个接口的规范不能冲突

【3】一个类实现多个接口,多个接口中有同样的静态方法不冲突。

【4】一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。

【5】一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。

【6】一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。

标签:day07,System,接口,final,学习,println,javaSE,public,out
From: https://blog.csdn.net/zhangnobill/article/details/140582815

相关文章

  • springcolud学习02
    新建consumer模型修改一下模型pom.xml<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven......
  • 2-SAT学习笔记
    Part0:前置知识Tarjan求SCCPart1:初识2-SATsat即Satisfiability(可满足性问题),2-set问题指对于一串布尔变量,其只有True和False两种取值,在满足若干个约束条件的前提下,对变量赋值举个栗子:A、B、C去吃早餐小A认为一顿好早餐应该菜品多(a)或味道好(b)小B认为一顿好早餐应......
  • 毕业设计-基于Springboot+Vue的书籍学习平台的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89461637基于SpringBoot+Vue的书籍学习平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1hD0YW5GABG1VnZVodbEMjw?pwd=l3......
  • 深度学习印章检测(自动生成数据集+yolov5)
    目录1概述1.1简介1.2演示2软件安装3数据集3.1生成随机字符3.2生成印章图片3.3生成word文件3.4Word转PDF文件3.5PDF转图像4labelme标记5yolov5训练1概述本文将从代码层面的角度来剖析印章数据集如何自动生成,以及如何进行训练与测试,如果希望获取直......
  • 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()
    我正在尝试将单层感知器分类器的Python实现放在一起。我发现SebastianRaschka的《Python机器学习》一书中的示例非常有用,但我对他的实现的一小部分有疑问。这是代码:importnumpyasnpclassPerceptron(object):"""Perceptronclassifier.Parameters......
  • 【机器学习】智能驱动未来:机器学习在能源效率提升与环境管理中的创新应用
    ......
  • 机器学习中的梯度下降
    梯度下降算法: 梯度下降是一种广泛应用于优化机器学习模型参数的方法,目的是找到使损失函数最小化的参数值组合。 首先,损失函数用于衡量模型预测值与真实值之间的差异。假设我们有一个线性回归模型     ,损失函数可以是均方误差        ,其中 是样本数量......
  • 深度学习图解,第 1 部分:神经网络如何工作?神经网络的图解和直观介绍
            欢迎来到雲闪世界。神经网络是一种机器学习模型。这只是我计划撰写的关于深度学习的整个系列文章的第一篇。它将重点介绍一个简单的人工神经网络如何学习,并为您提供对神经网络如何逐个神经元构建的深入(哈哈,双关语)理解,这在我们继续构建这些知识时至关重......
  • 计算机毕业设计Python+Spark新能源汽车推荐系统 汽车大数据 汽车数据分析 汽车可视化
    表2黄河交通学院本科毕业设计(论文)开题报告学生姓名刘丹杰专业班级20本大数据一班学号2080910T01521设计(论文)题目基于Hadoop的新能源汽车销售数据分析系统的设计与实现选题的目的和意义:选题目的:新能源汽车销售数据分析系统的设计与实现旨在利用Hadoop等大数......
  • 学习Java的第三周
    第三周的学习记录虽迟但到!已经学会开发集成环境idea的基本用法啦,(根据生活指导貌似还要下载一个Eclipse),idea的项目结构:project项目>module模块>package包>class类。具体新建方式写在我的笔记中喽,还要一些扩展设置比如背景色,字体、注释色,自动导包,忽略大小写等等都在笔记里。类相关操......