JAVA-学习-2

一、类

1、类的定义

        把相似的对象划分了一个类。

        类指的就是一种模板,定义了一种特定类型的所有对象的属性和行为

        在一个.java的问题件中,可以有多个class,但是智能有一个class是用public的class。被声明的public的class必须和文件名相同

[访问修饰符] class 类名{成员变量-属性成员方法-行为内部类代码块
}
public class Car {String color;String brand;int door_num;public void start(){//启动System.out.println(color+"颜色"+door_num+"门"+brand+"车正在启动......");}public void speed(){//加速System.out.println(color+"颜色"+door_num+"门"+brand+"车正在加速......");}public void stop(){//停止System.out.println(color+"颜色"+door_num+"门"+brand+"车正在停止......");}
}

2、成员变量

        java类的成员变量,都有默认值。

        整数:0

        浮点数:0.0

        布尔:false

        字符:'\u0000'

        引用:null

        java类的成员变量,在下面所有的方法中,都可以访问到。

3、局部变量

        但是局部变量是没有默认值的。

原因:

        JVM通过CLassLoader类加载器及进行类加载,过程设计到 加载,准备、解析和初始化,类的成员变量初始化,是在JVM类加载的阶段完成。

区别:

         成员变量:静态(static)成员变量、非静态成员变量(初始化阶段赋值,根据代码中的赋值情况,如果没有赋值,则使用默认值,有赋值,则使用代码中的赋值;当当对象实例化后,成员变量会随着对象分配到Java堆内存中)。

        局部变量:存储在栈内存中

4、对象

4.1对象的定义

        类是模板,通过模板创建出具体的实例,就是模板。

        对象就是实际存在的某类事务的个体,也叫实例。

        类和对象的关系,就是抽象和具体的关系。

创建对象的属性和方法:

类名 对象名=new 类名

4.2对象的使用 

public class test1 {public static void main(String[] args) {Car car1 = new Car();car1.color="red";car1.brand="baoma";car1.door_num=4;car1.start();car1.speed();car1.stop();}}

4.3对象创建的原理

①JVM运行时包括:程序计数器、Java栈、堆、本地方法栈、方法区

②当我们创建一个对象时候,同时操作了栈内存和堆内存

③在栈内存保存了这个对象的引用

④对象的属性保存在对内存中。

⑤操作对象都是通过引用来完成,一旦引用出栈,没有被引用的对象就变成了垃圾,被回收。

在编写类文件的时候,类是存储在硬盘上的,没有被加载到内存中。

在主方法中创建了这个类的对象后,它才会被加载到内存中进行处理。

案例:

public class Clock {int hour;int mintue;int second;String timeZone;public void showTime(){System.out.println("现在是"+timeZone+"时间"+hour+"时"+mintue+"分"+second+"秒");}}
public class TestColck {public static void main(String[] args) {Clock clock1 = new Clock();clock1.hour=11;clock1.second=12;clock1.mintue=22;clock1.timeZone="beijing";clock1.showTime();Clock clock2 = new Clock();clock2.hour=12;clock2.second=12;clock2.mintue=22;clock2.timeZone="dongjing";clock2.showTime();}}

4.4匿名对象

new Car().speed();

就调用一次。

5、封装(属性的私有访问)

①Java的封装就是信息隐藏技术。从属性的角度来说,有选择的提供数据。

②封装也涉及到了软件的耦合性:高内聚,低耦合。 

③将属性私有处理,需要使用private关键字;

④使用private关键字来修饰的属性,只能在当前类中访问。

⑤对于私有属性,一般会提供公有的访问方法:getter setter。 //驼峰式编码风格

 Clock类

public class Clock {private int hour;private int mintue;private int second;private String timeZone;public void setHour(int hour){  //局部变量//在当前方法中,出现了两个hour,一个是成员变量,一个是局部变量//使用this关键字来菊粉,加this 的表示是成员变量this.hour=hour;}public void setMintue(int mintue){this.mintue=mintue;}public void setSecond(int second){this.second=second;}public void setTimeZone(String timeZone){this.timeZone=timeZone;}public void showTime(){System.out.println("现在是"+timeZone+"时间"+hour+"时"+mintue+"分"+second+"秒");}public int getHour(){return hour;  //this.hour 也可以这样写}public int getMintue(){return mintue;}public int getSecond(){return second;}public String getTimeZone(){return  timeZone;}}

