Java:继承和多态

2023-11-09

继承

什么是继承以及为什么需要继承?

继承机制:是面向对象程序设计是代码实现复用中至关重要的一步,它允许程序在保持原有类的特性的基础上来进行扩充,增加新功能等。

总的来说,继承就是将不同类之间的共性进行抽取,抽取出来的这些共同的特性就可以单独写成一个父类,其他被抽取共性的类就可以继承这个类,这些便可成为子类。当然,继承之后,子类是可以复用父类中的成员,子类在实现是只需要关心自己新增加的成员即可。
继承最大的作用:抽取共性,实现代码的复用;实现多态(请继续往下看便可以知道多态)。

一段使用继承的简单代码

class Animal{
    String name;
    int age;
    String sex;

    public void sleep(){
        System.out.println(this.name+"正在睡觉");
    }
}

class Cat extends Animal{
    public void eat(){
        System.out.println(this.name+"正在吃猫粮");
    }
}

class Dog extends Animal{
    public void eat(){
        System.out.println(this.name+"正在吃狗粮");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat cat=new Cat();
        cat.name="小黄";
        cat.eat();
        Dog dog=new Dog();
        dog.name="小黑";
        dog.eat();
    }
}

总结:

  • 子类会将父类中的成员变量或者成员方法继承下来为自己所用
  • 子类继承父类之后,建议要添加子类自己特有的成员,来体现出子类的不同之处,否则就没有继承的必要了

父类成员的访问

子类访问父类的成员变量

子类和父类不存在同名的成员变量

子类访问的这个成员变量是从父类中继承下来的,自己本身是没有的。

class Base{
    public int a;
    public int b;
}

class Derived extends Base{
    public int c;

    public void func(){
        a=1;
        b=2;
        c=3;
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
        System.out.println(derived.a);
    }
}
子类和父类存在同名的成员变量

子类访问的这个成员变量自己本身是存在的,那么会优先调用自己的。

class Base{
    public int a=10;
    public int b;
}

class Derived extends Base{
    public int a=3;
    public char b;

    public void func(){
        a=100;
        b=97;
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
        System.out.println(derived.a);   //a=3
        derived.func();
        System.out.println(derived.a);   //a=100
        System.out.println(derived.b);   //b='a'
    }
}
小总结
  • 如果子类访问的成员变量在自己本身就已经拥有(不管父类中有或者没有),那么则会优先访问自己的成员变量
  • 如果子类访问的成员变量在自己本身的类中没有,那么则会继承父类中的成员变量;如果父类中也没有该成员变量,那么编译器则会报错

子类访问父类的成员方法

子类和父类不存在同名的成员方法
class Base{
    public void func1(){
        System.out.println("在Base类中的成员方法");
    }
}

class Derived extends Base {
    public void func2(){
        System.out.println("在Derived类中的成员方法");
    }

    public void func(){
        func1();   //访问的是父类的成员方法
        func2();   //访问的是子类的成员方法
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}
子类和父类存在同名的成员方法
class Base{
    public void func1(){
        System.out.println("这是Base类的第一个成员方法");
    }

    public void func2(){
        System.out.println("这是Base类的第二个成员方法");
    }
}

class Derived extends Base {
    public void func1(int a){
        System.out.println("这是Derived类的第一个成员方法");
    }

    public void func2(){
        System.out.println("这是Derived类的第二个成员方法");
    }

    public void func(){
        func1();
        func1(10);
        func2();
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}

运行结果:
在这里插入图片描述

小总结

从上面的两段代码以及运行结果中,得出结论:

  • 通过子类对象来访问父类与子类不同名的方法时,与访问成员变量类似的,优先在子类中找,找到则会字节访问;如果子类中找不到,则会在父类中找,找到就会访问;如果找不到,则很可能会字节报错
  • 通过子类对象来访问父类与子类同名的方法时,如果父类与子类方法中的参数列表不同(也就是构成重载),则会通过调用方法传递的参数来选择合适的方法来进行方法;如果父类与子类方法中的参数列表相同,原型一致(也就是构成重写),则会直接访问子类中的这个成员方法,这时候无法访问父类中的同名成员方法(除非使用super,接下来很快就介绍到)

super关键字

我们在上面说到了,子类和父类存在同名的成员方法(且原型一致)的时候,只能够直接地调用子类的成员方法,无法直接地访问到父类的成员方法。那么针对这种情况,Java提供了super关键字,用来在子类中访问父类的成员

继续使用上一个例子,我们只需要将func2方法前加上super.即可:

class Base{
    public void func1(){
        System.out.println("这是Base类的第一个成员方法");
    }

