想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说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("林志玲"431.7399);  //女神对象

四、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("林志玲"431.7399);  //女神对象
    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入门篇:面向对象语法二(入门版)的更多相关文章

  1. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  2. php从入门到放弃系列-02.php基础语法

    php从入门到放弃系列-02.php基础语法 一.学习语法,从hello world开始 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器&qu ...

  3. [Python 从入门到放弃] 6. 文件与异常(二)

    本章所用test.txt文件可以在( [Python 从入门到放弃] 6. 文件与异常(一))找到并自行创建 现在有个需求,对test.txt中的文本内容进行修改: (1)将期间的‘:’改为‘ sai ...

  4. Java性能测试从入门到放弃-详解篇

    Jmeter组件分类说明 Jmeter的组件可以放在任意位置 线程池:用于创建线程.每个线程会"批次顺序"执行任务,因此后面的任务可根据前面的任务决定具体的操作.          ...

  5. 函数响应式编程(FRP)从入门到”放弃”——基础概念篇

    前言 研究ReactiveCocoa一段时间了,是时候总结一下学到的一些知识了. 一.函数响应式编程 说道函数响应式编程,就不得不提到函数式编程,它们俩到底有什么关系呢?今天我们就详细的解析一下他们的 ...

  6. python从入门到放弃之线程篇

    一,什么是多线程? 1.多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分 ...

  7. MYSQL从入门到放弃系列:mysql基础语法

    Mysql基本语法 启动MySQL net start mysql 连接与断开服务器 mysql -h 地址 -P 端口 -u 用户名 -p 密码 跳过权限验证登录MySQL mysqld --ski ...

  8. NodeJs 入门到放弃 — 常用模块及网络爬虫(二)

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14473101.html 目录 码文不易啊,转载请带上本文链接呀,感谢感谢 https ...

  9. php从入门到放弃系列-01.php环境的搭建

    php从入门到放弃系列-01.php环境的搭建 一.为什么要学习php 1.php语言适用于中小型网站的快速开发: 2.并且有非常成熟的开源框架,例如yii,thinkphp等: 3.几乎全部的CMS ...

随机推荐

  1. Java第四次上课博文动手动脑

    Java第四次上课博文动手动脑 1.    查看String.equals()方法 public class StringEquals { /** * @param args the command ...

  2. year:2017 month:7 day:19

    2017-07-19 JavaScript 一:javascirpt的对象 1:数组对象 声明方式:(1)var arr=new Array(): (2)var arr=new Array(12): ...

  3. 简单探讨python中的语句和语法

    python程序结构 python"一切皆对象",这是接触python听到最多的总结了.在python中最基层的单位应该就是对象了,对象需要靠表达式建立处理,而表达式往往存在于语句 ...

  4. akoj-1280另类阶乘问题

    另类阶乘问题 Time Limit:3000MS  Memory Limit:65536K Total Submit:22 Accepted:20 Description 大家都知道阶乘这个概念,举个 ...

  5. java ArrayList 踩坑记录

    做编程的一个常识:不要在循环过程中删除元素本身(至少是我个人的原则).否则将发生不可预料的问题. 而最近,看到一个以前的同学写的一段代码就是在循环过程中删除元素,我很是纳闷啊.然后后来决定给他改掉.然 ...

  6. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  7. Core 2.0 的dll实时更新、https、依赖包变更问题及解决

    今天所有开发环境已经迁移到mac OS下的Visual Studio Code + 命令行编译发布,而运行服务器是CentOS7,和windows没什么关联了. 只要你Relese编译并在本地有一个与 ...

  8. python 集合 set

    集合 set:可变集合与不可变集合 可变集合:可以向集合中添加删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素. 把不同的元素组成一起形成集合,集合不记录元素的位置或者插入点,也就是不能 ...

  9. python 中self理解

    python类的方法和普通函数的区别--python中类的方法必须有一个额外的参数:self 假如创建一个新的类Myclass,类中有一个方法method(arg1,arg2),b实例化Myclass ...

  10. HTML5 新点总结-持续

    H5新的表单元素:datalist datalist的表现形式和原先的select标签相似,但是datalist想要发挥作用需要input标签的帮助:这样就可以在input标签中显示类似select下 ...