【Java基础】——面向对象:封装

news2024/11/17 17:24:07

在这里插入图片描述

【Java基础】——面向对象:封装

  • 一、类和对象
  • 二、类的结构:属性、方法、构造器
    • 1、属性
    • 2、方法
      • 2.1、方法的定义
      • 2.2、方法的重载
      • 2.3、可变个数的形参
      • 2.4、方法参数的值传递机制
    • 3、构造器
      • 3.1、构造器的特征
      • 3.2、构造器的作用:
      • 3.3、构造器重载
  • 三、封装与隐藏
    • 1、信息的封装和隐藏
    • 2、四种访问权限修饰符

面向对象学习的 三条主线
1.Java类及类的成员:属性、方法、构造器;代码块、内部类。
2.面向对象的大特征:封装性、继承性、多态性、(抽象性)。
3.其它关键字:this、super、static、final、abstract、interface、package、import等。

一、类和对象

Java类及类的成员:属性、方法、构造器;代码块、内部类
1、面向对象中两个重要的概念:

类:对一类事物的描述,是抽象的、概念上的定义
对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)

面向对象程序设计的重点是类的设计
设计类,就是设计类的成员。

2、完成一个项目(或功能)的思路:

根据问题需要,选择问题所针对的现实世界中的实体。
从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。

3、二者的关系
对象,是由类new出来的,派生出来的。

4、面向对象思想落地实现的规则

1.创建类,设计类的成员。
2.创建类的对象。
3.通过“对象.属性”或“对象.方法”调用对象的结构。

补充:几个概念的使用说明
属性 = 成员变量 = field = 域、字段
方法 = 成员方法 = 函数 = method
创建类的对象 = 类的实例化 = 实例化类

5、对象的创建及内存解析
典型代码:
创建对象语法: 类名 对象名 = new 类名();

Person p1 = new Person();
Person p2 = new Person();
Person p3 = p1;//没有新创建一个对象,共用一个堆空间中的对象实体。

说明:如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非static的)
意味着:如果我们修改一个对象的属性a,则不影响另外一个对象属性a的值。
内存解析:
在这里插入图片描述

二、类的结构:属性、方法、构造器

1、属性

语法格式: 修饰符 数据类型 属性名 = 初始化值 ;

对比:属性 vs 局部变量
相同点:

  • 定义变量的格式:数据类型 变量名 = 变量值。
  • 先声明,后使用。
  • 变量都其对应的作用域 。

不同点:
1、在类中声明的位置的不同

  • 属性:直接定义在类的一对{}内
  • 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

2、关于权限修饰符的不同

  • 属性:可以在声明属性时,指明其权限,使用权限修饰符。
    常用的权限修饰符:private、public、缺省、protected —>封装性
  • 局部变量:不可以使用权限修饰符。

3、默认初始化值的情况:

  • 属性:类的属性,根据其类型,都默认初始化值。
    整型(byte、short、int、long:0)
    字符型(char:0 (或’\u0000’))
    布尔型(boolean:false)
    引用数据类型(类、数组、接口:null)
  • 局部变量:没默认初始化值。
    意味着,我们在调用局部变量之前,一定要显式赋值。
    特别地:形参在调用时,我们赋值即可。

4、在内存中加载的位置:

  • 属性:加载到堆空间中 (非static)
  • 局部变量:加载到栈空间

在方法体外,类体内声明的变量称为成员变量
在方法体内部声明的变量称为局部变量
在这里插入图片描述
在这里插入图片描述

2、方法

2.1、方法的定义

方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中
也称为函数或过程。

将功能封装为方法的目的是,可以实现代码重用,简化代码。
Java里的方法不能独立存在,所有的方法必须定义在类里。
比如:Math类:sqrt()\random() …
Scanner类:nextXxx() …
Arrays类:sort() \ binarySearch() \ toString() \ equals() \ …
在这里插入图片描述

2.2、方法的重载

在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数
类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表,且参数列表必须不同。 (参数个数或参数类
型)。调用时, 根据方法参数列表的不同来区别。
重载示例:
//返回两个整数的和
int add(int x,int y){return x+y;}
//返回三个整数的和
int add(int x,int y,int z){return x+y+z;}
//返回两个小数的和
double add(double x,double y){return x+y;}

