7、Java入门教程【面向对象】

面向对象是Java编程的核心概念,如果不能充分了解面向对象的思想,那么会给你在实际的项目开发过程中,带来很多业务设计上的困扰。

一、构造器

我们在设计完一个类,在使用这个类去创建对象实例的时候,有些场景是需要对实例做初始化操作的,那么Java中提供了构造器来满足这方面要求。

1、原则

  • 名字必须与所在类名称一致
  • 不能有返回值和返回值类型
  • 构造器也可以重载(参数列表不一样)
  • 类在设计时,如果没有写构造器,Java是会为类自动生成一个无参数构造器。
  • 如果定义类的有参数构造器,则不会创建无参数构造器。【建议手动创建一个无参数构造器】

2、 构造器的多种形式

默认无参数构造器:

class Rock{
	printme(){
		System.out.print("printme");
	}
}

Rock r=new Rock();

有参数构造器:

class Rock {
    Rock(String name) {
        System.out.print("这是一个有参构造器:" + name);
    }
}
Rock r = new Rock("IT飞牛");
//这是一个有参构造器:IT飞牛

构造器重载:

class Rock {
    Rock(String name) {
        System.out.println("这是一个有参构造器,姓名:" + name);
    }

    Rock(String name, int age) {
        this(name);//这里使用this调用其他构造器,复用
        System.out.println("这是一个有参构造器,年龄:" + age);
    }
}

Rock r = new Rock("IT飞牛", 18);

//这是一个有参构造器,姓名:IT飞牛
//这是一个有参构造器,年龄:18

二、重载

类中的一个方法,有些场景下需要根据不同的情况,做不同的操作,当然我们可以直接定义不同的方法就能实现。但是有些时候的确是同类型的操作,方法名最好是一样的,这时候我们可以使用重载来实现。

类中的重载主要是根据方法传入的参数类型列表,去自动识别调用不同的方法执行。

下面提供了同方法名,但是不同参数的案例:

package com.itfeiniu.hello;

public class HelloWorld {
    public static void main(String[] args) {
        Rock r = new Rock();
        r.say();
        r.say("你好");
        r.say("你好", 3);
        r.say(3, "你好");
    }
}

class Rock {
    void say() {
        System.out.println("啥都没说");
    }

    void say(String msg) {
        System.out.println("说:" + msg);
    }

    void say(String msg, int num) {
        System.out.println(msg + ",被说了" + num + "遍");
    }

    void say(int num, String msg) {
        System.out.println("说了" + num + "遍," + msg);
    }
}
//啥都没说
//说:你好
//你好,被说了3遍
//说了3遍,你好

可以看到,不同的入参,调用了不同的同名方法。

涉及基本类型的重载,可能会由于变量类型提升,调用的方法有偏差。例如:Rock加入有个do方法,调用r.do(1)这个方法,参数会按照int类型去识别。请看下面案例:“

package com.itfeiniu.hello;

public class HelloWorld {
    public static void main(String[] args) {
        Rock r = new Rock();
        r.say(2);
        r.say((byte) 2);
    }
}

class Rock {
    void say(byte num) {
        System.out.println("这是byte");
    }

    void say(int num) {
        System.out.println("这是int");
    }

}
//这是int
//这是byte

三、this关键字

this就是一个变量,可以用在方法中,来拿到当前对象。

接触过js的小伙伴应该是比较好理解,java中的this的指向和js中的this的指向是一个原则:【谁调用,this就指向谁】

四、static的含义

static方法就是没有this的方法,在static方法内部不能调用this。并且在static内部不能调用非静态方法。

而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途,他很像全局方法。

五、super

可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

六、封装

合理隐藏 合理暴露

1、访问控制

java类中的方法或者属性,可以设置访问范围,修饰符是:privateprotectpublic

  • private:该成员可以被该类内部成员访问;

  • default:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问;

  • protected:该成员可以被该类内部成员访问,也可以被同一包下其他的类访问,还可以被它的子类访问;

  • public:该成员可以被任意包下,任意类的成员进行访问。

2、读写拦截器getter、setter

java中的读写拦截器是基于public方法来实现的。

package com.itfeiniu.hello;

public class HelloWorld {
    public static void main(String[] args) {
        Rock r = new Rock();
        r.setName("张三");
        System.out.println(r.getName());
        r.setAge(20);
        System.out.println(r.getAge());
    }
}

class Rock {
    private String name;

    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;
    }

    private int age;

}
//张三
//20

可以使用IDEA快速生成gettersetting,如下图:

image-20230725200155008.image-20230725200211337

七、实体类

实体类的特点:

  1. 这个类中的成员变量都要私有,并且要对外提供相应的getXxx,setXxx方法。
  2. 类中必须要有一个公共的无参的构造器。