    public void func2(){
        System.out.println("这是Base类的第二个成员方法");
    }
}

class Derived extends Base {
    public void func1(int a){
        System.out.println("这是Derived类的第一个成员方法");
    }

    public void func2(){
        System.out.println("这是Derived类的第二个成员方法");
    }

    public void func(){
        func1();
        func1(10);
        super.func2();
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
        derived.func();
    }
}

注意:super关键字只能在非静态方法中使用。

但是这又是为什么呢?为什么super在静态方法中就不能够使用呢?
其实你只要仔细想什么是静态方法,那么这些问题也就可以迎刃而解了(这一点在前面在讲到的this时候的原因是一样的)。所谓的静态方法,其实就是不依赖于对象的方法,也就是说,它并不需要实例化对象就可以在类外直接进行调用,那么问题就来了,super如果是用在静态方法里面,然而这个静态方法很显然也不可能是构造方法,既然不是构造方法,那么也就不能够调用父类里面的内容,那又何来的super访问父类成员一说,显然就是无稽之谈。(以上子类中的构造方法在下文中会介绍到,这里当个了解,回头再看一遍即可)

子类的构造方法

class Base{
    public Base(){
        System.out.println("这是Base的构造方法");
    }
}

class Derived extends Base{
    public Derived(){
        //super();   这里原来是有这么一段代码的
        System.out.println("这是Derived的构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
    }
}

在Java中,在对子类进行构造的时候,都需要先调用父类的构造方法,才能够来执行子类的构造方法。这样做的原因是:每一个子类对象中都是由两部分组成的,必须先将父类中的成员完整继承下来,在将子类自己新增加的成员初始化完整。
注意事项:

  • 如果父类显示定义无参(就像上面的例子)或者是默认的构造方法,那么在子类构造方法的第一行会默认有隐藏的super()调用(也就是调用父类的构造方法,不需要自己手动添加)
  • 如果父类构造方法是带有参数的,那么这个时候编译器不会在给子类生成默认的构造方法,那么就需要在子类的构造方法中选择合适的父类构造方法调用,否则编译会失败。例子见下:
class Base{
    public Base(int a,double z){
        System.out.println("这是Base的构造方法");
    }
}

class Derived extends Base{
    public Derived(){
        super(10,3.14);
        System.out.println("这是Derived的构造方法");
    }
}

public class Main {
    public static void main(String[] args) {
        Derived derived=new Derived();
    }
}
  • 在子类的构造方法中,super(……)调用父类构造时,必须是子类构造方法中的第一条语句
  • super(……)只能在子类中出现一次,并且不能和 this 同时出现,因为无论是super还是this,在调用其他构造的时候都应该将本条语句放在本构造方法的第一条语句,那么这样就会引起不必要的错误。所以,super & this 二者只能够出现其一。

进一步了解super和this(总结)

相同点

  1. 都是Java中的关键字
  2. 都是只能在类的非静态方法中使用,用来访问非静态成员方法和字段
  3. 在构造方法中调用时,都必须是构造方法中的第一条语句,并且是不能够同使存在的

不同点

  1. this是当前对象的引用,当前对象也即是调用实例方法的对象;而super则相当于子类对象中从父类继承下来部分成员的引用
  2. 在非静态方法中,this是用来访问本类的方法和属性;而super则是用来访问父类继承下来的方法和属性
  3. this是非静态方法的一个隐藏参数,而super不是隐藏参数
  4. 成员方法中直接访问本类成员时,编译之后会将this还原,也就是本类的非静态成员都是通过this来进行访问的;而在子类中如果通过super访问父类成员,编译之后在字节码层面super实际是不存在的(也就是说在编译完成之后已经super了,super只选在于代码层面,提高代码可读性,来快速知道这里访问的是父类的成员,仅此而已)
  5. 在构造方法中一定会存在super()的调用,就算没有编写此代码也会默认添加;而this()调用,如果不写则是没有,不会默认添加

代码块在继承关系上的执行顺序

简单回顾:在上篇文章讲“类和对象”中,我们就已经介绍了代码块以及其执行顺序。代码块主要可分为静态代码块和实例代码块,其中的顺序是:静态代码块优先执行,并且只执行一次,在类加载的阶段就开始执行;当有对象创建的时候,才会执行实例代码块;最后才是执行构造方法。

那么在继承关系上的执行顺序又会不会有什么变化呢?请继续往下看。
先上代码:

class Base{
    public int a;
    public String b;

