Java中关于final、抽象、接口

Java中关于final、抽象、接口,第1张

final
final:【英文表示最终的最后的】
    1.被final修饰的变量不可以被改变,也被称为常量
    【包括成员变量和局部变量】
    2.被final修饰的方法不可以被重写
    3.被final修饰的类不可以被继承

[总的来说final就是不可变]
1.被final修饰的变量不可以被改变,也被称为常量

创建一个Diamods class

public class Diamods {
//public class Diamods {
    final int weight = 10;//该钻石为10克拉的。

    public static void main(String[] args) {
        Diamods d=new Diamods();
        d.weight=15;//运行后报错:无法为最终变量weight分配值
    }
}

上面是成员变量无法改变,下面的局部变量也是如此

public class Diamods {
//public class Diamods {
    final int weight = 10;//该钻石为10克拉的。

    public static void main(String[] args) {
        //Diamods d=new Diamods();
        //d.weight=15;//运行后报错:无法为最终变量weight分配值

        final int a =10;
        a=20;//运行后报错:无法为最终变量a分配值
    }
}
 2.被final修饰的方法不可以被重写

 在Diamods中写入方法

这个样子是可以重写的一旦加上final就不可以了
 public void bling(){
         System.out.println("钻石是闪闪亮的");
     }

 创建子类PinkDiamods

public class PinkDiamods extends Diamods {
   
    public void bling() {
        //前面没有加final时这个方法就可以写。
        //前面的bling加上final后就会报错
        System.out.println("粉色的钻石也是闪闪亮的");
    }
}

此时在方法前面加上final

final public void bling(){
        System.out.println("钻石是闪闪亮的");
    }

 这个时候bling就会报错

3.被final修饰的类不可以被继承

【在Diamods class前面加上final】

此时的PinkDiamods就会报错

现在前面的内没有加final就可以继承

加上final后就不可以继承了,final修饰的类就是最终的类

抽象
抽象:现实中不存在的东西
在Java中就表示:只声明,不实现

强制规定:在一个类中如果方法是抽象方法那么类也必须是抽象类
    抽象类的特点:
            1.抽象类不可以创建对象
            2.抽象类的子类必须重写父类中的抽象方法。否则,子类必须也是抽象类。

通过抽象类可以强制的要求子类中必须有那些方法【相当于规范作用】

抽象类中可以有正常的方法

创建一个Animal class

//由于强制规定所以也需要在类中加入abstract【类中有抽象方法那么类也必须是抽象类】
public abstract class Animal {

    //现在在方法中加上abstract 就表示抽象方法。
    //【注:抽象方法没有方法体此处直接在方法后加上分号就可以】
    public abstract void eat();
    //因为动物有很多而且进食方式、吃的东西的类型都不一样,所以不能进行定义。即使定义也只能笼统的定义

 抽象类的特点:

         1.抽象类不可以创建对象  

         2.抽象类的子类必须重写父类中的抽象方法。否则,子类必须也是抽象类。

创建class Cat 

public class Cat extends Animal{
    //继承过来了之后就相当于也是抽象类
    //此时就需要重写父类中的抽象方法。

    //public void eat();

    public void eat(){
        System.out.println("猫咪吃小鱼");
    }
}
 通过抽象类可以强制的要求子类中必须有那些方法

【相当于规范作用】

再写一个run方法

//现在加上方法run();,如果在Cat子类中不加,就会报错
    public abstract void run();

所以现在Cat中就也需要加上run方法

public void run(){
        System.out.println("比起跑猫咪的d跳力更好");
    }

写一个场景

//创建场景

public class Client {
    public static void main(String[] args) {
//        Cat cat=new Cat();
        //抽象类也有多态性
        Animal cat = new Cat();
        cat.eat();
        cat.run();

        //抽象类不可以创建对象
        //Animal ani=new Animal();//会报错,Animal()是抽象的不能被实例化
    }
}
 抽象类中可以有正常的方法
//抽象类中可以有正常的方法,不一定全是抽象方法
    public void semll(){
        System.out.println("笑一笑,十年少");
    }

 

接口
接口:
接口实际上是一种特殊的抽象类
接口中所有的方法都是抽象方法
接口使用interface来声明

注:能继承接口的只能是接口
【接口和类只能是实现关系(implement)】
实现关系和继承关系差不多
只是接口是:implements
继承是:extends

注意:类只能单继承【一个类只能继承一个父类】,接口支持多实现。

接口同样具有多态性

接口可以把很多不相关的内容进行整合

特点:
    1.接口中所有的方法都是抽象方法,都是公开的
    2.接口中所有的变量都是全局静态常量

创建一个class Valuable

接口使用interface来声明,这里就表示已经不是类了

public interface Valuable {//接口使用interface来声明,这里就表示已经不是类了

    //一定注意接口中所有的方法都是抽象方法,一定不可以有正常的方法
    public abstract void getMoney();
    //前面灰色:可以省略
    //abstract【因为接口中的所有方法都是抽象方法,所以都是一样的就可以省略】
    // public【接口中所有内容都是公开的公共的】
}

能继承接口的只能是接口 

 创建Gold

【类只能实现接口不能继承接口,所以下面写extends会报错】

实现关系和继承关系差不多
只是接口是:implements
继承是:extends
public class Gold implements Valuable {