 Clock类的调用

public class TestColck {public static void main(String[] args) {Clock clock1 = new Clock();clock1.setSecond(11);clock1.setTimeZone("beijing");clock1.setHour(12);clock1.setMintue(13);clock1.showTime();//只想知道当前的小时和分钟//很明显这样写不可以System.out.println(clock1.hour+"时"+clock.mintue+"分");//提供Get方法返回对应的值System.out.println(clock1.getHour()+"时"+clock1.getMintue()+"分");}}

        但是这样定义太麻烦了,我们就定义了四个属性,如果不加private,那么就可以直接访问,现在我们加上,就要弄八个方法,这么多太麻烦了。

那么可以用简单的方式:

快捷键:按住alt+insert

直接生成。

这个getter和setter的写法也叫属性暴露!

6、构造方法

(1)构造方法的理解

       ① 也叫作构造器,严格来讲,构造方法不是方法。

       ② 构造方法要求和类名相同,没有返回值类型,也没有void.

       ③可以有return,表示方法的结束,不能返回值(不推荐),除非要写一个业务 逻辑

作用:

        ①完成对象的初始化工作

        ②每个Java的类都至少要有一个构造方法,如果不写构造方法,编译器会提供一个没有任何参数和语句的构造方法,Student(){},如果写了构造方法,那么编译器不会再提供默认的构造方法。  所以一旦自己写了构造方法,必须要写对,写正确。

        ③ 一个类可以定义多个构造方法(构造方法的重载)

        ④一般情况下都会写一个无参的构造方法。这是好的变成习惯。

public class Student {Student(){}
}

         构造的作用就是完成对象的初始化工作,在这里,如果把Student()删掉

public class Student {private String name;private String gender;private int age;Student(){name="张三";gender="男";age=19;}public void showInfo(){System.out.println("姓名:"+name+"\t性别:"+gender+"\t年龄:"+age);}
}

 那么在这里输出的默认值就不会是张三 男 19

public class TestStudent {public static void main(String[] args) {//new Student()实际上就是在调用构造方法Student student1=new Student();student1.showInfo();}
}

 (2)一个类可以定义多个构造方法(构造方法的重载)

    private String name;private String gender;private int age;public Student(){System.out.println("这是无参数的构造方法!");}public Student(int x){System.out.println("这是有参数的构造方法!");}public Student(String  x){System.out.println("这是有参数的构造方法!");}

(3)构造方法的调用

       ① 如果是在其他类中,则通过new的方式来调用构造方法

        ②如果在自己的类中,可以调用别的构造方法,但也仅限于构造方法间的调用,且必须写在第一行,不允许相互调用。

    public Student(){this(12);System.out.println("这是无参数的构造方法!");}public Student(int x){this("123");System.out.println("这是有参数的构造方法!");}public Student(String  x){System.out.println("这是有参数的构造方法!");}

(4)构造方法的应用

        那么既然构造方法也可以传值,是不是那些setter和getter都没用了?

        非也,构造方法只是用来做初始化,之后还可能变化。

public class Dog_Test {public static void main(String[] args) {Dog dog1=new Dog("red",12);dog1.showInfo();dog1.setAge(13);dog1.setColor("blue");dog1.showInfo();}
}

注意:一般情况下都会写一个无参的构造方法。这是好的变成习惯。 