    public Base(int a, String b) {
        this.a = a;
        this.b = b;
        System.out.println("Base类中的构造方法");
    }

    {
        System.out.println("Base类中的实例代码块");
    }

    static {
        System.out.println("Base类中的静态代码块");
    }
}

class Dervied extends Base{
    public Dervied(int a, String b) {
        super(a,b);
        System.out.println("Derived类中的构造方法");
    }

    {
        System.out.println("Derived类中的实例代码块");
    }

    static {
        System.out.println("Derived类中的静态代码块");
    }
}

public class Main {
    public static void main(String[] args) {
        Dervied dervied1=new Dervied(10,"666");
        System.out.println("=======================");
        Dervied dervied2=new Dervied(20,"555");
    }
}

运行结果:
在这里插入图片描述

从上面的代码以及运行结果可以得出结论:

  • 父类的静态代码块优先于子类的静态代码块执行,且是最早执行的
  • 父类的实例代码块和父类的构造方法再执行;子类的实例代码块和子类的构造方法再紧接着执行(注意:这里不是实例代码块都先执行再执行构造方法的)
  • 因为静态代码块只会执行一次,所以在第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

总结Java中的继承方式

单继承

在这里插入图片描述
或者
在这里插入图片描述
实现代码:

public class A{
    ……
}

public class B extends A{
    ……
}

public class C extends A{
    ……
}

多层继承

在这里插入图片描述

public class A{
    ……
}

public class B extends A{
    ……
}

public class C extends B{
    ……
}

注意:

  • Java是不支持多继承,而如果要实现像C++那样多继承的情况,那就要使用Java中的接口来实现(接下来的文章会讲到Java中的接口)
  • 一般我们在使用多层继承的时候,是不会超过三层的继承关系,因为层数越多,会是代码变得越复杂,那么这时候就要考虑对代码进行重构了

继承中常使用的两个重要关键字

protected关键字

在之前文章“类和对象”一文中,我们介绍了private、public以及包访问权限,接下来就来详细介绍最后的一个访问限定符:protected。

在上篇文中,我们已经知道:

  • private修饰的成员只能在同一个类中使用,在类外是不能访问的
  • 包访问权限(也就是默认访问权限)修饰的成员只能在同一个包中使用,在这个包外就不能访问
  • public修饰的成员不管是在哪里都能够访问

这时候,如果有人想要在一个包中的一个子类中继承另外一个包中父类,又不想让这个父类到处都可以访问(因为不安全),只能被子类继承仅此而已,那么这时候不管是使用包访问权限还是公开访问权限,都不合适。所以就引出了protected继承权限(可用于不同包中的继承),这样就可以很好地解决了这个问题。

final关键字

final关键字是可以用来修饰成员变量、成员方法和类。

  1. final修饰变量/字段(成员变量),表示常量(也就是不能对其进行修改)
final int a = 10;
a = 20;    // 编译出错
  1. final修饰类,表示这个类将不能被继承

如果强制继承,则会报错。这也就是为什么我们用的String字符串类不能被继承的原因,就是因为其底层实现使用的是final修饰的。

  1. final修饰成员方法,表示这个方法不能被重写(后面会介绍到重写)

组合

与继承类似的,组合也是一种表达类之间关系的方式,也就是能够达到代码复用的效果。组合不像继承那样会用到一些类似extends之类的关键字,它仅仅只是将一个类的实例作为另外一个类的字段。

区别:
继承表示对象之间是is-a的关系:狗是动物,猫是动物。
组合表示对象之间是has-a的关系:汽车有轮胎,汽车有方向盘。
共同点:
组合和继承都可以实现代码复用,那么如何选择是使用继承还是使用组合呢?

