Java的三大特性以及接口
一、对象和封装
众所周知,java是一种面向对象的编程,而C#则是面向过程的编程,在这里我们编写Java的工具是eclipse,下面我们就对于Java做一个大致的介绍。
面向对象设计的过程就是抽象的过程,分为三步:一是发现类;二是发现类的属性;三是发现类的方法。
Java的编写流程是编写、编译、运行;编写的是Java源代码,编译是把Java源文件编译成字节码文件(class文件),运行的是字节码文件,程序正常运行后会在控制台输出运行结果。
1、访问修饰符
在Java中也有四种访问修饰符:
(1)public:本类、子类直接访问,其他类通过对象访问;
(2)protected:本类、子类(同包、不同包)都可以访问;
(3)friendly:默认访问修饰符,本类、同包子类可直接访问;
(4)private:只有本类可以访问。
2、static修饰符
static修饰符可以用来修饰属性、方法、类以及代码块。它属于类,但是也可以通过对象名去访问,不过我们最好还是采用类名去点的方式,因为static是类成员而非成员变量。
注意:static不能修饰方法内部成员,否则会报错。
static修饰的字段称为静态字段,它修饰的方法称为静态方法,同样,当它修饰类时,称为静态类。static不能修饰外部类,只能修饰内部类。
当static修饰一段代码时称为静态块,语法是:
static{
//代码块
}
3、final常量修饰符
(1)当final修饰的是变量时:改变量变成常量,只能初始化一次值,赋值后不能更改值;
(2)当final修饰的是方法时:表示该方法不能被重写;
(3)当final修饰的是类时:表示当前类禁止被继承,它的作用类似于C#的sealed。
4、封装
封装是面向对象的三大特性之一,就是将类的状态信息隐藏在类内部,不允许外部类访问,而通过该类提供的方法来实现对隐藏信息的操作和访问。
当我们对当前类的变量的值需要设置范围时,我们就可以借助封装来实现效果。一般我们会将属性设为private的权限,然后再加上get、set方法,例如:
private int age; //年龄
//提取年龄
public int getAge(){
return age;
}
//指定年龄,不能小于16
封装的好处:隐藏类的实现细节;让使用者只能通过程序规定的方法来访问数据;可以方便的加入存储控制语句,限制不合理操作。
二、继承
所谓继承就是子承父,它描述的是两个类之间的关系。将具有相同行为的类的代码提取为一个公共类,称为父类。父类就是被继承的类也称为基类,子类就是继承的类也称为派生类。
子类能拥有父类的所有的非private成员,默认情况下,子类会调用父类的无参构造函数,调用顺序是先父类后子类。
1、关键字
(1)java继承的语法
Java继承的语法和C#的有所不同,如下:
//C#继承的语法
public class 子类:父类{}
//Java继承的语法
public class 子类 extends 父类{}
(2)this关键字
我们知道在C#中this关键字可以调用父类的非private成员,但是在Java中this关键字只能调用当前类的对象。
(3)super关键字
在C#中显示调用父类的构造函数或者成员,都可以用base关键字,但是Java里却不是用base实现这个效果了。在Java中我们通过super来调用当前类的父类成员,如下:
super(参数); //调用父类构造方法
super.getName(); //调用父类方法,其中getName()为父类的非private方法
super.name; //直接调用父类的name属性,前提是name是非private成员
注意:super必须写在方法的大括号内,且在调用构造方法时只能是位于第一行。
2、继承的特性
1、单根性:只能有一个父类;
2、传递性:孙类有父类的行为;
3、默认父类是Object类;
4、将Java的一个类禁止被继承用final关键字,相当于C#的sealed关键字。
3、继承的优缺点
(1)优点:提高代码的重用性;子类可以扩展自己的功能。
(2)缺点:继承是一种侵入式的编程,它约束了子类的行为。
三、多态
多态是三大特性之一,简单来说,它就是表示一种事物的多种形态的意思,不同的形态有不同的概念和结果。
多态的主要实现方式是重写和重载,重载的特点是:
(1)在同一个类中;
(2)有相同的方法名;
(3)对应的下标的类型不一样。
重写的前提是两个类一定有继承关系,重写的特点是:
(1)在不同的类中,方法名相同,参数相同;
(2)访问修饰符:父类 <= 子类,子类不能缩小;
(3)返回值:父类 >= 子类;
(4)抛出异常:父类 >= 子类。
实现重写有两种方法,一是直接重写,父类方法不用像C#一样加virtual,子类方法也不用在void前面加override,但是我们可以在方法前面写一个注解“@Override”表明这是重写父类的方法,注解也是可写可不写;二是抽象方法,抽象方法必须位于抽象类中,这是毋庸置疑的,在Java中定义父类的抽象方法和C#是一样的,只是在子类重写时void前面不用加override,写注解即可。
1、抽象类
抽象类的特点:
(1)不能实例化;
(2)可包含实例方法和抽象方法。
2、抽象方法
抽象方法的特点:
(1)必须位于抽象类中;
(2)子类必须重写父类方法,除非子类也是抽象类;
(3)没有方法体。
3、转型
子类和父类的相互转型分为了向上转型和向下转型,在C#中用is判断数据类型,用as进行强转,在Java中用instanceof判断一个对象是否属于一个类或者实现了一个接口,它的运行结果为Boolean类型值。再强制类型转换之前通过instanceof运算符检查对象的真实类型,再进行相应的强制类型转换,这样就可以避免类型转换异常,从而提高代码的健壮性。
//向上转型:子类到父类(子类对象赋给父类)
Father fa = new Son();
//向下转型,父类到子类
Son son = (Son)fa;
//instanceof运算符的语法
对象 instanceof 类或接口
例如示例Pet类是父类宠物类,Dog类是子类狗类,Penguin类也是子类企鹅类:
public class TestPolys {
public static void main(String[] args) {
Pet pet = new Dog("欧欧", "雪纳瑞");
//Pet pet = new Penguin("楠楠", "Q妹");
pet.eat();
if(pet instanceof Dog)
{
Dog dog = (Dog)pet; //强制类型转换
dog.catchingFlyDisc(); //调用狗狗玩飞盘的方法
}else if(pet instanceof Penguin) {
Penguin pgn = (Penguin)pet; //强制类型转换
pgn.swimming(); //调用企鹅游泳的方法
}
}
}
运行结果为:
我们把Dog类的对象注释掉,取消Penguin类创建对象的注释,再次运行结果是:
Java中,类和对象的三种关系:
(1)is a:继承关系;
(2)has a:包含关系;
(3)like a:像(接口)。
四、接口
接口是一种规范和标准,它可以表示一种能力或者一种约定,它们可以约束类的行为,是一些方法的特征的集合。接口其实也可以说是一种特殊的“抽象类”,但是采用抽象类完全不同的语法来表示。抽象类易于代码复用,接口弥补了Java只支持单继承的缺点,还利于代码的扩展和维护。
一个类绝对只能有一个父类,但是可以被约束具有多种行为,接口的语法如下:
//接口的定义的语法,继承父接口可写可不写
访问修饰符 interface 接口名 extends 父接口1,父接口2……{}
//类实现接口的语法,继承类可写可不写,但是继承父类必须写在实现接口的前面
访问修饰符 class 类名 extends 父类名 implements 接口1,接口2……{}
1、接口的特点
(1)不能被实例化;
(2)成员方法只能是抽象方法,自动用 public abstract 修饰;
(3)不能有构造方法;
(4)成员变量只能是静态常量,自动用 public static final修饰。
接口的作用:约束子类必须拥有某种行为。
2、接口和抽象类的区别:
1、相同点:
(1)都不能被实例化;
(2)约束子类必须实现抽象方法,除非子类也是抽象类;
2、不同点:
(1)接口只能有抽象方法,抽象类可以有非抽象方法;
(2)抽象类的关键字是:abstract,接口的关键字是:interface;
(3)接口不能有构造方法,抽象类可以有;
(4)接口的成员变量必须是静态常量,而抽象类可以有非static的变量。
3、C#实现接口
1、在C#实现接口和Java的流程一致;
2、在C#实现接口的语法是:
访问修饰符 class 子类:父类,接口 //父类要放在接口前面
3、属性默认是public static const修饰,但是不能显示定义;
4、方法默认是public abstract修饰,也不能显示定义。
在C#中定义接口要注意:显示指定任何修饰符都是非法的,接口的名称一般以大写字母“I”开头。
好了,今天的分享就到这里啦,我们下期再见!