下面Student类就是典型的实体类,整个类就是用来保存学生数据的,没有其他任何数据处理业务。一般实体类会配合实体类的操作类来使用,实体类存放数据,操作类StudentOperator使用实体类的数据做数据处理业务。

代码如下:

package com.itfeiniu.hello;

public class HelloWorld {
    public static void main(String[] args) {
        Student std1 = new Student("张三", 60);
        StudentOperator sto1 = new StudentOperator(std1);
        sto1.printPass();

        Student std2 = new Student("李四", 50);
        StudentOperator sto2 = new StudentOperator(std2);
        sto2.printPass();
    }
}

class StudentOperator {
    private Student student;

    public StudentOperator(Student student) {
        this.student = student;
    }

    public void printPass() {
        if (student.getScore() >= 60) {
            System.out.println(student.getName() + ",及格了");
        } else {
            System.out.println(student.getName() + ",没及格");
        }
    }
}

class Student {
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

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

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}

七、继承

继承是实现软件复用的重要手段。

继承中最常使用的两个关键字是 extendsimplements 。通过使用这两个关键字,我们能实现一个对象获取另一个对象的属性。

所有 Java 的类均是由 java.lang.Object 类继承而来的,所以 Object 是所有类的祖先类,而除了 Object 外,所有类必须有一个父类。

public interface Animal {}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

Java不支持多继承,例如下面的写法是错误的:

public class extends Animal, Mammal{} 

但是我们可以用接口来实现(多继承接口来实现),代码结构如下:

//Apple.java
package com.itfeiniu.hello;

class Fruit {
    String color;
    int kg;
    String shape;
}

interface Fruit1 {
    public void eat1();

    public void travel1();
}

interface Fruit2 {
    public void eat2();

    public void travel2();
}

public class Apple extends Fruit implements Fruit1, Fruit2 {
    public Apple(String color, int kg, String shape) {
        this.color = color;
        this.kg = kg;
        this.shape = shape;
    }

    public void eat1() {
        System.out.println("eat1");
    }

    public void travel1() {
        System.out.println("travel1");
    }

    public void eat2() {
        System.out.println("eat2");
    }

    public void travel2() {
        System.out.println("travel2");
    }
}

//helloworld.java
package com.itfeiniu.hello;

public class HelloWorld {
    public static void main(String[] args) {
        Apple app = new Apple("red", 5, "circle");
        app.eat1();
        app.eat2();
        System.out.println(app.color);
    }
}
//eat1
//eat2
//red

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css实现鼠标滑动左下角弹框带动画效果