  • 总的来说,是需要根据代码应用的场景来进行选择的
  • 但是一般来说,如果可以使用组合的尽量是使用组合

示例代码:

// 轮胎类
class Tire{
    ...
}

// 发动机类
class Engine{
    ...
}

// 车载系统类
class VehicleSystem{
    ...
}

class Car{
    private Tire tire;    // 可以复用轮胎中的属性和方法
    private Engine engine;    // 可以复用发动机中的属性和方法
    private VehicleSystem vs;    // 可以复用车载系统中的属性和方法
    ...
} 

// 奔驰是汽车
class Benz extend Car{
    // 将轮胎、发送机、车载系统等组合成的汽车全部继承下来
}

多态

什么是多态?

当某个对象来完成某个行为的时候,会产生出不同的状态(也就是说相同的一件事,发生在不同对象的身上,就会产生不同的结果),这就是多态。

重写

那么在了解多态之前,我们先来了解一下什么是方法的重写,以便后面进一步学习多态等相关内容。

其实我们在前面的文章中就已经频繁地说到和使用到了重写。

什么是重写?

重写,也可以理解为是覆盖。重写是子类对父类非静态、非private修饰、非构造方法等的实现过程进行重新编写,返回值和参数列表都不能改变,核心重写。重写的好处在于子类可以根据需要,定义特定于自己的行为(也就是说子类能够根据自己的需要实现父类的方法)。

方法重写的规则

  • 子类在重写父类方法的时候,一般必须与父类原型保持一致,其中返回值类型、方法名、参数列表要完全一致
  • 访问权限不能比父类中被重写的方法的访问权限更低,而应该是大于等于。就比如如果父类的方法被public修饰,那么子类中要重写的方法有且仅有使用public来进行修饰
  • 父类中被private、static(静态)、final修饰的成员方法在子类中是不能够进行重写的
  • 重写的方法,可以使用**@Override**注解来显示指定,这个注解能够帮助我们进行一些合法性校验,因为这样的话如果在子类重写的方法中不小心把重写父类的方法名写错了,编译器会帮忙提醒

重写和重载的区别

区别 重载 重写
参数列表 必须修改 一定不能修改
返回值类型 可以修改 一定不能修改
访问限定符 可以修改 可以降低限制修改

总的来说:方法重载是一个类的多样性的表现;而方法重写是子类与父类的一种多样性的表现。

延伸知识点(拓展)

在实际开发的过程中,对于你们已经投入使用的类,尽量不要进行修改。最好的方式是重新定义一个新的类,来重复利用其中的共性的内容,并且添加或者修改一部分的内容。因为这样的设计能够让用户选择上下版本,不管是上一版本还是下一版本,都是兼容的,不会因为下一个版本的发布,导致上一版本无法使用的问题。

多态的实现条件

  1. 必须是要在继承的体系下
  2. 子类必须要对父类中的方法进行重写
  3. 通过父类的引用调用重写方法

示例代码:

class Aminal{
    public String name;
    public int age;

    public Aminal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}

class Cat extends Aminal{
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃猫粮");
    }
}

class Dog extends Aminal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"正在吃狗粮");
    }
}

public class Main {
    public static void main(String[] args) {
        Cat cat=new Cat("小黄",3);
        cat.eat();
        Dog dog=new Dog("小黑",6);
        dog.eat();
    }
}

运行结果:
在这里插入图片描述

形如这样的,分别调用自己子类中的成员方法,对相同的一个方法实现各行其能,以达到不同的效果,这就是多态

动态绑定(运行时绑定)

这里插入一个知识点——动态绑定和静态绑定,以便后面会使用到。

动态绑定:在发生多态的时候,查看编译后的代码会发现,编译时候的代码还是调用的是父类的方法,并没有调用子类中重写的方法,但是在运行时会变成子类自己的方法,类似这样的就称为运行时绑定,也叫动态绑定。
静态绑定:静态绑定就是在编译时期就确定的,例如方法的重载等。

向上转型和向下转型

向上转型

向上转型实际上就是创建一个子类,将其当成父类对象来进行使用。

发生向上转型只需要记住一个口诀:父类引用,引用子类对象
示例代码:

class Aminal{
    public String name;
    public int age;

    public Aminal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}

class Cat extends Aminal{
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃猫粮");
    }
    
    public void play(){
        System.out.println(this.name+"正在眺");
    }
}

class Dog extends Aminal{
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃狗粮");
    }
    
    public void play(){
        System.out.println(this.name+"正在跑");
    }
}

