Java深入分析类与对象
深入分析类与对象
1,成员属性封装
在类之中的组成就是属性与方法,一般而言方法都是对外提供服务的,所以是不会进行封装处理的,而对于属性需要较高的安全性,所以往往需要对其进行保护,这个时候就需要采用封装性对属性进行保护。
在默认的情况下,对于类中的属性是可以通过其他类利用对象进行调用的。
·范例:属性封装情况下的问题
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person();//声明对象
person1.name="张三";
person1.age=18;
person1.tell();
}
}
·范例:对属性进行封装此时在Person类中提供的name与age两个属性并没有进行封装处理,但是有可能所设置的数据是一个错误的数据。如果想要解决这样的问题就可以利用private关键字进行封装处理。
class Person{
private String name;
private int age;
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}
·【setter、getter】设置或取得属性可以使用setXxx()、getXxx()方法,而属性一旦封装之后外部将不能够直接访问,即:外部不可见,但是对类的内部可见,如果想要外部的程序访问封装的属性,则在Java开发标准中提供有如下要求:
class Person{
private String name;
private int age;
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 void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}
·范例:实现方法
public class Main {
public static void main(String[] args) {
Person person1 = new Person();//声明对象
person1.setName("张三");
person1.setAge(-18);
person1.tell();
}
}
在以后任何类定义的时候一定要记住,类中的所有属性都必须要使用private封装(98%),并且属性如果要进行访问必须要提供setter、getter方法。
2,构造方法与匿名对象
现在的程序在使用类的时候一般都按照了如下的步骤进行:
·声明并且实例化对象,这个时候实例化对象中的属性并没有任何的数据存在,都是其对应数据的默认值;
·需要通过一系列的setter的方法进行为类中的属性设置内容。
等于现在想要真正活动一个可以正常使用的实例化对象,必须经过两个步骤才可以完成。
但是如果按照这样的方式来进行思考的话就会发现一个问题:假设类中的属性很多个,那么按照上述方法,就需要调用很多次setter的方法进行内容设置。这样的调用实在是太啰嗦了。所以在Java里面为了考虑到对象的初始化问题,专门提供有构造方法,即:可以通过构造方法实现实例化对象中的 属性初始化处理,只有在关键字new的时候才使用构造方法。
在Java程序里面构造方法的定义要求如下:
·构造方法名称与类名称保持一致;
·构造方法不允许设置任何的返回值类型,即没有返回值定义;
·构造方法是在使用关键字new实例化对象的时候自动调用的。
·范例:构造方法
class Person{
private String name;
private int age;
public Person() {//无参构造
}
public Person(String name, int age) {//有参构造
this.name = name;
this.age = age;
}
}
·之前的对象实例化格式:①Person ②per= ③new ④Person();下面针对当前的对象实例化格式与之前的对象实例化格式做一个比较:
·当前的对象实例化格式:①Person ②per= ③new ④Person("张三",18);
①【①Person】主要是定义对象的所属类型,类型决定了你可以调用的方法;
②【②per】实例化对象的名称;
③【③new】开辟一块新的堆内存空间;
④【④Person("张三",18)】调用有参构造、【④Person()】调用无参构造。
在Java的程序里面克绿道程序结构的完整性,所以所有的类都会提供有构造方法,也就是说如果现在你的类中没有定义任何构造方法,那么一定会默认提供一个无参,什么都不做的构造方法,这个构造方法是在程序编译的时候自动创建的。如果你先已经在类中明确的定义有一个构造方法的时候,那么这个默认的构造方法将不会被自动创建。
结论:一个类至少存在有一个构造方法,永恒存在。
|
疑问:为什么构造方法上不允许设置返回值类型??? 既然构造方法是一个方法,那么为什么不让它定义返回值类型呢? 既然构造方法不会返回数据,为什么不使用void定义呢? 分析:程序编译器是根据代码结构来进行编译处理的,执行的时候也是根据代码结构来处理的。 如果在构造方法上使用void,那么此结构就与普通方法相同了,这样编译器会认为此方法是一个普通方法,普通方法与构造方法最大的区别:构造方法是在类对象实例化的时候调用的,而普通方法是在类对象实例化产生之后调用的。 |
既然构造方法本身是一个方法,那么方法就具有重载的特点,而构造方法重载的时候只需要考虑参数的类型及个数即可。
·范例:构造方法重载
class Person {
private String name;
private int age;
public Person(){//无参构造
}
public Person(String name){//1参构造
super();
this.name=name;
}
public Person(String name,int age){//2参构造
this.name=name;
this.age=age;
}
public void tell(){
System.out.println("姓名:"+this.name+",年龄:"+this.age);
}
}
经过分析我们知道,setter与构造方法都可以进行的对象的属性设置,这个时候一定要清楚构造方法只在对象实例化的时候起作用,setter本身就是修改数据的功能。在进行多个构造方法定义的时候强烈建议大家有一些定义的顺序,例如:可以按照参数的个数降序或升序排列。
·定义对象的名称:类名称 对象名称 = null;
·实例化对象:对象名称 = new 类名称();
如果这个时候通过实例化对象来进行类的操作也是可以的,而这种形式的对象由于没有名字就称为匿名对象。
·范例:观察匿名对象
public class Main {
public static void main(String[] args) {
new Person("万雨",25).tell();//匿名对象,没有引用名称!!!
}
}
class Message{
private String title;
public Message(){}
public Message(String title){
this.title=title;
}
public void setTitle(String title) {//数据修改
this.title = title;
}
public String getTitle() {//数据获取
return this.title;
}
}
class Person{
private String name;
private int age;
public Person(){}
public Person(String name){
this.name=name;
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
public Person(Message msg,int age){//方法重载,构造方法也是方法
this.name=msg.getTitle();
this.age=age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public Message getInfo(){
return new Message(this.name+":"+this.age);
}
public void tell(){
System.out.println("【姓名】"+this.name+"【年龄】"+this.age);
}
}
public class Main {
public static void main(String[] args) {
Message msg=new Message("Mufasa");
Person person=new Person(msg,25);//声明对象、实例化对象
msg=person.getInfo();
System.out.println(msg.getTitle());
}
}
此时依然通过了对象进行了类中tell()方法的调用,但是由于此对象没有任何的引用名称,所以该对象使用一次之后就变成了垃圾,而所有的垃圾都将被GC回收与释放。
Java深入分析类与对象的更多相关文章
- 第31节:Java基础-类与对象
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...
- Java面向对象-类与对象
Java面向对象-类与对象 类与对象的关系 我们通俗的举个例子,比如人类是一种类,张三这个人就是人类的具体的一个个体,也就是java中的对象:这就是一个类与对象的关系: 类的定义 下面看实例 类的创建 ...
- 关于Java构造类与对象的思考
简单记录一下Java构造类与对象时的流程以及this和super对于特殊例子的分析. 首先,接着昨天的问题,我做出了几个变形: Pic1.原版: Pic2.去掉了T.foo方法中的this关键字: P ...
- JAVA基础——类和对象
java类与对象学习笔记 一.成员变量和局部变量 (1)定义 1.成员变量 在类中定义,用来描述对象将要有什么.(默认的成员变量值为0) 2.局部变量 在类的方法中定义,在方法中临时保存数据. 演示示 ...
- java(9)类和对象
一.理解什么是类和对象 万事万物皆对象 1.1.属性——对象具有的特征(特点) 1.2.方法——对象可执行的操作(能干什么事) 1.3.对象的定义: 是一个客观存在的,看的见或摸得着的实体,由属性和方 ...
- Java面向对象——类,对象和方法
1.类的概念 在生活中,说到类,可以联想到类别,同类,会想到一类人,一类事物等等.而这一类人或事物都是具有相同特征或特点和行为的,我们根据不同的特征或特点和行为将他们归类或分类.同时,当我们认识一个新 ...
- Java学习——类与对象
在学习面向对象之前首先我们要理解一下几点: 什么是面向对象 对象的概念 类 类与对象的关系/区别 什么是对象的属性 什么是对象的方法 什么是面向对象.对象.类 讲到面向对象就不得提到面向过程,早期的计 ...
- Java面向对象类与对象整理
第一章 面向对象: 1.1 什么是面向过程: 遇到某件事的时候,思考 “我该怎么做”然后一步一步实现的过程 1.2 什么是面向对象: 遇到某件事的时 ...
- java笔记 -- 类与对象
封装: 从形式上看, 封装是将数据和行为组合在一个包中, 并对对象的使用者隐藏了数据的实现方式. 对象中的数据称为实例域, 操纵数据的过程称为方法. 对于每个特定的类实例(对象)都有一组特定的实例域值 ...
随机推荐
- webpack4 打包 library 遇到的坑
output: { publicPath: '/', path: path.join(__dirname, 'lib'), filename: 'chart.js', library: 'tchart ...
- Linux设备驱动程序 之 并发及其管理
竞态产生 Linux系统找那个存在大量的并发联系,因此会导致可能的竞态: 1. 正在运行的用户空间进程可以以多种组合方式访问我们的代码: 2. SMP系统甚至可以再不同的处理器上同时执行我们的代码: ...
- python中的break continue之用法
Break break跳出循环,并且终止最小封闭循环. Continue continue跳过本次循环,继续执行下一次的循环. 二者区别就是break会终止循环,continue不终止循环.
- 线上应用接入sentinel的第一个流控规则
sentinel接入第1个应用A以及控制台,已经上线一段时间了,本周接入了第2个应用B: 因为测试同学只有几个,没有压测团队.测试平台.. 各接口能承载的最大qps不确定 ,接入的应用暂时都没有配置规 ...
- DataFactory连接MySQL数据库
1.下载驱动 https://dev.mysql.com/downloads/connector/odbc/ 需要使用oracle登录账号密码后才能下载 下载完成后进行安装,一路下一步即可 2.连接m ...
- centos7最小安装怎么安装防火墙
CentOS 7.0默认使用的是firewall作为防火墙,需要事先关闭. 关闭firewall: 1 2 3 systemctl stop firewalld.service systemctl d ...
- WebServer_简单例子
#-*-coding:utf-8-*- importwebimportjson urls=("/.*","index")app=web.application( ...
- 20180817周在ubuntu上面使用kettle一些总结
1 ubuntu上面安装mysql用户名和密码问题: ubuntu上面安装MySQL的时候,如果是自动安装,没设置密码的话,那么用户名不是root. 比如在ubuntu用文本工具打开:gedit /e ...
- c++后台开发面试常见知识点总结(二)网络编程
(1)TCP和UDP有什么区别? TCP是传输控制协议,提供的是面向连接的,可靠地字节流服务.使用三次握手建立连接,四次挥手释放连接.UDP是用户数据报协议,传输的是UDP数据报,是无连接的,而且没有 ...
- innodb 隔离等级
前一段时间参加了一个国内知名公司的面试,被问及对数据库的了解,自感还不错,可谁知在隔离等级这种基本概念的点翻个船,也不是因为完全不懂,而是本来这里就比较晦涩,加之具体上次看这里的东西时候已经过了一年多 ...