2018-07-08    13:47:26

final关键字

多态

从右向前念

多态的成员访问特点及转型的理解

 多态的问题理解:
class 孔子爹 {
public int age = 40; public void teach() {
System.out.println("讲解JavaSE");
}
} class 孔子 extends 孔子爹 {
public int age = 20; public void teach() {
System.out.println("讲解论语");
} public void playGame() {
System.out.println("英雄联盟");
}
} //Java培训特别火,很多人来请孔子爹去讲课,这一天孔子爹被请走了
//但是还有人来请,就剩孔子在家,价格还挺高。孔子一想,我是不是可以考虑去呢?
//然后就穿上爹的衣服,带上爹的眼睛,粘上爹的胡子。就开始装爹
//向上转型
孔子爹 k爹 = new 孔子();
//到人家那里去了
System.out.println(k爹.age); //
k爹.teach(); //讲解论语
//k爹.playGame(); //这是儿子才能做的 //讲完了,下班回家了
//脱下爹的装备,换上自己的装备
//向下转型
孔子 k = (孔子) k爹;
System.out.println(k.age); //
k.teach(); //讲解论语
k.playGame(); //英雄联盟

多态继承中的内存图解

向上转型

向下转型

抽象类

 /*
抽象类的概述:
动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的。
我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类。 抽象类的特点:
A:抽象类和抽象方法必须用abstract关键字修饰
B:抽象类中不一定有抽象方法,但是有抽象方法的类必须定义为抽象类
C:抽象类不能实例化
因为它不是具体的。
抽象类有构造方法,但是不能实例化?构造方法的作用是什么呢?
用于子类访问父类数据的初始化
D:抽象的子类
a:如果不想重写抽象方法,该子类是一个抽象类。
b:重写所有的抽象方法,这个时候子类是一个具体的类。 抽象类的实例化其实是靠具体的子类实现的。是多态的方式。
Animal a = new Cat();
*/ //abstract class Animal //抽象类的声明格式
abstract class Animal {
//抽象方法
//public abstract void eat(){} //空方法体,这个会报错。抽象方法不能有主体
public abstract void eat(); public Animal(){}
} //子类是抽象类
abstract class Dog extends Animal {} //子类是具体类,重写抽象方法
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
}
} class AbstractDemo {
public static void main(String[] args) {
//创建对象
//Animal是抽象的; 无法实例化
//Animal a = new Animal();
//通过多态的方式
Animal a = new Cat();
a.eat();
}
}

 /*
抽象类的成员特点:
成员变量:既可以是变量,也可以是常量。
构造方法:有。
用于子类访问父类数据的初始化。
成员方法:既可以是抽象的,也可以是非抽象的。 抽象类的成员方法特性:
A:抽象方法 强制要求子类做的事情。
B:非抽象方法 子类继承的事情,提高代码复用性。
*/
abstract class Animal {
public int num = 10;
public final int num2 = 20; public Animal() {} public Animal(String name,int age){} public abstract void show(); public void method() {
System.out.println("method");
}
} class Dog extends Animal {
public void show() {
System.out.println("show Dog");
}
} class AbstractDemo2 {
public static void main(String[] args) {
//创建对象
Animal a = new Dog();
a.num = 100;
System.out.println(a.num);
//a.num2 = 200;
System.out.println(a.num2);
System.out.println("--------------");
a.show();
a.method();
}
}

猫狗案例

