Java面向对象之封装
面向对象的三个特征:封装、继承和多态。
Java开发的过程就是找合适的库对象使用,没有对象创建新对象。找对象,建立对象,使用对象并维护对象之间的关系。
类就是对现实生活中事物的描述,而对象就是这类事物实实在在的个体。对应到Java编程中,描述就是class定义的类结构,
对象就是通过new申请堆内存建立的实体。定义类,就是在描述事物,就是在定义属性和行为。属性和行为共同成为类中的成员
(成员变量和成员方法)。
成员变量和局部变量的区别:
1.作用范围:成员变量作用于整个类中,局部变量作用于函数中或者语句中;
2.存储位置:成员变量在堆内存中,因为对象的存在才在内存中存在,局部在栈内存中。
匿名对象:
Car c=new Car(); c.num=5; 等价于 new Car().num=5;
如果new Car().num=5; new Car().color="blue"; new Car().run; //创建了三个对象
功能函数问题
main()
{
Car c=new Car();
show(c);//show(new Car())
}
public static void show(Car c)
{
c.num=3;
c.color='black';
c.run();
}
参量c是副本,但是由于只创建了一个对象,c其实包含着指针,main函数中的c和参量c都是指向堆控件对象。
特征一:封装
隐藏对象的内部细节(相对于用户透明),对外提供公共访问接口,可以控制传入的数据(加入逻辑判断等语句),提高代码的健壮性。
好处:将变化隔离;便于使用;提高重用性;提高安全性。
prinvate关键字:
私有修饰符,用于修饰类中的成员(成员变量和成员函数),是封装的一种表现形式。(权限在访问不到的形式,就是封装)
构造代码块,没有函数名和类型及参数只有 {...}
作用:给对象初始化,对象一建立就运行,且优先于构造函数执行,定义对象共性;和构造函数区别是,构造代码块是给所有对象进行统
一初始化,而构造函数是给对应的对象初始化。当然了,构造函数还是要执行的。
构造函数私有化后不能用此构造函数创建对象。
构造函数如:Person(String name){name =name;}//原来成员变量有name,但是这里两个都当成局部变量,必须要用this,this.name=name;
this关键字:
就代表本类的对象,代表它所在函数所属对象的引用,当函数内部要用到调用本类对象时用到。
public boolean compear(Person p)
{
return this.age==p.age;
}
main (){
Person p1=new Person(20);
Person p2=new Person(25);
boolean b=p1.compare(p2);
}
this:在构造函数间调用时使用
例如 :
Person(Sting name)
{
this.name=name;
}
person(String name,int age)
{
//this.name=name;
this(name);//只能放在第一行,初始化的动作要先执行
this.age=age;
}
static关键字:
class Person
{
String name;
String country ="CN";
public void show()
{
System.out.println(name+"::"+country);
}
}
class StaticDemo
{
public static void main(String[] args)
{
Person p=new Person();
p.name="zhangsan";
p.show();
}
}
有这么一种情况,当很多都是中国人的对象时,country这个成员变量在很多对象间都是通用的,当创建很多对象时,堆内会占用很多不必要的空间,所以 String country ="CN";这样就可以了。其在方法区/共享区/数据区,这里面放着方法(功能函数)和共享的数据。
用法:当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调用。类名.静态成员,比如System.out.println(Person.country);
static特点:
1.随着类的加载而加载;(也就是静态随着类的消失而消失,它的生命周期最长)
2.优先于对象而存在;(静态是先存在的,对象是后存在的)
3.被所有对象所共享;
4.可以直接被类名调用。
实例变量和类变量的区别:
1.存放位置
类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中
2.生命周期:
类变量生命周期最长,随着类的消失而消失
实例变量生命周期随着对象的消失而消失
静态使用注意:
1.静态方法只能访问静态成员(变量或者方法,当类名调用时非静态还没有呢);
非静态既可以访问静态也可以访问非静态;
2. 静态方法中不可以定义this,super关键字,因为静态优先于对象存在,所以静态方法中不可以出现this。
3.主函数是静态的。
优缺点:
1.优点,对对象的共享数据进行单独空间的存储,节省空间,还可以直接被类名调用;
2.缺点,生命周期过长,访问出现局限性(静态虽好,只能访问静态)。
Java面向对象之封装的更多相关文章
- Java面向对象(封装性概论)
Java面向对象(封装性概论) 知识概要: (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...
- Java面向对象的封装
封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...
- java面向对象(封装,继承,多态,抽象,接口的定义和实现)
1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Java面向对象之封装 入门实例(一)
一.基础概念 (一)面向对象的三大特征: 1.封装 2.继承 3.多态 (二)封装:隐藏实现细节,对外提供公共的访问方式(接口). 封装的体现之一:将属性都 ...
- java面向对象之封装性
面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...
- Java 面向对象,封装,继承
1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...
- Java 面向对象和封装
目录 面向对象思想的概述 类和对象的关系 什么是类 什么是对象 类和对象的关系 局部变量和成员变量的区别 this关键字 构造方法 一个标准的类 面向对象思想的概述 面向过程:当需要实现一个功能的时候 ...
- Java面向对象07——封装
封装 (补充 this关键字): package oop.demon01.demon03; /* 封装的意义: 1. 提高程序的安全性,保护代码 2. 隐藏代码 ...
随机推荐
- ls目录内容
ls:列出目录内容 1.常用参数: -a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件(常用) -A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录). -c ...
- 一张图告诉你,只会HTML还不够!
会了HTML和HTML5语法,你就真的会了HTML吗,来看这张图!是这本<超实用的HTML代码段>入门实例书的导览!熊孩子们,赶紧学习去吧! 如果一半以上的你都不会,必须看这本书,阿里一线 ...
- Template function 函数模板用法
#include<iostream> using namespace std; const double PI = 3.1415926; template <class T> ...
- GitHub上值得关注的iOS开源项目
1.AFNetworking地址:https://github.com/AFNetworking/AFNetworking用于网络请求 2.JSONKit地址:https://github.com/j ...
- 通过openswan基于Azure平台搭建VPN server
用过Azure的读者都知道,Vnet一直是Azure比较自豪的地方,尤其是VPN,Azure提供了两种VPN以及专线来保证客户数据的安全性,S2S vpn(站点到站点的,基于IPsec的),P2S v ...
- 为什么axios请求接口会发起两次请求
之前在使用axios发现每次调用接口都会有两个请求,第一个请求时option请求,而且看不到请求参数,当时也没注意,只当做是做了一次预请求,判断接口是否通畅,但是最近发现并不是那么回事. 首先我们知道 ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- C# webBrowser控件禁用alert,confirm之类的弹窗解决方案
同样的代码,我尝试了很多次都没有成功.最后终于成功了,是因为我没有在正确的事件里面调用这段代码. private void InjectAlertBlocker() { HtmlElement hea ...
- Mysql binlog 安全删除
简介: 如果你的 Mysql 搭建了主从同步 , 或者数据库开启了 log-bin 日志 , 那么随着时间的推移 , 你的数据库 data 目录下会产生大量的日志文件 shell > ll /u ...
- JS Date.parse() 函数详解
Date.parse()函数用于分析一个包含日期的字符串,并返回该日期与 1970 年 1 月 1 日午夜之间相差的毫秒数. 该函数属于Date对象,所有主流浏览器均支持该函数. 语法 Date.pa ...