自学Java第11Day

news2024/11/15 8:14:22

学习目标:面向对象进阶


学习内容:包、final、权限修饰符、代码块、抽象类、接口


学习时间:

     下午 3 点-下午 6 点


学习产出:

什么的包?

        包就是文件夹。用来管理各种不同功能的Java类,方便后期代码维护。

        包名的规则:公司域名反写+包的作用,需要全部英文小写,见名知意。

什么是全类包?

        包名+类名

使用其他类的规则

        使用同一个包中的类时,不需要导包。

        使用java.lang包中的类时,不需要导包。

         其他情况都需要导包。

         如果同时使用两个包中的同名类,需要用全类名。


final

        final修饰方法:表明该方法是最终方法,不能被重写。
        final修饰类:表明该类是最终类,不能被继承。
        final修饰变量:叫做常量,只能被赋值一次。

        此时就可发现父类中的show()方法被final修饰,子类无法重写父类中的方法。 

        此代码中就可发现被final修饰的变量,不能被修改。 

常量:

        实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性。

        常量的命名规范:

                单个单词:全部大写。

                多个单词:全部大写,单词之间用下划线隔开。

细节:

        final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

        final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,对象内部的可以改变。 

public class Test {
    public static void main(String[] args) {
        //创建对象
        final Student S = new Student("旭哥", 23);
        //记录的地址值不能发生改变,内部的属性值还是可以改变的
        // S = new Student();
        S.setName("蛋姐");
        S.setAge(21);
        System.out.println(S.getName() + ", " + S.getAge());

        //数组
        final int[] ARR = {1, 2, 3, 4, 5};
        ARR[0] = 10;
        ARR[1] = 20;

        //遍历数组
        for (int i = 0; i < ARR.length; i++) {
            System.out.println(ARR[i]);
        }
    }
}

运行结果:

蛋姐, 21
10
20
3
4
5

final应用场景

        在之前我们写过一个学生管理系统,在代码中有一段代码实现的是目录,为了让代码阅读性更强,可将switch循环中的case选项final私有化定义,可将数字命名为可读性更强的英文。


权限修饰符

        权限修饰符:是用来控制一个成员能够被访问的范围的。

        可以修饰成员变量,方法,构造方法,内部类。

权限修饰符的分类

        有四种作用范围由小到大(private<空着不写<protected<public)

修饰符同一个类中同一个包中
其他类
不同包下的
子类
不同包下的
无关类
private\sqrt{}
空着不写\sqrt{}\sqrt{}
protected\sqrt{}\sqrt{}\sqrt{}
public\sqrt{}\sqrt{}\sqrt{}\sqrt{}

代码块

       局部代码块: 局部代码块是在方法内部定义的,它的作用域仅限于该方法内。局部代码块通常用于定义方法内的控制流,例如条件语句(if-else)、循环(for、while)等。

public class Test {
public static void main(String[] args) {
        {
            int a = 10;
            System.out.println(a);
        }
    }
}

        构造代码块:构造代码块是在类中定义的,它在类的构造函数之前执行。如果有多个构造函数,构造代码块会在每个构造函数执行之前运行。它用于初始化类的实例变量。

public class Student {
    private String name;
    private int age;
    {
        System.out.println("开始创建对象了");
    }

    public Student() {
        System.out.println("空参构造");
    }

    public Student(String name, int age) {
        System.out.println("有参构造");
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        //创建对象
        Student s=new Student();
        Student s2=new Student("旭哥",23);
    }
}

运行结果:

开始创建对象了
空参构造
开始创建对象了
有参构造

        静态代码块:静态代码块是在类中定义的,它在类被加载到JVM时执行一次,且仅执行一次。它主要用于初始化类的静态变量。

public class Student {
    private String name;
    private int age;
    static {
        System.out.println("开始创建对象了");
    }

    public Student() {
        System.out.println("空参构造");
    }

    public Student(String name, int age) {
        System.out.println("有参构造");
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        //创建对象
        Student s=new Student();
        Student s2=new Student("旭哥",23);
    }
}

运行结果:

开始创建对象了
空参构造
有参构造

抽象类

        抽象方法:将共性的行为(方法)抽取到父类之后。由于每一个子类执行的内容是不一样,所以,在父类中不能确定具体的方法体。该方法就可以定义为抽象方法。

        抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

抽象类和抽象方法的定义格式

        抽象方法的定义格式:
                public abstract      返回值类型 方法名(参数列表);
        抽象类的定义格式:
                public abstract class     类名

public abstract class Person {
    public abstract void work();
}

抽象类和抽象方法的注意事项

        抽象类不能实例化。
        抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类。
        可以有构造方法。
        抽象类的子类:
                要么重写抽象类中的所有抽象方法。
                要么是抽象类。

练习:编写带有抽象类的标准Javabean类