*注意:分析和实现的过程

 /*
猫狗案例
具体事物:猫,狗
共性:姓名,年龄,吃饭 分析:从具体到抽象
猫:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(猫吃鱼) 狗:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(狗吃肉) 因为有共性的内容,所以就提取了一个父类。动物。
但是又由于吃饭的内容不一样,所以吃饭的方法是抽象的,
而方法是抽象的类,类就必须定义为抽象类。 抽象动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(); 实现:从抽象到具体
动物类:
成员变量:姓名,年龄
构造方法:无参,带参
成员方法:吃饭(); 狗类:
继承自动物类
重写吃饭(); 猫类:
继承自动物类
重写吃饭();
*/
//定义抽象的动物类
abstract class Animal {
//姓名
private String name;
//年龄
private int age; public Animal() {} public Animal(String name,int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //定义一个抽象方法
public abstract void eat();
} //定义具体的狗类
class Dog extends Animal {
public Dog() {} public Dog(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("狗吃肉");
}
} //定义具体的猫类
class Cat extends Animal {
public Cat() {} public Cat(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("猫吃鱼");
}
} //测试类
class AbstractTest {
public static void main(String[] args) {
//测试狗类
//具体类用法
//方式1:
Dog d = new Dog();
d.setName("旺财");
d.setAge(3);
System.out.println(d.getName()+"---"+d.getAge());
d.eat();
//方式2:
Dog d2 = new Dog("旺财",3);
System.out.println(d2.getName()+"---"+d2.getAge());
d2.eat();
System.out.println("---------------------------"); Animal a = new Dog();
a.setName("旺财");
a.setAge(3);
System.out.println(a.getName()+"---"+a.getAge());
a.eat(); Animal a2 = new Dog("旺财",3);
System.out.println(a2.getName()+"---"+a2.getAge());
a2.eat(); //练习:测试猫类 }
}

员工案例

 /*
假如我们在开发一个系统时需要对员工类进行设计,员工包含3个属性:姓名、工号以及工资。
经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。
请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。 分析:
普通员工类
成员变量:姓名、工号以及工资。
成员方法:工作
经理类:
成员变量:姓名、工号以及工资,奖金属性
成员方法:工作 实现:
员工类:
普通员工类:
经理类:
*/
//定义员工类
abstract class Employee {
//姓名、工号以及工资
private String name;
private String id;
private int salary; public Employee() {} public Employee(String name,String id,int salary) {
this.name = name;
this.id = id;
this.salary = salary;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
} public void setId(String id) {
this.id = id;
} public int getSalary() {
return salary;
} public void setSalary(int salary) {
this.salary = salary;
} //工作
public abstract void work();
} //普通员工类
class Programmer extends Employee {
public Programmer(){} public Programmer(String name,String id,int salary) {
super(name,id,salary);
} public void work() {
System.out.println("按照需求写代码");
}
} //经理类
class Manager extends Employee {
//奖金
private int money; //bonus 奖金 public Manager(){} public Manager(String name,String id,int salary,int money) {
super(name,id,salary);
this.money = money;
} public void work() {
System.out.println("跟客户谈需求");
} public int getMoney() {
return money;
} public void setMoney(int money) {
this.money = money;
}
} class AbstractTest4 {
public static void main(String[] args) {
//测试普通员工
Employee emp = new Programmer();
emp.setName("林青霞");
emp.setId("czbk001");
emp.setSalary(18000);
System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
emp.work();
System.out.println("-------------");
emp = new Programmer("林青霞","czbk001",18000);
System.out.println(emp.getName()+"---"+emp.getId()+"---"+emp.getSalary());
emp.work();
System.out.println("-------------"); /*
emp = new Manager();
emp.setName("刘意");
emp.setId("czbk002");
emp.setSalary(8000);
emp.setMoney(2000);
*/
//由于子类有特有的内容,所以我们用子类来测试
Manager m = new Manager();
m.setName("刘意");
m.setId("czbk002");
m.setSalary(8000);
m.setMoney(2000);
System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
m.work();
System.out.println("-------------"); //通过构造方法赋值
m = new Manager("刘意","czbk002",8000,2000);
System.out.println(m.getName()+"---"+m.getId()+"---"+m.getSalary()+"---"+m.getMoney());
m.work();
}
}

接口

new 对象时   从右往前念

接口的概念和特点

 /*
接口的特点:
A:接口用关键字interface表示
interface 接口名 {}
B:类实现接口用implements表示
class 类名 implements 接口名 {}
C:接口不能实例化
那么,接口如何实例化呢?
按照多态的方式来实例化。
D:接口的子类
a:可以是抽象类。但是意义不大。
b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案) 由此可见:
A:具体类多态(几乎没有)
B:抽象类多态(常用)
C:接口多态(最常用)
*/
//定义动物培训接口
interface AnimalTrain {
public abstract void jump();
} //抽象类实现接口
abstract class Dog implements AnimalTrain {
} //具体类实现接口
class Cat implements AnimalTrain {
public void jump() {
System.out.println("猫可以跳高了");
}
} class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 无法实例化
//AnimalTrain at = new AnimalTrain();
//at.jump(); AnimalTrain at = new Cat();
at.jump();
}
}