代码 <div classNamekuang></div> css代码 .kuang {height: 500px;width: 400px;// background-color: #fff;position: absolute;z-index: 10;bottom: 0;transform: translateX(-390px)}.kuang:hover {animation: myanimation 3s linear 1;animation-fill-mode:f…

Django学习笔记-视图(views)的使用

Django中可以使用views进行管理&#xff0c;类似于WPF的MVVM的ViewModel层&#xff0c;也相当于MVC架构的模Controller层。 一、基于函数的视图FBV&#xff08;Function-Based View&#xff09; 通过定义一个函数&#xff0c;包含HttpRequest对象作为参数&#xff0c;用来接受…

QT项目代码去UI界面常用开发步骤

QT项目代码去UI界面常用开发步骤 因项目开发需求&#xff0c;领导要求整个QT项目中不要用UI方式来实现界面&#xff0c;这样能保障程序运行稳定性以及代码的逻辑和可读性,先记录具体操作步骤如下&#xff1a; 1、首先我们通过拖控件的方式来实现界面的设计效果&#xff0c…

【动态规划part07】| 70.爬楼梯(进阶)、322.零钱兑换、完全平方数

目录 &#x1f388;LeetCode70. 爬楼梯 &#xff08;进阶&#xff09; &#x1f388;LeetCode322. 零钱兑换 &#x1f388;LeetCode279.完全平方数 &#x1f388;LeetCode70. 爬楼梯 &#xff08;进阶&#xff09; 链接&#xff1a;70.爬楼梯进阶 假设你正在爬楼梯。需要 …

linux 内核总结

注意&#xff1a;队列只是一格以前的称呼&#xff0c;底层是链表 进程 多个cpu&#xff0c;每个cpu都有自己的进程队列 进程分类&#xff1a; 实时进程 与用户交互的进程&#xff0c;需要及时的响应&#xff08;优先级 0~100&#xff09; 普通进程 响应不需要那么及时的…

Python(四十一)流程控制语句——break

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

Docker 全栈体系(六)

Docker 体系&#xff08;高级篇&#xff09; 三、Docker微服务实战 1. 通过IDEA新建一个普通微服务模块 建Module docker_boot 改POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" …

微信小程序数字键盘(仿微信转账键盘)

微信小程序input自带数字输入键盘&#xff0c;不过是直接调用的系统键盘&#xff0c;无法个性化。 代码中使用使用了Vant WeappVant UI小程序版&#xff0c;这里就不介绍相关安装说明了&#xff0c;大家自行安装Vant Weapp。 json 用到的组件 {"usingComponents": …

双智城市进展全扫描

本文将综合盘点16座智慧城市基础设施与智能网联汽车协同发展试点城市&#xff08;简称“双智试点城市”&#xff09;建设进展情况。2021年4月和12月&#xff0c;住建部和工信部两次联合印发通知&#xff0c;先后确定北京、上海、广州、武汉、长沙、无锡6个城市为第一批双智试点…

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac可以打开和查看Visio文件&#xff08;.vsd、.vdx和.vsdm文件&#xff09;。它具有简单易用的用户界面&#xff0c;可以快速加载和显示Visio文件。此外&#xff0c;它还支持导出文件为PDF、PNG、JPEG等格式&#xff0c;方便用户进行文件转换和共享。 Visio…

(202307)wonderful-sql:基础查询与排序(task2)

教程链接&#xff1a;Datawhale - 一个热爱学习的社区 知识学习 前提&#xff1a; 上一次任务中提出了本课程的用表&#xff0c;但是我并没有加入这个表&#xff0c;这次学习前先对这个表进行插入。 INSERT INTO product VALUES(0001, T恤衫, 衣服, 1000, 500, 2009-09-20)…

DevOps系列文章 之GitLabCI模板库的流水线

目录结构&#xff0c;jobs目录用于存放作业模板。templates目录用于存放流水线模板。这次使用​​default-pipeline.yml​​作为所有作业的基础模板。 作业模板 作业分为Build、test、codeanalysis、artifactory、deploy部分&#xff0c;在每个作业中配置了rules功能开关&…

【广州华锐互动】AR智慧机房设备巡检系统

AR智慧机房设备巡检系统是一种新型的机房巡检方式&#xff0c;它通过使用增强现实技术将机房设备、环境等信息实时呈现在用户面前&#xff0c;让巡检人员可以更加高效地完成巡检任务。 首先&#xff0c;AR智慧机房设备巡检系统具有极高的智能化程度。该系统可以根据用户设定的…

java代码审计6之ssrf

文章目录 1、java支持的网络请求协议&#xff1a;2、Java 中能发起⽹络请求的类2.1、仅⽀持 HTTP/HTTPS 协议的类2.2、⽀持 sun.net.www.protocol 所有协议的类2.3、审计关键词 3、靶场3.1、漏洞代码13.2、ftp协议读取技巧3.3、无回显之探测内网3.4、无回显之探测文件 之前的文…

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…

Android 耗时分析(adb shell/Studio CPU Profiler/插桩Trace API)

1.adb logcat 查看冷启动时间和Activity显示时间&#xff1a; 过滤Displayed关键字&#xff0c;可看到Activity的显示时间 那上面display后面的是时间是指包含哪些过程的时间呢&#xff1f; 模拟在Application中沉睡1秒操作&#xff0c;冷启动情况下&#xff1a; 从上可知&…

SpringBoot 集成 Elasticsearch

一、版本 spring-boot版本&#xff1a;2.3.7.RELEASEElasticsearch7.8.0版本说明详见 二、Elasticsearch 下载和安装 Elasticsearch 下载 kibana下载 ik分词器下载 配置IK分词器 2.1 解压&#xff0c;在elasticsearch-7.8.0\plugins 路径下新建ik目录 2.2 将ik分词器解压放…

pytest---环境切换(base-url)

前言 前面小编介绍了如何通过pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址&#xff0c;今天小编再次介绍一种方法&#xff0c;通过pytest的插件&#xff…

2023年深圳杯数学建模B题电子资源版权保护问题

2023年深圳杯数学建模 B题 电子资源版权保护问题 原题再现&#xff1a; 版权又称著作权&#xff0c;包括发表权、署名权、修改权、保护作品完整权、复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权及应当由著作权人…

安全学习DAY06_抓包技术-HTTPHTTPS

抓包技术-HTTP&HTTPS HTTP&HTTPS抓包针对Web&APP&小程序&PC应用等 本节目的&#xff1a; 掌握几种抓包工具证书安装操作掌握几种HTTP&HTTPS抓包工具的使用学会Web&#xff0c;APP&#xff0c;小程序&#xff0c;PC应用等抓包了解本节课抓包是针对哪些…