    public Dog(){ //无参};public Dog(String color, int age){   //有参数this.color=color;this.age=age;}

(5)快捷生成构造 alt+insert

 (6)对象作为方法参数

        讲对象作为方法参数:将所有属性进行封装,传递给另外一个类的方法,需要那些属性,获取那些属性。

老师

public class Teacher {public void sign(Student student){  //传的是整个对象,可以到到这个人的 所有信息System.out.println("老师点名!");if (student.getGender().equals("男")){System.out.println(student.getName()+"到");} else if (student.getGender().equals("女")) {System.out.println(student.getName()+"有");}}
}

 学生

public class Student {String name;int age;String gender;public Student() {}public Student(String name, int age, String gender) {this.name = name;this.age = age;this.gender = gender;}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 String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public void showInfo(){System.out.println();}
}

测试

public class Test {public static void main(String[] args) {Student student1=new Student("李清照",12,"女");Teacher teacher=new Teacher();teacher.sign(student1);Student student2=new Student("杜甫",121,"男");teacher.sign(student2);}
}

(7)方法返回类型是一个对象类型

Monitor

public class Monitor {public Student register(){  //学生对象Scanner scanner=new Scanner(System.in);System.out.println("请输入姓名:");String name = scanner.next();System.out.println("请输入性别:");String gender = scanner.next();System.out.println("请输入年龄:");int age = scanner.nextInt();return new Student(name, age, gender);  // 返回的是一个对象}
}
public class Test {public static void main(String[] args) {Monitor monitor=new Monitor();  //测试的时候可以直接用Monitor,因为monitor返回的是对象studentStudent student1=monitor.register();Teacher teacher=new Teacher();teacher.sign(student1);Student student2=monitor.register();teacher.sign(student2);}
}

7、对象数组的方式

        原来的方式调用很麻烦,每个对象都要用一行代码调用。

public class Test {public static void main(String[] args) {// 麻烦,需要调用很多次,建议用数组Student student=new Student("李清照","女");Student student1=new Student("李白","男");Student student2=new Student("杜甫","男");Teacher teacher=new Teacher();teacher.sign(student);teacher.sign(student1);teacher.sign(student2);}
}

        原来的老师类

public class Teacher {public void sign(Student student){String gender = student.getGender();if (gender.equals("男")){System.out.println(student.getName()+"到!");} else if (gender.equals("女")) {System.out.println(student.getName()+"有!");}else{System.out.println("性别不对,没有"+gender);}}
}

        看起来很麻烦,那么我们可以改成数组。

public class Teacher {public void sign(Student[] students){for (Student student : students) {String gender = student.getGender();if (gender.equals("男")){System.out.println(student.getName()+"到!");} else if (gender.equals("女")) {System.out.println(student.getName()+"有!");}else{System.out.println("性别不对,没有"+gender);}}}
}

 测试

public class Test {public static void main(String[] args) {// 麻烦,需要调用很多次,建议用数组Teacher teacher=new Teacher();// 创建学生对象数组Student[] students=new Student[3];students[0]=new Student("李清照","女");students[1]=new Student("李白","男");students[2]=new Student("杜甫","男");teacher.sign(students);}
}

 

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

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

相关文章

Pytorch 实现目标检测一(Pytorch 23)

一 目标检测和边界框 在图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知 道它们的类别,还想得到它们在图像中的具体位置。在…

【前端】响应式布局笔记——自适应布局

自适应布局 自适应布局是不同设备对应不同的html(局部自适应),通过判断设备的类型或控制局部的变化。 1、获取设备是移动端还是pc端 // 获取设备的信息let userAgent navigator.userAgent.toLowerCase();// 使用正则表达式来判断类型let device /ipad|iphone|m…

数据并非都是正态分布:三种常见的统计分布及其应用

你有没有过这样的经历?使用一款减肥app,通过它的图表来监控自己的体重变化,并预测何时能达到理想体重。这款app预测我需要八年时间才能恢复到大学时的体重,这种不切实际的预测是因为应用使用了简单的线性模型来进行体重预测。这个…

服务部署:.NET项目使用Docker构建镜像与部署

前提条件 安装Docker:确保你的Linux系统上已经安装了Docker。如果没有,请参考官方文档进行安装。 步骤一:准备项目文件 将你的.NET项目从Windows系统复制到Linux系统。你可以使用Git、SCP等工具来完成这个操作。如何是使用virtualbox虚拟电…

国产操作系统上给virtualbox中win7虚拟机安装增强工具 _ 统信 _ 麒麟 _ 中科方德

原文链接:国产操作系统上给virtualbox中win7虚拟机安装增强工具 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!今天给大家带来一篇在国产操作系统上给win7虚拟机安装virtualbox增强工具的文章。VirtualBox增强工具(Guest Additions&a…

Liunx环境下redis主从集群搭建(保姆级教学)02

Redis在linux下的主从集群配置 本次演示使用三个节点实例一个主节点,两个从节点:7000端口(主),7001端口(从),7002端口(从); 主节点负责写数据&a…

Rust-02-变量与可变性

在Rust中,变量和可变性是两个重要的概念。 变量:变量是用于存储数据的标识符。在Rust中,变量需要声明其类型,例如: let x: i32 5; // 声明一个名为x的变量,类型为i32(整数)&#…

安装MySQL Sample Database

本文安装的示例数据库为官方的Employees Sample Database。 操作过程参考其安装部分。 在安装前,MySQL已安装完成,环境为Linux。 克隆github项目: $ git clone https://github.com/datacharmer/test_db.git Cloning into test_db... remo…

【西瓜书】6.支持向量机

目录: 1.分类问题SVM 1.1.线性可分 1.2.非线性可分——核函数 2.回归问题SVR 3.软间隔——松弛变量 3.1.分类问题:0/1损失函数、hinge损失、指数损失、对率损失 3.2.回归问题:不敏感损失函数、平方 4.正则化

计算机组成原理之指令格式

1、指令的定义 零地址指令: 1、不需要操作数,如空操作、停机、关中断等指令。 2、堆栈计算机,两个操作数隐藏在栈顶和此栈顶,取两个操作数,并运算的结果后重新压回栈顶。 一地址指令: 二、三地址指令 四…

配置免密登录秘钥报错

移除秘钥,执行 ssh-keygen -R cdh2即可 参考:ECDSA主机密钥已更改,您已请求严格检查。 - 简书

Python爬虫入门与登录验证自动化思路

1、pytyon爬虫 1.1、爬虫简介 Python爬虫是使用Python编写的程序,可以自动访问网页并提取其中的信息。爬虫可以模拟浏览器的行为,自动点击链接、填写表单、进行登录等操作,从而获取网页中的数据。 使用Python编写爬虫的好处是,…

【数据结构】十二、八种常用的排序算法讲解及代码分享

目录 一、插入排序 1)算法思想 2)代码 二、希尔排序 1)算法思想 2)代码 三、选择排序 1)算法思想 2)代码 四、堆排序 1)什么是最大堆 2)如何创建最大堆 3)算法思想 4&a…

C# Excel操作类EPPlus

摘要 EPPlus 是一个流行的用于操作 Excel 文件的开源库,适用于 C# 和 .NET 环境。它提供了丰富的功能,能够轻松地读取、写入和格式化 Excel 文件,使得在 C# 中进行 Excel 文件处理变得更加简单和高效。EPPlus 不需要安装 Microsoft Office 或…

知乎网站只让知乎用户看文章,普通人看不了

知乎默认不显示全部文章,需要点击展开阅读全文 然而点击后却要登录,这意味着普通人看不了博主写的文章,只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况,他们写文章肯定是希望所有人都能看到。 这个网站篡改…

应用商店如何检测在架应用内容是否违规?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

线性代数|机器学习-P11方程Ax=b求解研究

文章目录 1. 变量数和约束条件数大小分类2. 最小二乘法和Gram-schmidt变换2.1 Gram-schmidt变换2.2 最小二乘法2.2.1 损失函数-Lasso 和regression2.2.2 损失函数-Lasso2.2.3 损失函数-regression2.2.4 Regression岭回归-矩阵验证2.2.5 Regression岭回归-导数验证 3. 迭代和随机…

【数据结构】队列——循环队列(详解)

目录 0 循环队列 1 特定条件下循环队列队/空队满判断条件 1.1 队列为空的条件 1.2 队列为满的条件 2 循环队列的实现 3 示例 4 注意事项 0 循环队列 循环队列(Circular Queue)是队列的一种实现方式,它通过将队列存储空间的最后一…

MySQL之多表查询—行子查询

一、引言 上篇博客学习了列子查询。 接下来学习子查询中的第三种——行子查询。 行子查询 1、概念 子查询返回的结果是一行&#xff08;当然可以是多列)&#xff0c;这种子查询称为行子查询。 2、常用的操作符 、 <> (不等于) 、IN 、NOT IN 接下来通过一个需求去演示和…

locale本地化库学习

std::locale 类型的对象&#xff08;本地环境对象&#xff09;是不可变刻面的一个不可变索引集。C 输入/输出库的每个流对象都与一个 std::locale 对象关联&#xff0c;并用它的各刻面来分析及格式化所有数据。另外&#xff0c;每个 std::basic_regex 对象也都与一个本地环境对…