接口的默认修饰符:

public  static final  ...

建议自己手动给出

接口成员的特点:

  成员变量:

    只能是常量,并且是静态的

    默认修饰符:public static final

    建议:自己手动给出

  构造方法:接口没有构造方法

  成员方法:

    只能是抽象方法

    默认修饰符:public abstrac

    建议自己手动给出

所有的类都默认继承自一个类:Object.

类Object是类层次结构的根类。每个类都使用Object作为超类

 /*
接口成员特点
成员变量;只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
构造方法:接口没有构造方法。
成员方法:只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。 所有的类都默认继承自一个类:Object。
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。
*/
interface Inter {
public int num = 10;
public final int num2 = 20;
public static final int num3 = 30; //错误: 需要<标识符>
//public Inter() {} //接口方法不能带有主体
//public void show() {} //abstract void show(); //默认public
public void show(); //默认abstract
} //接口名+Impl这种格式是接口的实现类格式
/*
class InterImpl implements Inter {
public InterImpl() {
super();
}
}
*/ class InterImpl extends Object implements Inter {
public InterImpl() {
super();
} public void show() {}
} //测试类
class InterfaceDemo2 {
public static void main(String[] args) {
//创建对象
Inter i = new InterImpl();
System.out.println(i.num);
System.out.println(i.num2);
//i.num = 100;
//i.num2 = 200;
//System.out.println(i.num); //无法为最终变量num分配值
//System.out.println(i.num2);//无法为最终变量num2分配值
System.out.println(Inter.num);
System.out.println(Inter.num2);
System.out.println("--------------");
}
}

类与类,类与接口,接口与接口的关系

类与类:

  继承关系,只能单继承,可以多层继承

类与接口:

  实现关系,可以单实现,也可以多实现

  并且还可以继承一个类的同时实现多个接口

接口与接口:

  继承关系,可以单继承,也可以多继承

 /*
类与类:
继承关系,只能单继承,可以多层继承。
类与接口:
实现关系,可以单实现,也可以多实现。
并且还可以在继承一个类的同时实现多个接口。
接口与接口:
继承关系,可以单继承,也可以多继承。
*/
interface Father {
public abstract void show();
} interface Mother {
public abstract void show2();
} interface Sister extends Father,Mother { } //class Son implements Father,Mother //多实现
class Son extends Object implements Father,Mother {
public void show() {
System.out.println("show son");
} public void show2() {
System.out.println("show2 son");
}
} class InterfaceDemo3 {
public static void main(String[] args) {
//创建对象
Father f = new Son();
f.show();
//f.show2(); //报错 Mother m = new Son();
//m.show(); //报错
m.show2();
}
}

2018-07-09   08:06:34

接口    接口中定义的是该继承体系的扩展功能

分析过程:从具体到抽象