青蛙frog                属性:名字,年龄                        行为:吃虫子,喝水

狗Dog                   属性:名字,年龄                        行为:吃骨头,喝水

山羊Sheep            属性:名字,年龄                        行为:吃草,喝水

public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public abstract void eat();
    public void drink(){
        System.out.println("动物在喝水");
    }
}
public class Dog extends Animal{
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("狗在啃骨头");
    }
}
public class Frog extends Animal{
    public Frog() {
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子");
    }
}
public class Sheep extends Animal{
    public Sheep() {
    }

    public Sheep(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("山羊在吃草");
    }
}
public class Test {
    public static void main(String[] args) {
        Sheep s=new Sheep("喜羊羊",2);
        s.eat();
        s.drink();
    }
}

运行结果:

山羊在吃草
动物在喝水

接口

        在Java中,接口(Interface)是一种引用类型,它定义了一组方法规范,这些方法规范可以由实现该接口的类来具体实现。接口是Java面向对象编程的核心概念之一,它提供了一种机制来实现抽象和多态。

接口的定义和使用

        接口用关键字interface来定义
                public interface 接口名{}
        接口不能实例化

        接口和类之间是实现关系,通过implements关键字表示
                public class 类名 implements 接口名{}
        接口的子类(实现类)
                要么重写接口中的所有抽象方法
                要么是抽象类

注意1:接口和类的实现关系,可以单实现,也可以多实现。
        public class 类名 implements 接口名1,接口名2{}

注意2:实现类还可以在继承一个类的同时实现多个接口。
        public class 类名 extends 父类 implements 接口名1,接口名2}

练习:编写带有接口和抽象类的标准Javabean类

青蛙           属性:名字,年龄        行为:吃虫子,蛙泳

狗               属性:名字,年龄        行为:吃骨头,狗刨

兔子            属性:名字,年龄        行为:吃胡萝卜

public abstract class Animal {
    private String name;
    private int age;

    public Animal() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public abstract void eat();

}
public interface Swim {
    public abstract void swim();
}

public class Dog extends Animal implements Swim{
    public Dog() {
    }

    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("狗在啃骨头");
    }

    @Override
    public void swim() {
        System.out.println("狗在狗刨");
    }
}

public class Frog extends Animal implements Swim{
    public Frog() {
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子");
    }

    @Override
    public void swim() {
        System.out.println("青蛙在蛙泳");
    }
}
public class Frog extends Animal implements Swim{
    public Frog() {
    }

    public Frog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println("青蛙在吃虫子");
    }

    @Override
    public void swim() {
        System.out.println("青蛙在蛙泳");
    }
}
public class Test {
    public static void main(String[] args) {
        Rabbit s=new Rabbit("喜羊羊",2);
        System.out.println(s.getName()+","+s.getAge());
        s.eat();
        Dog d=new Dog("维鲁斯",3);
        System.out.println(d.getName()+","+d.getAge());
        d.eat();
        d.swim();
    }
}

运行结果:

喜羊羊,2
兔子在吃胡萝卜
维鲁斯,3
狗在啃骨头
狗在狗刨

接口中成员的特点

         成员变量
                只能是常量
                默认修饰符:public static final
        构造方法
                没有

        成员方法
                只能是抽象方法
                默认修饰符:public abstract

        JDK7以前:接口中只能定义抽象方法。

        JDK8的新特性:接口中可以定义有方法体的方法。

        JDK9的新特性:接口中可以定义私有方法。

接口和类之间的关系

        类和类的关系
                继承关系,只能单继承,不能多继承但是可以多层继承
         类和接口的关系
                实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
         接口和接口的关系
                继承关系,可以单继承,也可以多继承

练习:编写带有接口和抽象类的标准Javabean类

        我们现在有乒乓球运动员和篮球运动员,乒乓球教练和篮球教练。

        为了出国交流,跟乒乓球相关的人员都需要学习英语。

        请用所有知识分析,在这个案例中,哪些是具体类,哪些是抽象类,哪些是接口?

                乒乓球运动员:姓名,年龄,学打乒乓球,说英语

                篮球运动员:姓名,年龄,学打篮球

                乒乓球教练:姓名,年龄,教打乒乓球,说英语

                篮球教练:姓名,年龄,教打篮球

public abstract class Person {
    private String name;
    private int age;

    public Person() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public interface English {
    public abstract void speakElish();
}
public class baskerballSporter extends Sporter{
    public baskerballSporter() {
    }

    public baskerballSporter(String name, int age) {
        super(name, age);
    }

    @Override
    public void study() {
        System.out.println("篮球运动员在学习打篮球");
    }
}
public class basketballCoach extends Coach{
    public basketballCoach() {
    }

    public basketballCoach(String name, int age) {
        super(name, age);
    }