public class PrintStream {
    public static void print(int i) {……}
    public static void print(float f) {……}
    public static void print(String s) {……}
    public static void main(String[] args) {
        print(3);
        print(1.2f);
        print("hello!");
    }
}

2.3、可变个数的形参

JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定
义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可
变的实参。

//JDK 5.0以前: 采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0: 采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String…books);

举例:

	public void test(String[] msg){
        System.out.println(“含字符串数组参数的test方法 ");
    }
    public void test1(String book){
        System.out.println(****与可变形参方法构成重载的test1方法****");
    }
    public void test1(String ... books){
        System.out.println("****形参长度可变的test1方法****");
    }
    public static void main(String[] args){
        TestOverload to = new TestOverload();
//下面两次调用将执行第二个test方法
        to.test1();
        to.test1("aa" , "bb");
//下面将执行第一个test方法
        to.test(new String[]{"aa"});
    }

2.4、方法参数的值传递机制

方法,必须由其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数。
实参: 方法调用时实际传给形参的参数值。

public class ValueTransferTest {
	
	public static void main(String[] args) {
		
		System.out.println("***********基本数据类型:****************");
		int m = 10;
		int n = m;
		
		System.out.println("m = " + m + ", n = " + n);
		
		n = 20;
		
		System.out.println("m = " + m + ", n = " + n);
		
		System.out.println("***********引用数据类型:****************");
		
		Order o1 = new Order();
		o1.orderId = 1001;
		
		Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中同一个对象实体。
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
		
		o2.orderId = 1002;
		
		System.out.println("o1.orderId = " + o1.orderId + ",o2.orderId = " +o2.orderId);
		
	}
	
}

class Order{
	
	int orderId;
	
}

基本数据类型:*****
m = 10, n = 10
m = 10, n = 20
引用数据类型:*****
o1.orderId = 1001,o2.orderId = 1001
o1.orderId = 1002,o2.orderId = 1002

Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种: 值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参。
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参。

3、构造器

语法格式:
修饰符 类名 (参数列表) {
初始化语句;
}

3.1、构造器的特征

  • 它具有与类相同的名称
  • 它不声明返回值类型。(与声明为void不同)
  • 不能被static、 final、 synchronized、 abstract、 native修饰,不能有return语句返回值

3.2、构造器的作用:

创建对象;给对象进行初始化。
如: Order o = new Order(); Person p = new Person(“Peter”,15);
如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人” 的构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。

public class Animal {
    private int legs;
    // 构造器
    public Animal() {
        legs = 4;
    }
    public void setLegs(int i) {
        legs = i;
    }
    public int getLegs() {
        return legs;
    }
}

创建Animal类的实例: Animal a = new Animal(); 调用构造器, 将legs初始化为4。

根据参数不同,构造器可以分为如下两类

  • 隐式无参构造器(系统默认提供)
  • 显式定义一个或多个构造器(无参、有参)

注意:

  • Java语言中,每个类都至少有一个构造器。
  • 默认构造器的修饰符与所属类的修饰符一致。
  • 一旦显式定义了构造器, 则系统不再提供默认构造器。
  • 一个类可以创建多个重载的构造器。
  • 父类的构造器不可被子类继承。

3.3、构造器重载

构造器一般用来创建对象的同时初始化对象。如

class Person{
	String name;
	int age;
	public Person(String n , int a){ name=n; age=a;}
} 

构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。
构造器重载举例:

public class Person{
public Person(String name, int age, Date d) {this(name,age);}
public Person(String name, int age) {}
public Person(String name, Date d) {}
public Person(){}
}

构造器重载,参数列表必须不同。

三、封装与隐藏

我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 : 仅对外暴露少量的方法用于使用。

隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提
高系统的可扩展性、可维护性。通俗的说, 把该隐藏的隐藏起来,该暴露
的暴露出来。 这就是封装性的设计思想。

1、信息的封装和隐藏

Java中通过将数据声明为私有的(private), 再提供公共的( public)
方法:getXxx()和setXxx()实现对该属性的操作, 以实现下述目的

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据, 可以方便地加入控制逻辑,
    限制对属性的不合理操作;
  • 便于修改, 增强代码的可维护性。
public class AnimalTest {
	public static void main(String[] args) {
		
		Animal a = new Animal();
		a.name = "大黄";
//		a.age = 1;
//		a.legs = 4;//The field Animal.legs is not visible
		
		a.show();
		
//		a.legs = -4;
//		a.setLegs(6);
		a.setLegs(-6);
		
//		a.legs = -4;//The field Animal.legs is not visible
		a.show();
		
		System.out.println(a.name);
		
	}
}


class Animal{
	
	String name;
	private int age;
	private int legs;//腿的个数
	
	//对属性的设置
	public void setLegs(int l){
		if(l >= 0 && l % 2 == 0){
			legs = l;
		}else{
			legs = 0;
//			抛出一个异常(暂时没有讲)
		}
	}
	
	//对属性的获取
	public int getLegs(){
		return legs;
	}
	
	
	public void eat(){
		System.out.println("动物进食");
	}
	
	public void show(){
		System.out.println("name = " + name + ",age = " + age + ",legs = " + legs);
	}
	
	//提供关于属性age的get和set方法
	public int getAge(){
		return age;
	}
	public void setAge(int a){
		age = a;
	}
	
}

2、四种访问权限修饰符

Java权限修饰符public、 protected、 (缺省)、 private置于类的成员定义前,用来限定对象对该类成员的访问权限。
在这里插入图片描述
对于class的权限修饰只可以用public和default(缺省)。

  • public类可以在任意地方被访问。
  • default类只可以被同一个包内部的类访问。

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

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

相关文章

细菌,真菌,病毒——感染,免疫反应以及治疗用药差异

谷禾健康 与人类密切相关的微生物 我们的世界大到浩瀚宇宙,小到微观下的生物分子。我们总说漫天繁星,其实身边微生物数量可能更多。动物、植物、真菌、细菌、病毒等,共同构成了丰富多彩的生命世界。 细菌、真菌、病毒是其中的三个大类&#x…

spring integration使用:消息路由

系列文章目录 …TODO spring integration开篇:说明 …TODO spring integration使用:消息路由 spring integration使用:消息路由系列文章目录前言消息路由的概念二、路由的分类基于内容的路由器spring integration中的实现RecipientListRoute…

Python property()函数:定义属性

我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。因此,在不破坏…

AOP的四种增强方式

1. 前置增强,在核心功能之前执行的额外功能 public class MyBeforeAdvice implements MethodBeforeAdvice{Overridepublic void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {System.out.print("this is my before advice!");Str…

渲染函数render

文章目录节点、树以及虚拟 DOM树节点虚拟 DOMvue中render函数的作用render函数去创建子组件内容createElement官方文档参考节点、树以及虚拟 DOM 在深入渲染函数之前&#xff0c;了解一些浏览器的工作原理是很重要的。以下面这段 HTML 为例&#xff1a; <div><h1>…

user-select:none真的能禁止文本的复制粘贴吗?

1. 前言 面向搜索引擎开发时&#xff0c;我们经常看到这样的情况&#xff1a;登录后复制。 由于设置了css属性 user-select:none&#xff0c;此时鼠标无法实现选中文本&#xff0c;也就无法复制文本&#xff0c;通常会采用这种方式来禁止复制文本。打开开发者工具-审查元素&am…

k-means聚类

一、概述 当前人工智能技术实现的一种主要手段是机器学习&#xff0c;而机器学习能够解决的问题主要有三种&#xff1a;分类、聚类、回归&#xff0c;有监督的是分类&#xff0c;无监督的是聚类。所谓聚类&#xff0c;就是以一定的方法将一堆样本依它们本身的数据特性划分成不同…

docker安装mongdb

MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常松散&#xff0c;是类似json的bson格式&#xff0c;因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非…

【操作系统】备忘录

进程上下文切换 用户态、内核态 内核态&#xff1a;也叫内核空间&#xff0c;是内核进程/线程所在的区域。主要负责运行系统、硬件交互。 用户态&#xff1a;也叫用户空间&#xff0c;是用户进程/线程所在的区域。主要用于执行用户程序。 内核态与用户态的区别 内核态与用户…

spring mvc文档阅读笔记——02

目录标题一、Asynchronous Requests&#xff08;异步请求&#xff09;&#xff08;一&#xff09;阻塞和非阻塞,同步和异步&#xff08;二&#xff09;DeferredResult&#xff08;三&#xff09;Callable二、跨域请求CORS&#xff08;一&#xff09;实现跨域请求的方式&#xf…

数据持久化-RDB-AOF

定义 将数据从掉电易失的内存放到永久储存的设备上 因为所有的数据都在内存是&#xff0c;所有必须得持久化 redis提供两种持久化方案 RDB默认开启、AOF RDB 1,保存真是的数据 2&#xff0c;将服务器包含的所有数据库数据以二进制文件形式保存到磁盘里面 3&#xff0c;默认…

JDBC管理事务

基本介绍 就是处理在mysql的事务 复习一下:事务是一组sql语句需要开启和提交&#xff0c;事务中的sql语句要么全部生效&#xff0c;要么全部不生效&#xff0c;提交之后就是全部生效&#xff0c;中间可以设置保存点&#xff0c;回退到保存点&#xff0c;或直接回退到最开始事务…

1.2.1存储结构:层次化存储结构、外存(辅存)、内存(主存)、CPU内部的寄存器、Cache(相联存储器)

1.2.1存储结构&#xff1a;层次化存储结构、外存&#xff08;辅存&#xff09;、内存&#xff08;主存&#xff09;、CPU内部的寄存器、Cache&#xff08;相联存储器&#xff09;存储系统--层次化存储结构外存&#xff08;辅存&#xff09;内存&#xff08;主存&#xff09;CPU…

并发编程学习(八):ReentrantLock

ReentrantLock 是java.util.concurrent.locks包下的类。相对于synchronized,它具备如下特性&#xff1a;可中断。可以设置超时时间。可以设置公平锁。支持多个条件变量。即可以有个多个waitset等待队列。与synchronized都支持可重入。ReentrantLock的基本语法&#xff1a;// 获…

数学建模相关竞赛零基础上手与入门介绍

文章目录1、赛事介绍与报名2、学习与训练2.1 比赛题目选择范围2.2 赛前组队与分工2.3 比赛时间分配1、赛事介绍与报名 什么是数学建模&#xff1f; 定义&#xff1a; 生活中的各种问题(如股票预测、火灾报警统计等)&#xff0c;运用数学的方式去阐述并解决它。 数学建模赛事 …

cisp证书含金量怎么样?值不值得考?

这是CISP考试报名条件参考&#xff1a; 成为CISP&#xff0c;必须满足以下基本要求&#xff1a; 申请CISE、CISO注册资质&#xff0c;需满足以下教育和工作经验要求&#xff1a; &#xff08;1&#xff09;教育和工作经历要求&#xff1a;硕士及硕士以上学历&#xff0c;具备…

LabVIEW在实时目标上使用文件路径

LabVIEW在实时目标上使用文件路径文件路径和结构因目标操作系统而异。本文档讨论了推荐的LabVIEW编码实践&#xff0c;用于指定文件路径&#xff0c;以便应用程序可以无缝地从目标移动目标。实时操作系统选项所有NI实时控制器运行三种不同的操作系统之一&#xff0c;即PharLap、…

Find My资讯|美国航班取消,出行者疯狂购买苹果AirTag追踪行李箱

美国西南航空&#xff08;Southwest Airlines Co.&#xff09;由于所使用的 SkySolver 系统在圣诞假期间崩溃&#xff0c;导致航班出现大面积延误或取消&#xff08;大约 13000 个航班受到影响&#xff09;&#xff0c;让公司损失超过 8 亿美元&#xff08;当前约 53.76 亿元人…

5.kafka--生产调优

文章目录Leader Partition负载均衡消费者初始化流程消费者再平衡生产者和消费者如何提高吞吐量如何发送大消息Leader Partition负载均衡 参数名称描述auto.leader.rebalance.enable默认是true。自动LeaderPartition平衡。生产环境中&#xff0c;leader重选举的代价比较大&…

ADB快速入门

ADB快速入门 一、 简介 Android Debug Bridge&#xff0c;我们一般简称为adb&#xff0c;主要存放在sdk安装目录下的platform-tools文件夹中&#xff0c;它是一个非常强大的命令行工具&#xff0c;通过这个工具用来连接电脑和Android设备&#xff08;手机、电脑、电视、平板、…