《Java从入门到放弃》JavaSE入门篇:面向对象语法二(入门版)

想了半天,发现单独的封装和多态没什么好讲的,我们就简单说说Java里面对应的语法吧。

相关内容如下:

一、访问修饰符

二、getter/setter方法

三、构造方法

四、super和this

五、static关键字

六、final关键字

七、方法重写

八、抽象类和接口

 


一、访问修饰符

    Java当中有四种情况,按其访问范围的顺序由小到大分别是:

    priate(私有)---->default(默认)---->protected(受保护)---->public(公共)

    访问范围可以看下图:

wKiom1myNxuQPLdKAAE5Kz-gujY567.png


二、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(),必须写在第一行。

wKioL1myShXA9_RQAAQrgMywefs597.png


五、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();          //调用挖矿方法
}

结果:

wKioL1myTI_DVQinAAAa_9fMuE8175.png

通过结果可以发现,虽然定义的是父类变量,但new的是子类对象,所以调用的是子类的方法。如果是new的父类对象,那么调用结果就是父类的方法。


八、抽象类和接口

    抽象类(abstract):就是个抽象的类......,它最大的特征就是不能直接实例化,必须先有个子类(非抽象类),然后可以new子类对象。把刚才的矿工改成抽象类:

1
2
3
4
5
public  abstract  class  Miner {
     public  void  mining(){
         System.out.println( "用铁锹一锹一锹的挖矿!" );
     }
}

    如果现在创建一个矿工对象,会报语法错误:

wKioL1myTbWBZinUAAAdpAIIIRw707.png

    但创建子类(子类不能是抽象类)对象是可以的:

wKioL1myTe7RKYbOAAAgDMg4m5I785.png

为什么要使用抽象类呢?因为有些类就是抽象的啊!!!j_0025.gif

比如动物,请问,动物是什么颜色?有几条腿?怎么移动的?有几只翅膀?

是不是都不知道!!!

不知道就对了,因为动物就是个抽象的概念,像什么猫、狗、人、日本人等等都是动物的一个子类。你能在现实生活中找出一个原生态的动物,它既不是猫也不是狗更不是任何其他动物的子类吗?

如果能的话··········,请收下我的膝盖!!!j_0004.gif

    接口(interface):接口是什么呢?拿出你的U盘看看,再插到电脑的USB接口试试,如果你的鼠标是USB接口的,请看看鼠标的接口和U盘的接口有没有什么不一样?

    聪明的各位应该已经发现了吧,这两个的接口是一模一样的!!!j_0036.gif

    接口一般只是定义一个标准,它没有具体的功能(看看你的电脑上的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博客园,感兴趣的小伙伴可以去看相关的其它博文。  

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 、 1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READmE.文件(md如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值