    @Override
    public void teach() {
        System.out.println("篮球教练在教打篮球");
    }
}
public abstract class Coach extends Person{
    public Coach() {
    }

    public Coach(String name, int age) {
        super(name, age);
    }

    public abstract void teach();
}
public class pingpongCoach extends Coach implements English{
    @Override
    public void speakElish() {
        System.out.println("乒乓球教练在学习英语");
    }

    @Override
    public void teach() {
        System.out.println("乒乓球教练在教打乒乓球");
    }
}
public class pingpongSporter extends Sporter implements English{
    public pingpongSporter() {
    }

    public pingpongSporter(String name, int age) {
        super(name, age);
    }

    @Override
    public void speakElish() {
        System.out.println("乒乓球运动员在说英语");
    }

    @Override
    public void study() {
        System.out.println("乒乓球运动员在学习打乒乓球");
    }
}
import a10demo2.Animal;

public abstract class Sporter extends Person{
    public Sporter() {
    }

    public Sporter(String name, int age) {
        super(name, age);
    }

    public abstract void study();
}
public class Test {
    public static void main(String[] args) {
        pingpongSporter pps=new pingpongSporter("王楚钦",23);
        System.out.println(pps.getName()+", "+pps.getAge());
        pps.study();
        pps.speakElish();
        System.out.println("----------------------------");
        basketballCoach bbc=new basketballCoach("科比",41);
        System.out.println(bbc.getName()+", "+bbc.getAge());
        bbc.teach();
    }
}

运行结果:

王楚钦, 23
乒乓球运动员在学习打乒乓球
乒乓球运动员在说英语
----------------------------
科比, 41
篮球教练在教打篮球

JDK8以后接口中新增的方法

       1、 允许在接口中定义默认方法,需要使用关键字 default修饰

                作用:解决接口升级的问题

        接口中默认方法的定义格式:
                格式:public default 返回值类型 方法名(参数列表){}
                范例:public default void show(){ }

        接口中默认方法的注意事项
        默认方法不是抽象方法,所以不强制被重写。但是如果被重写,重写的时候去掉default关键字。

         public可以省略,default不能省略。
        如果实现了多个接口,多个接口中存在相同名字的默认方法,子类就必须对该方法进行重写。

        2、允许在接口中定义定义静态方法,需要用static修饰

        接口中静态方法的定义格式:
                格式:public static 返回值类型 方法名(参数列表){}
                范例:public static void show(){ }

        接口中静态方法的注意事项:
                静态方法只能通过接口名调用,不能通过实现类名或者对象名调用
                public可以省略,static不能省略

JDK9新增的方法

        接口中私有方法的定义格式:

                格式1:private 返回值类型 方法名(参数列表){}
                范例1:private void show(){ }

                格式2:private static 返回值类型 方法名(参数列表){}
                范例2:private static void method(){ }

适配器设计模式

        设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
        使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

        简单理解:设计模式就是各种套路。

