《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)
想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说Java里面对应的语法吧。
相关内容如下:
一、访问修饰符
二、getter/setter方法
三、构造方法
四、super和this
五、static关键字
六、final关键字
七、方法重写
八、抽象类和接口
一、访问修饰符
Java当中有四种情况,按其访问范围的顺序由小到大分别是:
priate(私有)---->default(默认)---->protected(受保护)---->public(公共)
访问范围可以看下图:
二、getter/setter方法
这个属于封装,前面例子中的女神的年龄,一般年龄肯定不能小于0吧,如果小于0了就给个默认值18,所以我们通过使用get/set方法来封装这个属性,就可以对属性的取值进行限定了。
1
2
3
4
5
6
7
8
9
10
11
12
|
private int age; //年龄,定义为私有 public int getAge() { return age; } public void setAge( int age) { if (age<= 0 ){ this .age = 18 ; } else { this .age = age; } } |
三、构造方法
构造方法一般用于在初始化对象时就给对象的属性赋值,前面我们创建一个女神对象是这样写的代码:
1
2
3
4
5
6
|
//创建三个女神类型的对象 Goddess lin = new Goddess(); //女神对象 lin.name = "林志玲" ; lin.age = 43 ; lin.stature = 1.73 ; lin.faceValue = 99 ; //颜值 |
如果使用构造方法,需在要对应的内中写一个没有返回值类型的方法,并且方法名与类名相同,同时,为了保证还能创建空白对象,我们还要编写一个无参的构造方法,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Goddess extends Woman { public int faceValue; //颜值 public int getFaceValue() { return faceValue; } public void setFaceValue( int faceValue) { this .faceValue = faceValue; } public Goddess() {} //为了保证以后还能初始化空白的对象,保留无参的构造方法 public Goddess(String name, int age, double stature, int faceValue){ this .setName(name); this .setAge(age); this .setStature(stature); this .setFaceValue(faceValue); } } |
创建对象的代码就简单很多了:
1
|
Goddess lin = new Goddess( "林志玲" , 43 , 1.73 , 99 ); //女神对象 |
四、super和this
观察仔细的人应该发现,上面的代码中出现了“this”关键字,这个表示“当前对象”,另外一个“super”表示父类对象。
上面的代码可以做如下修改,如果父类也有构造方法,子类可以使用“super”来调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//父类中的构造方法代码 public class Woman(){ public Woman(String name, int age, double stature){ this .setName(name); this .setAge(age); this .setStature(stature); } } //子类中的构造方法代码 public class Goddess extends Woman { public Goddess(String name, int age, double stature, int faceValue){ super (name, age, stature); this .setFaceValue(faceValue); } } |
注意:调用父类的构造方法super(),必须写在第一行。
五、static关键字
被static修饰的东西,我们称之为静态的。比较常用的有静态变量,静态方法,静态代码块。
5.1 静态变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//在女神类中添加一个静态变量 public static int count = 0 ; //女神总数 //测试代码 public static void main(String[] args) { //创建三个女神类型的对象 Goddess lin = new Goddess( "林志玲" , 43 , 1.73 , 99 ); //女神对象 lin.count++; Goddess wang = new Goddess(); //女神对象 wang.count++; wang.setName( "王祖贤" ); Goddess li = new Goddess(); //女神对象 li.setName( "李冰冰" ); li.count++; System.out.println(lin.count); //结果为3 } |
最终的打印结果为3,也就是说count是整个女神群体所共用的一个属性。改变了A的count属性的值为250,那么B和C的count属性值也变成了250。
5.2静态方法
静态方法和静态变量的用法类似,也是整个群体共用的方法,就定义成静态的,静态方法还有个好处,可以直接通过类名来访问,而不用创建对象。
1
2
3
4
5
6
7
8
|
//女神类中添加静态方法 public static void haha(){ System.out.println( "我是女神!" ); } //测试代码 public static void main(String[] args) { Goddess.haha(); //通过类名调用方法 } |
5.3静态代码块
这个东西就比较好玩的,它只会在JVM加载类时执行一次。
1
2
3
|
static { System.out.println( "我是静态代码块!" ); } |
Java代码的执行顺序:
静态变量初始化→静态代码块→初始化静态方法→初始化实例变量→代码块→构造方法
六、final关键字
可以用来修饰属性、方法和类。
放在属性前,表示这个属性是个常量,必须在定义的时候赋值,并且以后不能修改其值。
放在方法前,表示这个方法不能被子类重写(下一点会讲到方法重写)。
放在类前,表示这个类不允许被继承。
代码我就不演示了,这个比较简单,小伙们自行试试就OK了。
七、方法重写
方法重写的目标,子类要改写父类某个方法的实现。说直白点就是老子是矿工,有挖矿的方法,用铁锹来挖矿,儿子是挖矿师,继承了矿工的方法,只不过他是用挖掘机来挖矿。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//矿工类(父类) public class Miner { public void mining(){ System.out.println( "用铁锹一锹一锹的挖矿!" ); } } //挖矿员(子类) public class DigMember extends Miner { //重写了父类的挖矿方法 public void mining(){ System.out.println( "用挖掘机挖矿!" ); } } //测试代码 public static void main(String[] args) { Miner miner = new DigMember(); //创建矿工的子类对象挖矿员 miner.mining(); //调用挖矿方法 } |
结果:
通过结果可以发现,虽然定义的是父类变量,但new的是子类对象,所以调用的是子类的方法。如果是new的父类对象,那么调用结果就是父类的方法。
八、抽象类和接口
抽象类(abstract):就是个抽象的类......,它最大的特征就是不能直接实例化,必须先有个子类(非抽象类),然后可以new子类对象。把刚才的矿工改成抽象类:
1
2
3
4
5
|
public abstract class Miner { public void mining(){ System.out.println( "用铁锹一锹一锹的挖矿!" ); } } |
如果现在创建一个矿工对象,会报语法错误:
但创建子类(子类不能是抽象类)对象是可以的:
为什么要使用抽象类呢?因为有些类就是抽象的啊!!!
比如动物,请问,动物是什么颜色?有几条腿?怎么移动的?有几只翅膀?
是不是都不知道!!!
不知道就对了,因为动物就是个抽象的概念,像什么猫、狗、人、日本人等等都是动物的一个子类。你能在现实生活中找出一个原生态的动物,它既不是猫也不是狗更不是任何其他动物的子类吗?
如果能的话··········,请收下我的膝盖!!!
接口(interface):接口是什么呢?拿出你的U盘看看,再插到电脑的USB接口试试,如果你的鼠标是USB接口的,请看看鼠标的接口和U盘的接口有没有什么不一样?
聪明的各位应该已经发现了吧,这两个的接口是一模一样的!!!
接口一般只是定义一个标准,它没有具体的功能(看看你的电脑上的USB接口,请告诉我它是干什么的?可以加热食物么?可以冷藏饮料么?可以看电影么?都不行!)。
但我们可以实现这个标准接口的工具,比如实现了该接口的U盘,就可以通过这个接口来保存数据,实现了该接口的键盘,就可以通过这个接口往电脑里输入数据。
如果上面例子中的挖矿员会开车,而矿工不会,并且以后还会有另外一个单独的司机类也可以开车,那么,我们就可以把开车定义成一个接口。需要会开车的类,去实现这个接口就行了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//定义开车的接口 //开车接口 public interface IDrive { //开车方法 void drive(); } //挖矿员类实现开车接口 public class DigMember extends Miner implements IDrive { public void mining(){ System.out.println( "用挖掘机挖矿!" ); } public void drive() { // TODO Auto-generated method stub System.out.println( "我会开挖掘机!!!" ); } } |
最后:抽象类和接口有什么区别呢?
抽象类侧重于一个群体,而接口侧重于功能。
大家实现下面这个案例就知道区别了:
创建一个集合(或数组)保存所有参加动物赛跑比赛的选手(有兔子、乌龟、小鸡、狮子),再创建一个集合(或数组)保存所有参加飞行比赛的选手(飞机,老鹰,超人,擎天柱)。注意这些选手都会飞,但不一定有同一个父类。
今天的内容就到这儿吧,都只讲了些基础语法,有很多使用上的细节,大家可以拿些项目中的例子,我们一起来分析哈!
“软件思维”博客地址:51CTO,博客园,感兴趣的小伙伴可以去看相关的其它博文。
《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)的更多相关文章
- dotnet 从入门到放弃的 500 篇文章合集
本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...
- php从入门到放弃系列-02.php基础语法
php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...
- [Python 从入门到放弃] 6. 文件与异常(二)
本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...
- Java性能测试从入门到放弃-详解篇
Jmeter组件分类说明 Jmeter的组件可以放在任意位置 线程池:用于创建线程.每个线程会"批次顺序"执行任务,因此后面的任务可根据前面的任务决定具体的操作. ...
- 函数响应式编程(FRP)从入门到”放弃”——基础概念篇
前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...
- python从入门到放弃之线程篇
一,什么是多线程? 1.多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分 ...
- MYSQL从入门到放弃系列:mysql基础语法
Mysql基本语法 启动MySQL net start mysql 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码 跳过权限验证登录MySQL mysqld --ski ...
- NodeJs 入门到放弃 — 常用模块及网络爬虫(二)
码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14473101.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...
- php从入门到放弃系列-01.php环境的搭建
php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...
随机推荐
- python中数字类型与处理工具
python中的数字类型工具 python中为更高级的工作提供很多高级数字编程支持和对象,其中数字类型的完整工具包括: 1.整数与浮点型, 2.复数, 3.固定精度十进制数, 4.有理分数, 5.集合 ...
- Java 9 揭秘全目录汇总
Tips 做一个终身学习的人. 当写这篇文章时,关于Java 9的学习就先告一段落了. 首先介绍一下背景,大概两个月前,我突然有兴趣想看看Java 9,当时读了一本英文原著<Java 9 Rev ...
- HDU--1195--bfs--Open the Lock
/* Name: HDU--1195--Open the Lock Author: shen_渊 Date: 17/04/17 08:54 Description: bfs,用四维数组标记状态,每位数 ...
- Head First 设计模式 第1章 策略模式
本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义. 1.定义及优点 什么是策略模式呢? 答:定义算法族(对象),分别封装起来,让他们之间可以相 ...
- kafka在windows下的安装和配置
博主最近在学习有关kafka的配置安装以及在spring的集成使用.但网上关于kafka的配置参考资料基本都是于linux下的配置,于是博主在整理了相关windows下kafka的配置记录在博客里.由 ...
- Java中的char究竟能存中文吗?
今天面试被问到"Java中的char能存中文吗?",我回答有的字能有的字不能,结果被嘲笑了,不过我也忘了字符编码的相关知识所以也没能解释.晚上查了下资料,记录一下. 网上搜索这个问 ...
- React Native 系列(八) -- 导航
前言 本系列是基于React Native版本号0.44.3写的.我们都知道,一个App不可能只有一个不变的界面,而是通过多个界面间的跳转来呈现不同的内容.那么这篇文章将介绍RN中的导航. 导航 什么 ...
- instanceof问题
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法:resu ...
- php创建多级目录完整封装类操作
创建多级目录函数中调用创建指定下的指定文件的函数: public function create_dir($dir,$mode=0777) { return is_dir($dir) or ($thi ...
- 简单选择排序 Selection Sort 和树形选择排序 Tree Selection Sort
选择排序 Selection Sort 选择排序的基本思想是:每一趟在剩余未排序的若干记录中选取关键字最小的(也可以是最大的,本文中均考虑排升序)记录作为有序序列中下一个记录. 如第i趟选择排序就是在 ...