public class Main {
    public static void main(String[] args) {
        Aminal cat=new Cat("小黄",3);
        cat.eat();
        //cat.play();   //报错
        Aminal dog=new Dog("小黑",6);
        dog.eat();
        //dog.play();   //报错
    }
}

向上转型的优点是可以让代码的实现变得更加灵活,就比如在复杂的代码中我们是可以返回一个子类的实例化的对象,然后用一个父类引用来进行接收,这样就会变得更加简单灵活;当然,向上转型也有缺点,那就是不能够调用到子类特有的方法(上面代码中有体现出来)。

向下转型

有了向上转型,那也就出现了向下转型。因为向上转型是不能调用子类特有的方法的,那么这时候就出现了向下转型来弥补这一缺点。具体实现是将父类引用在还原为子类对象,那么这时候势必会涉及到强制类型转换,请继续往下看。

延续上面向上转型的代码:

class Aminal{
    public String name;
    public int age;

    public Aminal(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(){
        System.out.println(this.name+"正在吃饭");
    }
}

class Cat extends Aminal {
    public Cat(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃猫粮");
    }

    public void play(){
        System.out.println(this.name+"正在眺");
    }
}

class Dog extends Aminal {
    public Dog(String name, int age) {
        super(name, age);
    }

    @Override
    public void eat() {
        System.out.println(this.name+"吃狗粮");
    }

    public void play(){
        System.out.println(this.name+"正在跑");
    }
}

public class Main {
    public static void main(String[] args) {
        Aminal aminal1=new Cat("小黄",3);   //向上转型
        Cat cat=(Cat) aminal1;   //向下转型
        cat.play();
        Aminal aminal2=new Dog("小黑",6);   //向上转型
        Dog dog=(Dog) aminal2;   //向下转型
        dog.play();
    }
}

虽然向下转型可以解决向上转型后留下来的不能调用子类特有方法的问题,但是在实际的开发过程中,我们是比较少使用到向下转型的,因为不安全(1. 有可能没有进行前置类型转换而导致转换失败;2. 以上面的代码为例,有可能在进行向下转型的时候,将原本是猫类的转换成了狗类,从而导致错误),所以为了提高安全性,我们会尽量少地使用向下转型。

使用多态的优缺点

使用多态的优点:

  1. 能够降低代码的“圈复杂度”,避免大量使用 if-else(等的条件语句):如果没有多态,我们在调用不同类中的同一行为的不同实现的时候,就要一直使用条件语句来选择要调用哪个类中的方法。而多态就不一样了,可以写出父子类关系,然后将这个方法在子类中进行重写(还可使用向上转型相关的东西等),大大降低了代码的圈复杂度。
  2. 可扩展能力更强:如果写成 if-else(等的条件语句),在后续代码的修改成本会比较大(相当于直接把代码写死了)。而多态就不一样了,只要直接创建一个新类即可,改动的成本比较低。

**使用多态的缺点:**代码运行效率比较低。

避免在构造方法中调用重写的方法

比如下面这段代码:

class B {
    public B() {
        func();
    }
    public void func() {
        System.out.println("B.func()");
    }
}
class D extends B {
    private int num = 1;
    
    @Override
    public void func() {
        System.out.println("D.func() " + num);
    }
}

public class Main {
    D d=new D();
    d.func();   //直接报错
}

这段代码在构造子类D对象的同时,会先调用父类B的构造方法,又因为B的构造方法中调用的func()方法,此时会触发动态绑定,会调用子类D中的func(),此时D对象自身还没有构造,num是并未进行初始化的,所以会报错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java:继承和多态 的相关文章

随机推荐

  • Web开发文稿

    前言 首先 目前主流开发工具有很多 而且更新迭代的速度非常迅速 所以这里只谈一些基础的概念 如前后端的交互到底是怎么交互的 这也是我在学习网页开发的很困惑的东西 一 我的开发工具 网页界面 html css 浏览器脚本 js 服务器脚本 p
  • android studio全局搜索 快捷键

    全局搜索 gt 项目下的APP目录 gt 右键 gt Find in path 快捷键 Ctrl h
  • 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告

    版权声明 本文为博主原创文章 如需转载 请写明出处 尊重他人即尊重自己 http blog csdn net aubdiy article details 68485336 IntelliJ IDEA 打开 mybatis 的 xml 文件
  • 每天一个shell小知识(case)