实现过程:从抽象到具体

 /*
猫狗案例,加入跳高的额外功能 分析:从具体到抽象
猫:
姓名,年龄
吃饭,睡觉
狗:
姓名,年龄
吃饭,睡觉 由于有共性功能,所以,我们抽取出一个父类:
动物:
姓名,年龄
吃饭();
睡觉(){} 猫:继承自动物
狗:继承自动物 跳高的额外功能是一个新的扩展功能,所以我们要定义一个接口
接口:
跳高 部分猫:实现跳高
部分狗:实现跳高
实现;
从抽象到具体 使用:
使用具体类
*/
//定义跳高接口
interface Jumpping {
//跳高功能
public abstract void jump();
} //定义抽象类
abstract class Animal {
//姓名
private String name;
//年龄
private int age; public Animal() {} public Animal(String name,int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //吃饭();
public abstract void eat(); //睡觉(){}
public void sleep() {
System.out.println("睡觉觉了");
}
} //具体猫类
class Cat extends Animal {
public Cat(){} public Cat(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("猫吃鱼");
}
} //具体狗类
class Dog extends Animal {
public Dog(){} public Dog(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("狗吃肉");
}
} //有跳高功能的猫
class JumpCat extends Cat implements Jumpping {
public JumpCat() {} public JumpCat(String name,int age) {
super(name,age);
} public void jump() {
System.out.println("跳高猫");
}
} //有跳高功能的狗
class JumpDog extends Dog implements Jumpping {
public JumpDog() {} public JumpDog(String name,int age) {
super(name,age);
} public void jump() {
System.out.println("跳高狗");
}
} class InterfaceTest {
public static void main(String[] args) {
//定义跳高猫并测试
JumpCat jc = new JumpCat();
jc.setName("哆啦A梦");
jc.setAge(3);
System.out.println(jc.getName()+"---"+jc.getAge());
jc.eat();
jc.sleep();
jc.jump();
System.out.println("-----------------"); JumpCat jc2 = new JumpCat("加菲猫",2);
System.out.println(jc2.getName()+"---"+jc2.getAge());
jc2.eat();
jc2.sleep();
jc2.jump(); //定义跳高狗并进行测试的事情自己完成。
}
}

老师和学生案例,加入抽烟功能的额外功能

 /*
老师和学生案例,加入抽烟的额外功能 分析:从具体到抽象
老师:姓名,年龄,吃饭,睡觉
学生:姓名,年龄,吃饭,睡觉 由于有共性功能,我们提取出一个父类,人类。 人类:
姓名,年龄
吃饭();
睡觉(){} 抽烟的额外功能不是人或者老师,或者学生一开始就应该具备的,所以,我们把它定义为接口 抽烟接口。 部分老师抽烟:实现抽烟接口
部分学生抽烟:实现抽烟接口 实现:从抽象到具体 使用:具体
*/
//定义抽烟接口
interface Smoking {
//抽烟的抽象方法
public abstract void smoke();
} //定义抽象人类
abstract class Person {
//姓名
private String name;
//年龄
private int age; public Person() {} public Person(String name,int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} //吃饭();
public abstract void eat(); //睡觉(){}
public void sleep() {
System.out.println("睡觉觉了");
}
} //具体老师类
class Teacher extends Person {
public Teacher() {} public Teacher(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("吃大白菜");
}
} //具体学生类
class Student extends Person {
public Student() {} public Student(String name,int age) {
super(name,age);
} public void eat() {
System.out.println("吃红烧肉");
}
} //抽烟的老师
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {} public SmokingTeacher(String name,int age) {
super(name,age);
} public void smoke() {
System.out.println("抽烟的老师");
}
} //抽烟的学生
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {} public SmokingStudent(String name,int age) {
super(name,age);
} public void smoke() {
System.out.println("抽烟的学生");
}
} class InterfaceTest2 {
public static void main(String[] args) {
//测试学生
SmokingStudent ss = new SmokingStudent();
ss.setName("林青霞");
ss.setAge(27);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------"); SmokingStudent ss2 = new SmokingStudent("刘意",30);
System.out.println(ss2.getName()+"---"+ss2.getAge());
ss2.eat();
ss2.sleep();
ss2.smoke(); //测试老师留给自己练习
}
}

今日总结:

1:final关键字(掌握)
(1)是最终的意思,可以修饰类,方法,变量。
(2)特点:
  A:它修饰的类,不能被继承。
  B:它修饰的方法,不能被重写。
  C:它修饰的变量,是一个常量。
(3)面试相关:
  A:局部变量
    a:基本类型 值不能发生改变
    b:引用类型 地址值不能发生改变,但是对象的内容是可以改变的
  B:初始化时机
    a:只能初始化一次。
    b:常见的给值
    定义的时候。(推荐)
    构造方法中。

