JavaSE——面向对象进阶(封装、this、static、代码块、包、权限修饰符、main方法详解)

第2节 面向对象进阶

一、封装与private

概述:

   封装的意义在于保护或者防止代码(数据)被我们无意中破坏。保护成员属性,不让类以外的程序直接访问和修改。

封装原则:

   隐藏对象的属性和实现细节,仅对外公开访问方法,并且控制访问级别。
我们观察如下代码:
class Person {private String name;    //表示姓名private int age;        //表示年龄void tell() {System.out.println("姓名:"+name+",年龄:"+age);}
}public class Demo {public static void main(String args[]) {Person per = new Person();per.name = "张三";per.age = -30;per.tell();}
}以上的操作代码并没有出现语法错误,但是出现了逻辑错误(年龄)。在开发中,为了避免出现逻辑错误,建议对所有属性进行封装,
并为其提供setter和getter方法进行设置和取得操作。修改代码如下:
class Person {private String name;private int age;void tell() {System.out.println("姓名:" + getName() + ",年龄:" + getAge());}public void setName(String str) {name = str;}public void setAge(int a) {if(a>0&&a<150) {age = a;}}public String getName() {return name;}public int getAge() {return age;}
}
public class OODemo10 {public static void main(String args[]) {Person per = new Person();per.setName("张三");per.setAge(-30);per.tell();}
}这样,当输入一个不符合逻辑的年龄时,不会对其赋值,所以保护了成员属性。

二、this关键字

   在Java基础中,this关键字是一个最重要的概念,使用this关键字可以完成以下的操作:
  • 调用类中的属性

  • 调用类中的方法或构造方法

    - 在一个构造方法中,调用另一个构造方法时,调用的代码必须编写在构造方法的第一行。

  • 表示当前对象