        适配器设计模式:解决接口与接口实现类之间的矛盾问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1944687.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Go系列】Go的UI框架Fyne

前言 总有人说Go语言是一门后端编程语言。 Go虽然能够很好地处理后端开发&#xff0c;但是者不代表它没有UI库&#xff0c;不能做GUI&#xff0c;我们一起来看看Go怎么来画UI吧。 正文 Go语言由于其简洁的语法、高效的性能和跨平台的编译能力&#xff0c;非常适合用于开发GUI…

爬虫学习1:初学者简单了解爬虫的基本认识和操作(详细参考图片)

爬虫 定义&#xff1a;爬虫&#xff08;Web Crawler 或 Spider&#xff09;是一种自动访问互联网上网页的程序&#xff0c;其主要目的是索引网页内容&#xff0c;以便搜索引擎能够快速检索到相关信息。以下是爬虫的一些关键特性和功能&#xff1a; 自动化访问&#xff1a;爬虫能…

58、主从复制数据库+读写分离

mysql的主从复制和读写分离&#xff08;面试问原理&#xff09; mysql的主从复制和读写分离&#xff1a; 主从复制 面试必问 主从复制的原理。 读写分离&#xff0c;MHA 一、主从复制 1.1、主从复制的模式&#xff1a; 1、mysql的默认模式&#xff1a; 异步模式&#xf…

centos系统mysql数据库差异备份与恢复

文章目录 差异备份mysql数据一、 安装 Percona XtraBackup数据库中创建一些数据三、创建全备份四、创建差异备份1. 在数据库中添加数据&#xff0c;让数据发生一些改变2. 创建第一个差异备份3. 数据库中再次添加一些数据4. 创建第二个差异备份 五、模拟数据丢失&#xff0c;删库…

MongoDB 学习笔记

一、简介 1、MongoDB 是什么 MongoDB 是一个基于分布式文件存储的数据库&#xff0c;官方地址 https://www.mongodb.com/ 2、数据看是什么 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序。 3、数据库的作用 主要作用是 管理数据…

Data Analytics for Business BISM7233

SSIS Task: Company_data.csv contains information for each of the companies, some of the state code information is missing in this table. You would need to use “state_code.csv” to fill in these blank cells under state code before creating the company dime…

利用OSMnx求路网最短路径并可视化(二)

书接上回&#xff0c;为了增加多路径的可视化效果和坐标匹配最近点来实现最短路可视化&#xff0c;我们使用图形化工具matplotlib结合OSMnx的绘图功能来展示整个路网图&#xff0c;并特别高亮显示计算出的最短路径。 多起终点最短路路径并计算距离和时间 完整代码#运行环境 P…

vite环境下使用bootstrap

环境 nodejs 18 pnpm 初始化 pnpm init pnpm add -D vite --registry http://registry.npm.taobao.org pnpm add bootstrap popperjs/core --registry http://registry.npm.taobao.org pnpm add -D sass --registry http://registry.npm.taobao.org新建vite.config.js cons…

【微服务】Spring Cloud Bus的注意事项和常用案例

文章目录 强烈推荐引言关键方面注意事项1. 消息代理选择2. 消息队列配置3. 消息持久化4. 幂等性5. 安全性6. 消息大小7. 性能监控8. 错误处理9. 版本兼容性10. 测试11. 配置同步12. 日志记录 常用示例示例 1: 配置同步配置服务器 (config-server)客户端服务 (client-service)触…

数据库的事务隔离级别有哪些?

并行事务会引发什么问题&#xff1f; 同时处理多个事务的时候&#xff0c;就可能出现脏读&#xff08;dirty read&#xff09;、不可重复读&#xff08;non-repeatable read&#xff09;、幻读&#xff08;phantom read&#xff09;的问题。脏读: 如果一个事务「读到」了另一个…

MQ消息队列+Lua 脚本实现异步处理下单流程,将同步下单改为异步下单

回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1a; 1 查询优惠券 2 判断秒杀库存是否足够 3 查询订单 4 校验是否是一人一单 5 扣减库…

Unity Shader - 2024 工具篇

目录 IDE 工具建议 IDE工具 Sublime 3 大势所趋&#xff0c;但是Sublime 使用插件还是相当的不习惯 代码跳转 Go to definite IDE 工具建议 () what is the best ide for coding shaderlab - #4 by DaveAstator - Unity Engine - Unity Discussions​​​​​​​I IDE工…

用Swagger进行后端接口测试的实战操作

目录 一.什么是Swagger&#xff1f; 二.Swagger的使用操作流程&#xff1a; 1.在pom.xml配置文件导入 Knife4j 的依赖&#xff1a; 2.在config配置类中加入 Knife4j 的相关配置并设置静态资源映射&#xff08;否则接口文档无法访问&#xff09;&#xff1a; 三.Swagger的四个…

案例研究|柯尼卡美能达软件开发(大连)有限公司基于DataEase构筑内部数据可视化体系

柯尼卡美能达软件开发&#xff08;大连&#xff09;有限公司于2007年5月25日注册成立。公司以“洞悉在工作的人们真实情况&#xff0c;探寻他们的愿望&#xff0c;持续提供使人们更加幸福的服务”为使命&#xff0c;致力于系统品质测试服务、软件开发服务、IT安全服务、高级BPO…

docker文件挂载和宿主主机文件的关系

一、背景 在排查docker日志时发现在读取docker的文件时找不到文件&#xff0c;在宿主主机上可以查到对应的文件。这里就要理解docker文件目录和宿主主机上的文件的关系。 二、Docker文件系统和宿主系统 Docker文件和宿主文件之间的关系主要体现在Docker容器的运行环境中。Docke…

C# 数组常用遍历方式

// 假设数组Point[] points new Point[2];// 第一种遍历 forfor (int i 0; i < points.Length; i){Point p points[i];Console.WriteLine($"X{p.X},y{p.Y}");}// 第二种遍历 foreachforeach (Point p in points){Console.WriteLine($"X{p.X},y{p.Y}"…

没有51基础,能不能学好STM32?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「STM32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 我们通常准备攻读一本大部…

哪种小型内衣洗衣机好用?五款人气爆款机型不可错过

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

51单片机-第四节-定时器

一、定时器&#xff1a; 1.介绍&#xff1a; 单片机内部实现的计时系统。 作用&#xff1a;代替长时间Daley&#xff0c;提高cpu效率。 数量&#xff1a;至少2个&#xff0c;T0&#xff0c;T1&#xff0c;T2等。其中T0&#xff0c;T1为所有51单片机共有&#xff0c;T2等为不…

gitee设置ssh公钥密码频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…