Java筑基-面向对象

在这里插入图片描述


Java-面向对象

  • 一、类和对象
    • 1、类和对象的关系
    • 2、创建类
    • 3、创建对象
    • 4、成员变量与局部变量
    • 5、构造器
      • 5.1、创建对象的过程
      • 5.2、构造器的格式
      • 5.3、构造器和方法的区别
      • 5.4、构造器的作用
      • 5.5、构造器的重载
    • 6、this关键字用法:
      • 6.1、this可以修饰属性
      • 6.2、this可以修饰方法
      • 6.3、this可以修饰构造器
    • 7、static
      • 7.1、static修饰属性
        • 7.1.1、static静态域示意图
        • 7.1.2、static修饰属性的应用创建
      • 2、static修饰方法
    • 8、代码块
      • 8.1、代码块执行顺序:

一、类和对象

1、类和对象的关系

万事万物皆对象
对象就是具体的事物,具体的实体,具体的实例,模板下具体的产品。
类:类是抽象的,是一个模板。

2、创建类

package com.company.TestOOP;public class Person {//名词——》属性——》成员变量——》放在类中,方法外String name;int age;double weight;double height = 175;//动词——》方法//吃饭public void eat() {int num = 20; //局部变量,放在方法中,必须进行初始化System.out.println("吃饭");}public void sleep(String address) {System.out.println("我在睡觉地点在:" + address);}//自我介绍public String interduce() {return "我的名字是:" + name + ",我的年龄" + age + ",我的身高是:" + height + ",我的体重是:" + weight;}}

3、创建对象

第一次加载类的时候,会进行类的加载,初始化创建对象的时候,对象的属性没有给赋值,有默认的初始化的值。
再次创建对象时,就不会进行类的加载了,类的加载只在第一次需要的时候加载一次。
不同的对象,属性有特有的值,但是方法都是调用类中通用的方法。
对象的属性是独立的方法;
各个对象的方法是共享的。

package com.company.TestOOP;public class Test {public static void main(String[] args) {//创建一个人类的具体的对象/实例://Person属于引用数据类型//创建一个对象,对象的名字叫zs//第一次加载类的时候,会进行类的加载,初始化创建对象的时候,对象的属性没有给赋值,有默认的初始化的值Person zs = new Person();zs.name="kobe";zs.age=19;zs.height=180;zs.weight=170;//再次创建对象时,就不会进行类的加载了,类的加载只在第一次需要的时候加载一次。Person ls = new Person();ls.name="james";ls.age=19;ls.height=180;ls.weight=170;System.out.println(ls.name);System.out.println(zs.name);//不同的对象,属性有特有的值,但是方法都是调用类中通用的方法。//属性,各个对象的属性是独立的//方法:各个对象的方法是共享的ls.eat();zs.eat();zs.sleep("酒店");String s = ls.interduce();System.out.println(s);}
}
james
kobe
吃饭
吃饭
我在睡觉地点在:酒店
我的名字是:james,我的年龄19,我的身高是:180.0,我的体重是:170.0

4、成员变量与局部变量

区别:
1、代码中位置不同:
成员变量:在类中,方法外。
局部变量:方法中定义的变量,代码块中定义的变量
2、代码的作用范围
成员变量:当前类的很多方法
局部变量:当前一个方法(当前代码块)
3、是否有默认值
成员变量:有
局部变量:无
在这里插入图片描述
4、是否要初始化
成员变量:不需要,不建议初始化,后续使用的时候再赋值即可。
局部变量:一定需要,不然使用的时候直接报错。

5、内存中位置不同
成员变量:堆内存
局部变量:栈内存

6、作用时间不同
成员变量:当前对象从创建到销毁
局部变量:当前方法从开始执行到执行完毕

5、构造器

5.1、创建对象的过程

1、第一次遇到Person的时候,进行类的加载(并且只加载1次)
2、创建对象,为这个对象在堆中开辟空间
3、为对象进行属性的初始化动作

new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)。
调用构造方法的时候,如果你的类中没有写构造器,那么系统会默认分配一个构造器,只是我们看不到罢了。
可以自己显示的将构造器编写出来。

5.2、构造器的格式

 [修饰符] 构造器名字(){}

5.3、构造器和方法的区别

1、没有方法的返回值类型
2、方法体内部不能有return
3、构造器的名字很特殊,必须和类名一模一样

5.4、构造器的作用

不是为了创建对象,因为在调用构造器之前,这个对象已经创建好了,并且属性有默认的初始化的值。
调用构造器的目的:是给属性进行赋值操作

注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。
实际上:我们只要保证空构造器的存在就可以了,里面的东西不用写。

package com.msb;public class Person {//属性String name;int age;double height;//构造器:没有任何参数的构造器;空参构造器public Person(){//注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。
//        age = 19;
//        name = "kobe";
//        height = 180;}//方法public void eat(){System.out.println("吃饭");}
}
package com.msb;public class Test {public static void main(String[] args) {//创建一个Person类的具体的对象/实例/实体/*创建对象的过程:1、第一次遇到Person的时候,进行类的加载(并且只加载1次)2、创建对象,为这个对象在堆中开辟空间3、为对象进行属性的初始化动作new关键字实际上是在调用一个方法,这个方法叫构造方法(构造器)调用构造方法的时候,如果你的类中没有 写构造器,那么系统会默认分配一个构造器,只是我们看不到罢了可以自己显示的将构造器编写出来。构造器的格式:[修饰符] 构造器名字(){}构造器和方法的区别:1、没有方法的返回值类型2、方法体内部不能有return3、构造器的名字很特殊,必须和类名一模一样构造器的作用:不是为了创建对象,因为在调用构造器之前,这个对象已经创建好了,并且属性有默认的初始化的值。调用构造器的目的:是给属性进行赋值操作注意:一般不会在空构造器中进行初始化操作,因为那样的话每个对象的属性就一样了。实际上:我们只要保证空构造器的存在就可以了,里面的东西不用写。*/Person zs = new Person();System.out.println(zs.age);System.out.println(zs.name);}
}

5.5、构造器的重载

当形参名字和属性名字重名的时候,程序有就近原则
在要表示对象的属性前加上this关键字,this表示当前对象;

package com.msb1;public class Person {//属性String name;int age;double height;//构造器:没有任何参数的构造器;空参构造器public Person() {}public Person(String name, int age, double height) {//当形参名字和属性名字重名的时候,程序有就近原则//在要表示对象的属性前加上this关键字,this表示当前对象;this.name = name;this.age = age;this.height = height;}public Person(String a, int b) {name = a;age = b;}//方法public void eat() {System.out.println("吃饭");}
}

1、一般保证空构造器的存在,空构造器中一般不会进行属性的赋值操作。
2、一般我们会重载构造器,在重载的构造器中进行属性赋值操作。
3、在重载构造器以后,假如空构造器忘记写了,系统也不会给你分配默认的空构造器了,那么调用的时候就会出错。

package com.msb1;public class Test {public static void main(String[] args) {/*1、一般保证空构造器的存在,空构造器中一般不会进行属性的赋值操作。2、一般我们会重载构造器,在重载的构造器中进行属性赋值操作。3、在重载构造器以后,假如空构造器忘记写了,系统也不会给你分配默认的空构造器了,那么调用的时候就会出错。*/Person zs = new Person("kobe", 20, 180);System.out.println(zs.name);System.out.println(zs.age);System.out.println(zs.height);}
}

6、this关键字用法:

1、在第一次遇到一个类的时候,对这个类进行加载,只加载一次。
2、创建对象,在堆中开辟空间。
3、对对象进行初始化操作,属性赋值都是默认的初始值。
4、new关键字调用构造器,执行构造器方法,对对象的属性进行重新赋值。

从上面的效果可以看到,this指代的就是当前对象。内存如下
在这里插入图片描述

6.1、this可以修饰属性

总结:
当属性名字和形参发生重名的时候,或者属性名字和局部变量重名的时候,都会发生就近原则,所以如果我要直接使用变量名字指的是离得近的形参或者局部变量。如果我想要表示属性的话,在前面要加上this.修饰

如果不发生重名问题的话,实际上你要是访问属性也可以省略this.不写

package com.msb2;public class Test {public static void main(String[] args) {//创建一个Person类的具体对象Person p = new Person(19,"kobe",180);p.eat();}
}
package com.msb2;public class Person {//属性int age;String name;double height;//空构造器public Person() {}//有参构造器public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;}public void eat() {int age = 10;System.out.println(age);  // 就近原则10System.out.println(this.age); //这里指代的是属性的ageSystem.out.println("吃饭");}}

6.2、this可以修饰方法

总结:在同一个类中,方法可以互相调用,this.可以不写

package com.msb2;public class Test {public static void main(String[] args) {//创建一个Person类的具体对象Person p = new Person(19,"kobe",180);p.eat();}
}
package com.msb2;public class Person {//属性int age;String name;double height;//空构造器public Person() {}//有参构造器public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;}public void eat() {int age = 10;System.out.println(age);  // 就近原则10System.out.println(this.age); //这里指代的是属性的ageSystem.out.println("吃饭");}public void play() {this.play1();  //this可以省略不写System.out.println("吃饭");System.out.println("学习");System.out.println("睡觉");}public void play1() {System.out.println("学习");}}

6.3、this可以修饰构造器

总结:同一个类中的构造器可以相互用this调用,注意,this修饰构造器必须放到第一行。

package com.msb2;public class Person {//属性int age;String name;double height;//空构造器public Person() {}//有参构造器public Person(int age, String name, double height) {this.age = age;this.name = name;this.height = height;}//有参构造器public Person(int age, String name) {this(age);this.name = name;}//有参构造器public Person(int age) {this.age = age;}public void eat() {int age = 10;System.out.println(age);  // 就近原则10System.out.println(this.age); //这里指代的是属性的ageSystem.out.println("吃饭");}public void play() {this.play1();  //this可以省略不写System.out.println("吃饭");System.out.println("学习");System.out.println("睡觉");}public void play1() {System.out.println("学习");}}

7、static

static可以修饰:属性、方法、代码块、内部类

7.1、static修饰属性

package com.mas_static;public class Test {//属性int id;static int sid;public static void main(String[] args) {//创建对象Test t1 = new Test();t1.id = 10;t1.sid = 10;Test t2 = new Test();t2.id = 20;t2.sid = 20;Test t3 = new Test();t3.id = 30;t3.sid = 30;//读取属性的值System.out.println(t1.id);System.out.println(t2.id);System.out.println(t3.id);System.out.println(t1.sid);System.out.println(t2.sid);System.out.println(t3.sid);}
}
7.1.1、static静态域示意图

在这里插入图片描述
在这里插入图片描述
一般官方的推荐访问方式:类名.属性名
static修饰总结:
1、在类加载的时候一起加载入方法区中的静态域中
2、先于对象存在
3、访问方式:对象名.属性名 类名.属性名

7.1.2、static修饰属性的应用创建

某些特定的数据,想要在内存中共享,只有一块——》这个情况下,使用static修饰。

package com.mas_static;public class MSBStudent {String name;int age;static String school;public static void main(String[] args) {MSBStudent.school = "qh";MSBStudent s1 = new MSBStudent();s1.name = "kobe";s1.age = 20;
//        s1.school = "qh";MSBStudent s2 = new MSBStudent();s2.name = "kobe";s2.age = 20;
//        s2.school = "qh";System.out.println(s2.school);}
}

属性:
静态属性(类变量、类属性)
非静态属性(实例变量、实例属性)

2、static修饰方法

1、static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都可以
2、在静态方法中不能访问非静态的属性
3、在静态方法中不能访问非静态的方法
4、在静态方法中,不能使用this关键字
5、非静态的方法可以使用对象名.方法名去调用
6、静态的方法可以使用 对象名.方法名去调用 也可以用类名.方法名去调用

package com.mas_static;public class Demo {int id;static int sid;public void a(){System.out.println("------a");System.out.println(id);System.out.println(sid);}//1、static和public都是修饰符,并列的没有先后顺序,先写谁后写谁都可以public static void b(){
//        System.out.println(this.id); //在静态方法中,不能使用this关键字
//        a();     //在静态方法中不能访问非静态的方法System.out.println("------b");
//        System.out.println(id);  //在静态方法中不能访问非静态的属性System.out.println(sid);}public static void main(String[] args) {//非静态的方法可以使用对象名.方法名去调用Demo d =new Demo();d.a();//非静态的方法可以使用  对象名.方法名去调用  也可以用类名.方法名去调用Demo.b();d.b();}}

8、代码块

代码块分为:普通块、构造块、静态块、同步块(多线程)
总结:

8.1、代码块执行顺序:

最先执行静态块,并且只在类加载的时候只执行一次,所以一般一九实战写项目:创建工厂、数据库初始化信息,一般用于执行全局性的初始化操作。
再执行构造块。(不常用)
再执行构造器。
再执行方法中的普通块。

package com.msb3;public class Test {//属性int a;static int sa;//方法public void a(){System.out.println("a");{//普通块限制了局部变量的作用范围System.out.println("这是普通块");int num = 1;System.out.println(num);}}//静态方法public static void b(){System.out.println("b");}//构造块{System.out.println("这是构造块");}//静态块static {//在静态块中只能访问静态方法,静态属性System.out.println("这是静态块");System.out.println(sa);b();}public Test(){System.out.println("这是空构造器");}//构造器public Test(int a){this.a=a;}public static void main(String[] args) {Test t= new Test();t.a();Test t1= new Test();t1.a();}}
这是静态块
0
b
这是构造块
这是空构造器
a
这是普通块
1
这是构造块
这是空构造器
a
这是普通块
1Process finished with exit code 0

在这里插入图片描述

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

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

相关文章

【Ubuntu常用命令】终端个人常用命令总结

【Ubuntu常用命令】终端常用命令总结 查看硬盘挂载情况查看内存占用情况移动或重命名文件和目录复制文件或目录conda安装本地文件 查看硬盘挂载情况 mount 命令会列出当前系统上所有已挂载的文件系统。它会显示挂载点、文件系统类型、挂载选项等信息 mount df 命令用于显示文…

【一小时学会Charles抓包详细教程】Charles 抓包相关设置 (7)

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 Charles 抓包相…

数据库(18)——DCL权限控制

MySQL常用权限 权限说明ALL,ALL PRIVILEGES所有权限SELECT查询数据INSERT插入数据UPDATE修改数据DELETE删除数据ALTER修改表DROP删除数据库/表/视图CREATE创建数据库/表 DCL语法 查询权限 SHOW GRANTS FOR 用户名主机名; 查询hello的权限 SHOW GRANTS FOR hellolocalhost; 授…

GCB | 基于36年5个生态系统观测数据发现表层土壤深度提高生态系统的生产力和稳定性

陆地生态系统生产力对全球粮食安全和促进碳固存至关重要,但生产力受到气候变化以及火灾、干旱、洪水、霜冻频率增加和生物多样性减少的压力。了解控制生态系统初级生产力变异的不同因素和机制,为维持生态系统初级生产力和增强生态系统恢复力提供了科学依…

OJ1230进制的转换

答案&#xff1a; #include <bits/stdc.h> using namespace std; using lllong long; const int N10; int a[10]; char ch[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F}; void solve() {int n,m;cin>>n>>m;string str;cin>>str;for(int i0;i<str.size();i)…

字符串操作java

题目&#xff1a; 描述 给定长度为n的只有小写字母的字符串s&#xff0c;进行m次操作&#xff0c;每次将[l,r]范围内所有c1字符改成c2&#xff0c;输出操作完的字符串 输入描述&#xff1a; 第一行两个数n,m 第二行一个字符串s 之后m行&#xff0c;每行两个数l 、r两个字符…

【STL】优先级队列用法介绍及其实现

目录 前言 用法介绍 模拟实现 仿函数 迭代器区间构造 插入 删除 队顶 判空 大小 完整代码 前言 优先级队列&#xff08;priority_queue&#xff09;是一种特殊的队列数据结构&#xff0c;其中每个元素都有一个“优先级”。优先级最高的元素最先出队&#xff0c;而优…

内网域中NTLM中继那些事儿

0x01 初识NTLM协议 基本概念&#xff1a;NTLM(NT LAN Manager)认证是一种早期的Windows网络身份认证协议。它在Windows系统中用于验证用户的身份&#xff0c;并提供对网络资源的访问控制&#xff0c;它是一种基于Challenge/Response的认证机制。 认证流程 NTLM协议Challenge…

Python代码关系图生成,帮助快速熟悉一个项目

一、静态代码关系图 工具1、pyreverse pyreverse 是一个由 Logilab 开发的 Python 工具&#xff0c;它能够自动生成 UML (统一建模语言) 类图&#xff0c;这些类图基于 Python 源代码。pyreverse 可以分析 Python 代码&#xff0c;并从中提取出类、模块、函数、方法和它们之间…

Window下VS2019编译WebRTC通关版

这段时间需要实现这样一个功能&#xff0c;使用WebRTC实现语音通话功能&#xff0c;第一步要做的事情就是编译WebRTC源码&#xff0c;也是很多码友会遇到的问题。 经过我很多天的踩坑终于踩出来一条通往胜利的大路&#xff0c;下面就为大家详细介绍&#xff0c;编译步骤以及踩…

安卓组合控件(底部标签栏、顶部导航栏、增强型列表、升级版翻页)

本章介绍App开发常用的一些组合控件用法&#xff0c;主要包括&#xff1a;如何实现底部标签栏、如何运用顶部导航栏、如何利用循环视图实现3种增强型列表、如何使用二代翻页视图实现更炫的翻页效果。 底部标签栏 本节介绍底部标签栏的两种实现方式&#xff1a;首先说明如何通…

minos 2.3 中断虚拟化——GICv2 管理

首发公号&#xff1a;Rand_cs 该项目来自乐敏大佬&#xff1a;https://github.com/minosproject/minos 硬件肯定需要软件配合&#xff0c;这一节就来实战 GICv2 首先准备好 GICv2 手册&#xff1a;https://developer.arm.com/documentation/ihi0048/bb/?langen&#xff0c;对…

深入剖析Java逻辑运算符,解决日常开发难题

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

SpringBoot:手动创建应用

Spring提供了在线的Spring Initialzr在线创建Spring Boot项目&#xff0c;为了更好的理解Spring Boot项目&#xff0c;这里我们选择手动创建。 1.新建Web应用 1.1 生成工程 首先要做是创建一个Java项目&#xff0c;这里我们选择使用Maven来支持&#xff0c;使用archetype:ge…

现成方案 - 复刻版类似 Perplexity 与秘塔 AI 的搜索引擎

这里为大家带来一个极具创新性的开源 AI 搜索引擎&#xff0c;其灵感源自 Perplexity。 该搜索引擎主要具备以下功能&#xff1a; 能够接收用户提出的各种问题。借助 Bing 搜索 API 可查找出前 6 个结果并予以展示。会抓取这 6 个链接的文本内容&#xff0c;将其作为重要的上下…

Gavin Wood 访谈|Polkadot 从何而来,又将如何面对 AI 时代?

如果没有宏观经济&#xff0c;加密世界可能无法存在。或许&#xff0c;Satoshi Nakamoto 也永远不会写出那篇开创性的白皮书。区块链技术作为指数时代的核心之一&#xff0c;在宏观经济理论中占有重要地位。传统的经济增长公式是人口增长加生产率增长加债务增长。然而&#xff…

Python 高级数据类型

列表List 定义列表 可以将不同的基本数据类型或者列表装到一个列表里 my_list [1,2,3,4,5] print(my_list) # [1, 2, 3, 4, 5] 直接打印出列表的内容 print(type(my_list)) # <class list>my_list ["1","2","3","4","…

基于51单片机的智能晾衣架设计

一.硬件方案 智能自动晾衣架能够实现晾衣架的自动升降。与传统的手动晾衣架相比&#xff0c;自动晾衣架具有升降更省力&#xff0c;升降速度更快等优势&#xff0c;随着技术的日臻完善&#xff0c;自动晾衣架将成为市场的主导产品。 电路主要由 51单片机最小系统无线收发模块编…

数学建模之MATLAB入门教程(上)

前言&#xff1a; • MATLAB是美国Math Works公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 • MATLAB将数值分析、矩阵计算、科学数据可视化以及非线性动…

Python自动化识别与删除Excel表格空白行和列

在处理Excel数据时&#xff0c;经常会遇到含有空白行和空白列的情况。这些空白区域不仅占用表格显示空间&#xff0c;还可能导致数据分析时出现偏差&#xff0c;影响数据处理的效率与结果的准确性&#xff0c;如空白行可能干扰数据聚合操作&#xff0c;导致统计计数不准确&…