2:多态(掌握)
   (1)同一个对象在不同时刻体现出来的不同状态。
   (2)多态的前提:
      A:有继承或者实现关系。
      B:有方法重写。
      C:有父类或者父接口引用指向子类对象。

   多态的分类:
      a:具体类多态
        class Fu {}
        class Zi extends Fu {}

        Fu f = new Zi();
      b:抽象类多态
        abstract class Fu {}
        class Zi extends Fu {}

        Fu f = new Zi();
      c:接口多态
        interface Fu {}
        class Zi implements Fu {}

        Fu f = new Zi();
    (3)多态中的成员访问特点
      A:成员变量
        编译看左边,运行看左边
      B:构造方法
        子类的构造都会默认访问父类构造
      C:成员方法
        编译看左边,运行看右边
      D:静态方法
        编译看左边,运行看左边

      为什么?
        因为成员方法有重写。
    (4)多态的好处:
        A:提高代码的维护性(继承体现)
        B:提高代码的扩展性(多态体现)
    (5)多态的弊端:
        父不能使用子的特有功能。

    现象:
        子可以当作父使用,父不能当作子使用。
    (6)多态中的转型
        A:向上转型
          从子到父
        B:向下转型
          从父到子
    (7)孔子装爹的案例帮助大家理解多态
    (8)多态的练习
        A:猫狗案例
        B:老师和学生案例

3:抽象类(掌握)
    (1)把多个共性的东西提取到一个类中,这是继承的做法。
      但是呢,这多个共性的东西,在有些时候,方法声明一样,但是方法体。
      也就是说,方法声明一样,但是每个具体的对象在具体实现的时候内容不一样。
      所以,我们在定义这些共性的方法的时候,就不能给出具体的方法体。
      而一个没有具体的方法体的方法是抽象的方法。
      在一个类中如果有抽象方法,该类必须定义为抽象类。
    (2)抽象类的特点
        A:抽象类和抽象方法必须用关键字abstract修饰
        B:抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类
        C:抽象类不能实例化
        D:抽象类的子类
          a:是一个抽象类。
          b:是一个具体类。这个类必须重写抽象类中的所有抽象方法。
    (3)抽象类的成员特点:
        A:成员变量
          有变量,有常量
        B:构造方法
          有构造方法
        C:成员方法
          有抽象,有非抽象
    (4)抽象类的练习
        A:猫狗案例练习
        B:老师案例练习
        C:学生案例练习
        D:员工案例练习
    (5)抽象类的几个小问题
        A:抽象类有构造方法,不能实例化,那么构造方法有什么用?
          用于子类访问父类数据的初始化
        B:一个类如果没有抽象方法,却定义为了抽象类,有什么用?
          为了不让创建对象
        C:abstract不能和哪些关键字共存
          a:final 冲突
          b:private 冲突
          c:static 无意义

4:接口(掌握)
    (1)回顾猫狗案例,它们仅仅提供一些基本功能。
      比如:猫钻火圈,狗跳高等功能,不是动物本身就具备的,
      是在后面的培养中训练出来的,这种额外的功能,java提供了接口表示。
    (2)接口的特点:
      A:接口用关键字interface修饰
        interface 接口名 {}
      B:类实现接口用implements修饰
        class 类名 implements 接口名 {}
      C:接口不能实例化
      D:接口的实现类
        a:是一个抽象类。
        b:是一个具体类,这个类必须重写接口中的所有抽象方法。
   (3)接口的成员特点:
      A:成员变量
        只能是常量
        默认修饰符:public static final
      B:构造方法
        没有构造方法
      C:成员方法
        只能是抽象的
        默认修饰符:public abstract
   (4)类与类,类与接口,接口与接口
        A:类与类
          继承关系,只能单继承,可以多层继承
        B:类与接口
          实现关系,可以单实现,也可以多实现。
          还可以在继承一个类的同时,实现多个接口
        C:接口与接口
          继承关系,可以单继承,也可以多继承
   (5)抽象类和接口的区别(自己补齐)?
        A:成员区别
         抽象类:
          接口:
        B:关系区别:
         类与类:
         类与接口:
         接口与接口:
        C:设计理念不同
            抽象类:is a,抽象类中定义的是共性功能。
            接口:like a,接口中定义的是扩展功能。
  (6)练习:
        A:猫狗案例,加入跳高功能
        B:老师和学生案例,加入抽烟功能0