    Case语句 case 结构 例1 case Case语句主要适用于 某个变量存在多种取值 需要对其中的每一种取值分别执行不同的命令序列 这种情况和多分支if语句非常相似 只不过if要判断多个不同的条件而case语句只判断一个变量的不同取值
  • Go Casbin 编写 MySQL适配器

    在 Go Casbin 中使用 MySQL 作为策略存储是一种常见的方式 下面是一个简单的示例 演示了如何在 Go Casbin 中使用 MySQL 首先 我们需要导入 MySQL 驱动程序和 Casbin import github co
  • 网络编程之三

    代码1 chat tcp client1 c include header h int main int argc char argv int connfd 1 if 0 gt connfd socket AF INET SOCK STRE
  • Markdown 语法的简要规则

    Markdown 语法的简要规则 标题 标题是每篇文章都需要也是最常用的格式 在 Markdown 中 如果一段文字被定义为标题 只要在这段文字前加 号即可 一级标题 二级标题 三级标题 以此类推 总共六级标题 建议在 号后加一个空格 这是
  • tkinter:嵌套子窗口操作步骤

    tkinter 嵌套子窗口操作步骤 0 导入模块 import ctypes import tkinter as tk u32 ctypes windll user32 1 主窗口创建 a tk Tk 父窗口 a geometry 800x
  • 【Spark NLP】第 12 章:情感分析和情绪检测

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Python3中常用模块-sys模块

    目录 1 获取模块文档 1 1 使用sys doc 查看方法说明 1 2 使用dir函数获取模块中的所有属性和方法 1 3 使用help函数查看某个函数 2 模块常用方法 3 解析命令行参数 sys模块和os模块是Python系统相关工具集
  • git分支管理

    Create the branch on your local machine and switch in this branch git checkout b name of your new branch Push the branch
  • python 把数字写入文件

    初学python 还不是很了解 其实只要用str 将数字包住即可 如下 file write str 12
  • Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

    Apache CXF 在 WebLogic 9 2 上的问题定位分析及权宜之计 本文关键词 技术 WebLogic Apache 中间件 http yulimin javaeye com blog 129015 同样的程序在 Tomcat
  • Ubuntu 安装配置Samba服务器

    一 描述 Samba文件服务器可以在网络上实现不同操作系统的文件共享 它可以让你从笔记本电脑访问你的桌面文件 并与Windows和macOS用户共享文件 Samba是通过Network LAN 局域网来实现的 二 安装 要安装Samba 我
  • 架构是什么

    是什么 架构是什么 众说纷纭 架构 Architecture 一词最早源自建筑学术语 后来才被计算机科学领域借用 以下是其在维基百科 Wikipedia 中的定义 架构是规划 设计和构建建筑及其物理结构的过程与产物 在计算机工程中 架构是描
  • 苏嵌嵌入式Linux实训 第2天

    今天是嵌入式学习的第二天 也是正式教学开始的第一天 全程由梁老师为我们讲解 由于仅仅是新手的接触 不懂的地方还有很多 有时甚至跟不上老师的节奏 当然这也需要我们课后的复习和总结 不断积累才能不断收获 1 课程内容 今天的课程主要是对嵌入式开
  • 删除当前目录下所有.py[cdo]文件的命令

    rm f py 命令会删除当前目录下所有的 py 文件 但不会删除包含这些文件的目录 这个命令并没有错误 但是如果你只希望删除当前目录下的 py 文件而不包括子目录中的文件 你可以使用 rm f py cdo 在解释这个命令之前 首先来了解
  • Ubuntu 下安装 QQ

    安装流程 一 QQ Linux版本下载 二 安装 一 QQ Linux版本下载 1 使用以下指令查看自己的 Ubuntu 版本的类型 uname a 可查看到我的 Ubuntu 版本为 x86 64的版本 因此可以点击此处链接前往 QQ 官
  • Springboot + MySQL+ JPA II save方法详解

    JPA没有专门的update接口 save接口同时支持update操作 一 save 单条添加 Service层中添加save方法 save是三方件自带接口不需要再dao层中添加 Transactional public User save
  • Java:继承和多态

    继承 什么是继承以及为什么需要继承 继承机制 是面向对象程序设计是代码实现复用中至关重要的一步 它允许程序在保持原有类的特性的基础上来进行扩充 增加新功能等 总的来说 继承就是将不同类之间的共性进行抽取 抽取出来的这些共同的特性就可以单独写