package com.kaikeba.objectoriented.advanced;public class thiskeyword {public static void main(String[] args) {Person3 p1 = new Person3("张三", 18);Person3 p2 = new Person3("李四", 18);p1.say();p2.say();Person3 p3 = new Person3();p3.say();}
}/*** this指的是当前对象*/
class Person3 {private String name;private int age;Person3() {//无参构造方法内调用了全参构造方法this("默认姓名", 1);}Person3(String name, int age) {//this表示当前对象this.name = name;this.age = age;}void say() {System.out.println("姓名:" + this.name + ",年龄:" + this.age);}
}

结果如下:

姓名:张三,年龄:18
姓名:李四,年龄:18
姓名:默认姓名,年龄:1

三、static关键字

概述:

static表示“静态”的意思,可以用来修饰成员变量和成员方法 (后续还会学习 静态代码块静态内部类 )。

static的主要作用在于创建独立于具体对象的域变量或者方法。

简单理解:

被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。并且不会因为对象的多次创建而在内存中建立多份数据。

观察如下代码:

package com.kaikeba.objectoriented.advanced;public class statickeyword {public static void main(String[] args) {
//        Emp e1 = new Emp("张三", "北京");
//        Emp e2 = new Emp("李四", "北京");
//        Emp e3 = new Emp("王五", "北京");
//        Emp e4 = new Emp("赵六", "北京");Emp.region = "北京";Emp e1 = new Emp("张三");Emp e2 = new Emp("李四");Emp e3 = new Emp("王五");Emp e4 = new Emp("赵六");e1.say();e2.say();e3.say();e4.say();
//        //假设:公司迁址到 天津
//        e1.setRegion("天津");
//        e2.setRegion("天津");
//        e3.setRegion("天津");
//        e4.setRegion("天津");Emp.region = "天津";e1.say();e2.say();e3.say();e4.say();}
}class Emp {//不带static的可以理解为对象的属性,带static的可以理解为类的属性private String name;static String region; //static修饰的属性存在方法区中Emp(String name, String region) {this.name = name;this.region = region;}Emp(String name) {this.name = name;}Emp(){}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getRegion() {return region;}public void setRegion(String region) {this.region = region;}void say() {System.out.println("员工姓名:"+name+",员工所在地区:"+region);}}

其内存的存储如下所示,static修饰的region属性或方法,被存储在方法区中,类被加载的时候,就已经在方法区中开辟,且只会开辟一次,一般是通过类名来设置或修改,通过对象名也可以,但是它会把所有对象的这个属性都改了。

在这里插入图片描述

在这里插入图片描述

重点:

  1. 静态成员 在类加载时加载并初始化;

  2. 无论一个类存在多少个对象,静态的属性,永远在内存中只有一份(可以理解为所有对象公用);

  3. 在访问时:静态不能访问非静态,非静态可以访问静态 ,因为静态比非静态先创建,如下面的代码所示:

package com.kaikeba.objectoriented.advanced;public class statickeyword3 {public static void main(String[] args) {StaticDemo.say();}
}class StaticDemo {/*** 通过类名来调用,对象名也行,因为创建对象要先加载类* 静态修饰的方法,被调用时,有可能对象还未创建*/static void say() {System.out.println("勇敢牛牛,不怕困难");}/*** 通过对象来调用* 非静态方法可以调用静态方法,反之不行(先后创建顺序)*/void say2() {System.out.println("锄禾日当午");say();}
}

四、4种代码块

  1. 普通代码块 :在执行的流程中 出现的 代码块。

  2. 构造代码块 :在类中的成员代码块,每次对象创建时执行,执行在构造方法之前。

  3. 静态代码块 :在类中使用static修饰的成员代码块,在类加载时执行。每次程序启动到关闭,只会执行一次的代码块。

  4. 同步代码块 :后续多线程技术中学习。

package com.kaikeba.objectoriented.advanced;public class codeblock {public static void main(String[] args) {/*** 普通代码块:编写在顺序执行的代码流程中的代码块*/{System.out.println("==普通代码块执行==");}Person4 p1 = new Person4();Person4 p2 = new Person4();{System.out.println("==普通代码块执行==");}}
}class Person4 {private String name;private int age;/*** 构造代码块:随着对象的每次创建,执行一次,且执行在构造方法之前* 区别于构造方法的是:*     无论用户调用哪一个构造方法来创建对象,构造代码块都必然执行**/{System.out.println("构造代码块执行");}/*** 静态代码块,随着类的加载(第一次使用),静态代码块执行。* 因为类只加载一次,所以静态代码块只执行一次。*/static {System.out.println("\n静态代码块执行\n");}public Person4() {System.out.println("构造方法执行");}public Person4(String name) {System.out.println("构造方法执行");}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;}void say() {System.out.println("姓名:"+name+",年龄:"+age);}
}

结果如下:

==普通代码块执行==静态代码块执行构造代码块执行
构造方法执行
构造代码块执行
构造方法执行
==普通代码块执行==

从上面的代码可以看出一个常考的知识点:

构造方法 与 构造代码块 与 静态代码块的执行顺序:
静态代码块 —> 构造代码块 —> 构造方法

五、包

5.1 包介绍

  1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用;

  2. 包如同文件夹一样,不同的包中类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,也可以避免名字冲突。

  3. 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

5.2 包的使用规则

包中java文件的定义:

在.java文件的首部,必须编写类所属哪个包,格式:`package 包名;`

包的定义:

通常由多个单词组成,所有单词的字母小写,单词与单词之间使用 .  隔开,一般命名为“com.公司名.项目名.模块名...”。

规范由来:

由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个JavaPackage命名的唯一性,在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如:com.java.xxx

在这里插入图片描述

5.3 import关键字

   当需要用到其他包中的类时,可以使用import导入,格式为:`import 包名.类名;`

六、权限修饰符(记住访问范围)

   权限修饰符可以修饰java中所有可以访问的资源,比如类中的属性、方法、构造方法;给资源添加了一个访问权限,有如下四种权限修饰符:

在这里插入图片描述

七、main方法详解

main()方法一直写到了今天:public static void main(String args[])

以上的各个参数的含义如下:

  • public:表示公共的内容,可以被所有操作所调用

  • static:表示方法是静态的,可以由类名称直接调用。java StaticDemo09

  • void:表示没有任何的返回值操作

  • main:系统规定好的方法名称。如果main写错了或没有,会报错:NoSuchMethodError: main

  • String[] args:字符串数组,接收参数的

public class StaticDemo10{  public static void main(String args[]){  for(int i=0;i<args.length;i++){  System.out.println(args[i]) ;  }  }  
};  

所有的参数在执行类的时候以空格进行分割。java StaticDemo10 1 2 3 4 5 6 7

但是,如果现在我要输入的是以下几种参数“hello world”、“hello vince”、“hello mjw”。因为以空格分割,所以以上的三组参数会当做六组参数输入,那么此时如果要想完成有空格的内容输入,则参数需 要使用“"”括起来。java StaticDemo10 "hello world" "hello vince" "hello mjw"

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

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

相关文章

孙正义:互联网流量将转化为智能AI流量,我的时代终于来了

“今后&#xff0c;增加软银集团的股东价值的成长引擎是什么呢&#xff1f;从上面的营业利润的增长来看&#xff0c;SVF&#xff08;软银愿景基金&#xff09;贡献了80%。SVF是SoftBank2.0最重要的经营引擎。首先&#xff0c;大约2年时间&#xff0c;SVF的投资对象已经超过了80…

JavaSE——面向对象高级(继承、final关键字、抽象类与接口、多态、Object类、内部类、包装类、可变参数)

第3节 面向对象高级 一、继承 1.1 概述和使用 继承是java面向对象编程技术的一块基石&#xff0c;因为它允许创建分等级层次的类。继承就是子类继承父类的特征和行为&#xff0c;使得子类对象&#xff08;实例&#xff09;具有父类的实例域和方法&#xff0c;或子类从父类继…

word的公式后加编码后自动变小

如图所示&#xff0c;在公式后面加编码后公式也变小了&#xff1a; 加编码前&#xff1a; 加编码后&#xff1a; 采用样式分隔符&#xff08;Ctrlaltenter&#xff09;即可解决&#xff0c;输完公式后&#xff0c;按enter转行&#xff0c;输入你要的东西&#xff08;编号什么的…

人工智能70年:科幻和现实的交融

文章素材来源&#xff1a;BBC图片来源&#xff1a;网络【导读】人类飞跑着进入人工智能&#xff08;AI&#xff09;时代。粗略估算现在人们日常生活中有20多种寻常的AI&#xff0c;从垃圾邮件过滤器到叫车软件。AI被分为两类&#xff0c;这些执行具体任务的AI属于“弱人工智能”…

vim 插件之commentary

下载地址 http://www.vim.org/scripts/script.php?script_id3695 如果是使用vundle来管理这个插件的话&#xff0c;你可以添加如下配置 tpope/vim-commentary 这个插件可以根据你当前打开的文件类型&#xff0c;来选择相应的注释方式。 使用的命令是 \\位移 比如&#xff0c;…

JavaSE——异常处理(异常简介、try-catch-finally、throws、throw)

第4节 异常处理 异常处理学习的目标&#xff1a; 明确说明是异常&#xff08;重点&#xff09; 能辨识出常见的异常及其含义&#xff08;熟悉&#xff09; 理解异常产生的原理&#xff08;了解&#xff09; 能处理异常&#xff08;重点&#xff09; 能够自定义异常&#x…

专访「算法之父」Michael Saunders:人工智能未来的突破点可能在自动驾驶

来源&#xff1a;雷锋网 AI 科技评论雷锋网 AI 科技评论按&#xff0c;4 月 25 日&#xff0c;在由涂鸦智能联合知名财经媒体《新财富》、人工智能领域知名媒体《全球智能化商业》共同举办的「全球智能化商业峰会」上&#xff0c;斯坦福大学荣誉教授、新西兰皇家学会荣誉成员、…

从指南针到北斗:中国导航系统促进世界互联互通

6月11日&#xff0c;在维也纳联合国国际会议中心&#xff0c;联合国外层空间事务办公室主任迪皮波&#xff08;右&#xff09;参观中国古代计时装置水运仪象台。本报记者 冯雪珺摄来源&#xff1a;人民日报核心阅读中国卫星导航系统管理办公室在维也纳联合国国际会议中心举办“…

JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)

第1节 常用类库&#xff08;上&#xff09; 面向对象更多是思想上的东西&#xff0c;常用类库更多是工具上的东西&#xff0c;熟能生巧&#xff0c;多整理笔记。 一、泛型 1.1 概述 泛型&#xff0c;即“参数化类型”。就是将类型由原来具体类型进行参数化 &#xff0c;类似…

朗兰兹纲领:关于数学大一统的伟大构想

麦克斯韦方程组来源&#xff1a;今日头条我们经常聊到物理学家都在追寻物理学的大一统&#xff0c;物理学的第一次大一统是麦克斯韦的麦克斯韦方程组&#xff0c;将电学与磁学相统一&#xff0c;建立了电磁学理论&#xff0c;后来&#xff0c;爱因斯坦想继续完成麦克斯韦未竟之…

JavaSE——常用类库(下)(Date、DateFormat、Calendar、System类)

第1节 常用类库&#xff08;下&#xff09; 六、java.util.Date Date类表示特定的时刻&#xff0c;精度为毫秒。 在JDK 1.1之前&#xff0c; Date类还有两个附加功能。 它允许将日期解释为年&#xff0c;月&#xff0c;日&#xff0c;小时&#xff0c;分钟和秒值。 它还允许…

世界隐形冠军比拼:德国1307家、美国366家、中国68家

来源&#xff1a;股权投资论坛目录一、隐形冠军的概念二、隐形冠军的四个特征三、隐形冠军为何隐形四、隐形冠军到底有多牛五、如何成为隐形冠军六、中国隐形冠军多吗1隐形冠军的概念“隐形冠军”这个概念是赫尔曼西蒙教授提出的。1986年&#xff0c;他在研究德国出口数据时发现…

JavaSE——常用类库(String类)

第1节 常用类库——String 因为String相对之前的类来说更加常用一些&#xff0c;所以对字符串类进行专门的整理。 1. 概述 String类表示字符串&#xff0c;Java中的所有字符串文字都实现为此类的实例。字符串是不变的&#xff0c;它们的值在创建后无法更改 。因为它的创建是通…

VVDocumenter 使用

函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode下载后&#xff0c;直接运行项目升级Xcode后可能不能再次使用&#xff0c;需要做一些处理从Xcode 5开始&#xff0c;苹果要求加入UUID证书从而保证插件的稳定性。因此Xcode版本更新之后需要在VVDocumen…

大自然创作的分形艺术

来源&#xff1a;http://blog.sciencenet.cn/blog-420554-363521.html数学上的分形 (Fractal) 是指“一个粗糙或零碎的几何形状&#xff0c;可以分成数个部分&#xff0c;且每一部分都&#xff08;至少会大略&#xff09;是整体缩小尺寸的形状”。数学家们已经创作出许多美丽的…

JavaSE——类集(上)(Collection、List、Iterator、forEach)

第2节 集合&#xff08;上&#xff09; 因为已经有数据结构的基础&#xff0c;前面有关数据结构的知识就不单独整理了&#xff0c;直接上Java的集合类的知识。 一、类集&#xff08;集合类&#xff09; 1.1 集合概述 集合&#xff1a; 集合是java中提供的一种容器&#xff…

第二个spring冲刺总结

讨论成员&#xff1a;罗凯旋、罗林杰、吴伟锋、黎文衷 第二阶段总体是做到了四则运算的demo&#xff0c;,包括APP进入动画&#xff0c;以及界面的基本效果设计&#xff0c;还有能进行综合计算&#xff08;选择题&#xff0c;可以 自动生成简单&#xff0c;容易&#xff0c;困难…

图灵奖得主姚期智:求解人工智能的中国答案

来源&#xff1a;清华大学他是“图灵奖”创立以来首位获奖的亚裔学者&#xff0c;也是迄今为止获此殊荣的唯一华裔计算机科学家。2004年从普林斯顿辞去终身教职回到清华任教。2005年&#xff0c;他为清华本科生创立了计算机科学实验班“姚班”。如今&#xff0c;在中国乃至全球…

JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)

第2节 集合&#xff08;下&#xff09; 一、Set接口 java.util.Set 接口和 java.util.List接口一样&#xff0c;同样继承自 Collection接口&#xff0c;它与Collection接口中的方法基本一致&#xff0c;并没有对 Collection接口进行功能上的扩充&#xff0c;只是比Collection…

美国国家科学院发布《材料研究前沿:十年调查》

来源&#xff1a;中国科学院科技战略咨询研究院2月8日&#xff0c;美国国家科学院发布了针对材料研究的第三次十年调查《材料研究前沿&#xff1a;十年调查》报告。这次的调查主要评估了过去十年中材料研究领域的进展和成就&#xff0c;确定了2020-2030年材料研究的机遇、挑战和…