LY.JAVA面向对象编程.final、多态、抽象类、接口的更多相关文章

  1. LY.JAVA面向对象编程.形式参数和返回值

    2018-07-09 13:29:16 运动员和教练案例 /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 为了出国交流,跟乒乓球相关的人员都需要学习英语 ...

  2. LY.JAVA面向对象编程.修饰符

    2018-07-18 09:20:25 /* 修饰符: 权限修饰符:private,默认的,protected,public 状态修饰符:static,final 抽象修饰符:abstract 类: ...

  3. LY.JAVA面向对象编程.封装、this、构造方法

    2018-07-07 this关键字 构造方法 /* 我们一直在使用构造方法,但是,我们确没有定义构造方法,用的是哪里来的呢? 构造方法的注意事项: A:如果我们没有给出构造方法,系统将自动提供一个无 ...

  4. LY.JAVA面向对象编程思想概述

    面向对象 2018年7月5日  逆袭之旅DAY09 2018年7月5日  逆袭之旅DAY09 2018-07-07

  5. LY.JAVA面向对象编程.内部类

    2018-07-18 10:14:48 /* 内部类概述: 把类定义在其他类的内部,这个类就被称为内部类. 举例:在类A中定义了一个类B,类B就是内部类. 内部的访问特点: A:内部类可以直接访问外部 ...

  6. LY.JAVA面向对象编程.包的概述、导包

    2018-07-18 08:46:57 导包:

  7. LY.JAVA面向对象编程.工具类中使用静态、说明书的制作过程、API文档的使用过程

    2018-07-08 获取数组中的最大值 某个数字在数组中第一次出现时的索引 制作说明书的过程 对工具类的使用 获取数组中的最大值 获取数字在数组中第一次出现的索引值 API的使用过程 Math

  8. LY.JAVA面向对象编程.内存图

    2018-07-06 一个对象的内存图 两个对象的内存图 三个对象的内存图 this static super 向上转型 向下转型

  9. java 面向对象编程。。。。

    经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...

随机推荐

  1. 前端阶段_html部分

    HTML 1.html5的第一行一定是<!DOCTYPE html>,h4太长,而且一般ide中会自动加载,了解即可. 2.h5的整个页面被<html></html> ...

  2. R语言网页爬虫

    R 是统计计算和数据分析的利器.给定一个数据集,利用前几章介绍到的 R 中灵活的数据结构或高性能计算,我们可以很方便地进行数据转换.建模和数值分析.一般来说,商业数据库会将数据以表格的形式很好地组织起 ...

  3. JS _proto_ 和 prototype

    转载自:https://www.cnblogs.com/wuwenjie/p/5433776.html 大佬讲得很明白,自己也收藏一下! 初学javascript的时候也跟题主一样搞不清楚,自己好好总 ...

  4. 《剑指offer》第四十五题(把数组排成最小的数)

    // 面试题45:把数组排成最小的数 // 题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼 // 接出的所有数字中最小的一个.例如输入数组{3, 32, 321},则打印出这3 ...

  5. 03-python-装饰器

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...

  6. github优秀前端项目分享(转)

    http://microjs.com/# 该网站的资源都托管到了github,microjs.com是一个可以让你选择微型的js类库的网站,该网站里的js库都是压缩后不大于5KB的,非常实用 http ...

  7. Python全栈开发-Day11-RabbitMQ/Redis

    本节内容 RabbitMQ——消息队列 Memcached & Redis使用 1.RabbitMQ——消息队列 RabbitMQ与Queue的关系 1.做的事情是一样的,两者都是队列. 2. ...

  8. SVN-版本控制工具安装与使用

    什么是版本控制? 版本控制(Revision control)是一种软体工程技巧,籍以在开发的过程中,确保由不同人所编辑的同一档案都得到更新. 版本控制透过文档控制(documentation con ...

  9. 利用jenkins+git自动执行接口测试代码

    事前准备 部署好jenkins.申请一个码云账号.代码同步至码云 1.在码云上新建一个项目,并把代码同步上去 我设置成了私有项目 2.为项目添加部署公钥 因为是私有项目,所以需要添加一个部署公钥,不然 ...

  10. 确认OHS版本的方法

    还是 opatch lsinventory 好用 C:\Oracle\Middleware\ohs\OPatch>opatch lsinventory Oracle Interim Patch ...