    //必须要实现抽象方法(相当于继承中的重写)
    public void getMoney(){
        System.out.println("黄金很值钱,你可以用黄金去换钱");
    }
}

创建Test类去实现

public class Test {
    public static void main(String[] args) {
        //Gold g= new Gold();
        //因为接口和类只有[接口是:implements继承是:extends]不同,所以这里的金子也可以从Valuable的角度去看
        //接口也具有多态性
        Valuable g= new Gold();
        g.getMoney();
}

类只能单继承【一个类只能继承一个父类】,接口支持多实现。

创建接口Protectable并写出方法cang

public interface Protectable {
    public void cang();
}

创建class Animal并写出方法吃

public class Animal {
    public void eat(){
        System.out.println("动物会吃东西");
    }
}

创建class Panda

//类可以继承一个类,实现多接口【接口方法重写】
public class Pander extends Animal implements Valuable,Protectable{

    //下面的使用【右键-->Generate-->Override Methods-->选中需要的即可】
    @Override//@Override表示这个方法是重写的
    public void eat() {
        System.out.println("熊猫喜欢吃竹子");
    }

    @Override
    public void cang() {
        System.out.println("熊猫喜欢藏在竹林中");
    }

    @Override
    public void getMoney() {
        System.out.println("熊猫是中国国宝,超级值钱");
    }
}

测试一下:

public class Test {
    public static void main(String[] args) {

        Pander pander=new Pander();
        Animal animal=new Pander();//向上转型
        Valuable valuable=new Pander();//向上转型
        Protectable protectable=new Pander();//向上转型

        //站在Pander看
//        pander.eat();
//        pander.cang();
//        pander.getMoney();

        //站在Animal看
        //这里会发现,Animal中没有
        animal.eat();
        //站在动物的角度就只有吃,所以cang和getMoney没有
//        animal.cang();
//        animal.getMoney();

        //站在Valuable只有getMoney
        valuable.getMoney();
        //站在Protectable只有cang
        protectable.cang();
}
接口中所有的变量都是全局静态常量
public interface Valuable {//接口使用interface来声明,这里就表示已经不是类了

    public static final int money=100;//【前面public static final默认存在】
}

 测试

public class Test {
    public static void main(String[] args) {

//        Valuable.money=10; //全局静态常量不可变
//        但是可以打印出来
        System.out.println(Valuable.money);//出来的值就是前面所赋的值
    }
}

 有关接口的小练习 

创建IDAO

public interface IDAO {

    void connect();//连接
    void add();//增
    void del();//删
    void upd();//改
    void sel();//查
}

 创建MysqlDao

public class MysqlDao extends AbstractDao{

    @Override
    public void connect() {
        System.out.println("MySQL的连接");
    }

    @Override
    public void add() {
        System.out.println("MySQL的增加");
    }

    @Override
    public void del() {
        System.out.println("MySQL的删除");
    }

    @Override
    public void upd() {
        System.out.println("MySQL的修 改");
    }

    @Override
    public void sel() {
        System.out.println("MySQL的查找");
    }
}

创建OraclDao

public class OraclDao extends AbstractDao{
    @Override
    public void connect() {
        System.out.println("Oracle的连接");
    }

    @Override
    public void add() {
        System.out.println("Oracle的增加");
    }

    @Override
    public void del() {
        System.out.println("Oracle的删除");
    }

    @Override
    public void upd() {
        System.out.println("Oracle的修改");
    }

    @Override
    public void sel() {
        System.out.println("Oracle的查找");
    }
}

 由于MysqlDao和OraclDao中重复的太多了

所以现在创建AbstractDao

不需要在里面写connect是因为连接的不一样

//这里需要是抽象的:不想全部实现[连接MySQL或者是Oracle是不确定的。]

public abstract class AbstractDao implements IDAO{

    //void connect();

    @Override
    public void add() {
        System.out.println("增加");
    }

    @Override
    public void del() {
        System.out.println("删除");
    }

    @Override
    public void upd() {
        System.out.println("修改");
    }

    @Override
    public void sel() {
        System.out.println("查找");
    }
}
由于MySsqlDao和OracleDao之间重复的太多了,所以现在创建AbstractDao,在其中写出重复的部分。

然后对 MysqlDao和OraclDao进行修改

 MysqlDao

public class MysqlDao extends AbstractDao{

    //因为有了AbstractDao,所以现在可以将MysqlDao的MysqlDao改成extends 然后继承AbstractDao。
    //此时,下面重复的部分就可以删除了

    @Override
    public void connect() {
        System.out.println("MySQL的连接");
    }
}

 OraclDao

//与MysqlDao进行相同 *** 作

public class OraclDao extends AbstractDao{
    @Override
    public void connect() {
        System.out.println("Oracle的连接");
    }
}

测试

import java.util.Scanner;

public class Client {
    public static void main(String[] args) {
        System.out.println("请问你要连接的数据库是哪一个???【1.MySQL  2.Oracle】");
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();

        IDAO dao;
        if (n == 1) {
//            IDAO dao = new MysqlDao();
            dao = new MysqlDao();
        } else {
//            IDAO dao = new OraclDao();
            dao = new OraclDao();
        }

        //此时在外部用dao是用不了的,原因是dao在if内部【所以现在在if外面进行声明】
        dao.connect();
        dao.add();
        dao.del();
        dao.upd();
        dao.sel();
    }
}

运行结果 

 

 慢慢理解世界,慢慢更新自己!!!每天都要加油啊,小鲁✌

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734194.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存