-
2019-06-05 18:07:29
1.new的原理是什么?
看这里2.new创建对象和字面量创建本质上是一样的,字面量的方式比较简单,也不用调用构造函数,性能较好
3.自己模拟new的操作
先定义一个构造函数
function Person(type) { this.type = type; // return 10;//Primitive value returned from constructor will be lost when called with 'new' // return {age:20}; }
/** * mockNew(构造器,构造器参数) */ function mockNew(constructor, ...args){ let obj = {}; obj.__proto__ = constructor.prototype; let res = constructor.apply(obj,args); return res instanceof Object ? res : obj; }
以下两种方式创建对象都是阔以的
let p = new Person('哺乳类'); console.log(p);
let p = mockNew(Person,'学生'); console.log(p);
更多相关内容 -
解密:自己如何快速成功创建和建立百度百科之“APP词条”篇_创立创造创建的区别
2021-01-05 19:44:32这篇文档就是解密百度百科之“APP”创建的那些不为人知的问题,并且我将抛开各种繁琐的“大道理”和“无用的知识点”,通过简单直接的“核心秘密”让大家看完后很快就能轻松的创建各种类型的百度百科词条,从此以后... -
构造方法创造的字符串对象和直接赋值方式创建的字符串对象有什么区别?
2021-02-26 13:48:33构造方法创造的字符串对象和直接赋值方式创建的字符串对象有什么区别? 猜想:存放字符串的地址值不同,方便程度不同 结果:构造方法创建的字符串对象是在堆内存 直接赋值方式创建的对象是在方法区的常量代码
注意:当方法区内的常量池有该字符串,以后再使用也就是调用该方法区内的该字符串(实际上),构造方法创建的字符串对象和直接赋值方式创建的字符串对象本质上是调用方式的不同(所以地址值有区别)
package MyString; /* 构造方法创造的字符串对象和直接赋值方式创建的字符串对象有什么区别? 猜想:存放字符串的地址值不同,方便程度不同 结果:构造方法创建的字符串对象是在堆内存 直接赋值方式创建的对象是在方法区的常量池。 字符串的内容是存储在方法区的常量池内的,为了方便字符串的重复利用 扩充: == 比较符号两边的数值 基本数据类型:比较的是基本数据类型的值是否相同(true/false) 引用数据类型:比较的是引用数据类型的地址值是否相同(true/false) */ public class StringDemo2 { public static void main(String[] args) { String s5="hello"; //构造方法创造的字符串对象 String s1=new String("hello"); //直接赋值方式创建的字符串对象 String s2="hello"; //先看输出值 System.out.println("s1:"+s1); System.out.println("s2:"+s2); String s3="hello"; String s4=new String("hello"); System.out.println("s1==s2? "+(s1==s2));//false System.out.println("s1==s3? "+(s1==s4));//false System.out.println("s2==s4? "+(s2==s3));//true System.out.println("s5==s1? "+(s5==s1));//false System.out.println("s5==s2? "+(s5==s2));//true System.out.println("s5==s3? "+(s5==s3));//true //其中如果构造方法创建的字符串对象在直接赋值后,则直接赋值会在常量池开辟一个新内存存放该字符串 //往后再有直接赋值与该字符串相同的数据,则栈内存方法直接指向该方法区的常量池内的该字符串地址 //而构造方法由于在堆内存开辟了新的空间,所以需要二次(多次)寻址才能调用该常量池内的字符串 //由此来看,除去第一次开辟后,常量池内有该字符串,字符串的利用还是直接赋值创建对象更加方便省事 } }
图示
-
线程创建的三种方式及区别
2021-07-13 11:12:30创建方式 1. 继承Thread类 定义Thread类的子类,并重写该类的run方法。 创建Thread子类的实例,即创建了线程对象。 调用线程对象的start()方法来启动线程。 package Thread; /* 1.继承Thread类 2.重写run()...文章目录
一. 创建方式
1. 继承Thread类
- 定义Thread类的子类,并重写该类的run方法。
- 创建Thread子类的实例,即创建了线程对象。
- 调用线程对象的start()方法来启动线程。
package Thread; /* 1.继承Thread类 2.重写run()方法 3.调用start()方法开启线程 */ public class TestThread extends Thread { @Override public void run() { //重写run()方法 for (int i = 0; i < 10; i++) { System.out.println("小明在厨房做饭"); } } public static void main(String[] args) { //创建Thread子类的实例 TestThread testThread = new TestThread(); //调用start()方法开启线程 testThread.start(); for (int i = 0; i < 200; i++) { System.out.println("小红在客厅打王者"); } } }
当多线程没有开启时,代码只执行主线程里面main()方法的代码,当开启线程后,经过cpu调度后开始执行(线程开启后不一定立即执行)
运行结果:
2. 实现Runnable接口
- 实现Runnable接口,并重写该接口的run()方法。
- 创建Runnable实现类的实例,并用该实例作为Thread的target来创建Thread对象,Thread对象才是真正的线程对象。
- 调用线程对象的start()方法来启动线程。
package Thread; /* 1.实现Runnable接口 2.重写run()方法 3.创建Runnable接口实现类实例,并将该实例放入Thread的target来创建Thread对象 4.调用start()方法开启线程 */ public class TestRunnable implements Runnable { @Override public void run() { //重写run()方法 for (int i = 0; i < 10; i++) { System.out.println("小明在厨房做饭"); } } public static void main(String[] args) { //创建Runnable接口实现类实例 TestRunnable testRunnable = new TestRunnable(); //该实例放入Thread的target来创建Thread对象 //调用start()方法开启线程 // Thread thread = new Thread(testRunnable); // thread.start(); new Thread(testRunnable).start(); for (int i = 0; i < 200; i++) { System.out.println("小红在客厅打王者"); } } }
执行结果:
3. 实现Callable接口
- 实现Callable接口并指定返回值,然后实现call()方法。
- 创建Callable实现类的实例,使用FutureTask包装类来包装Callable对象。
- 使用FutureTask对象作为Thread对象的target创建并启动新线程。
- 调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
package Thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; /* 1.实现Callable接口。 2.重写call()方法。 3.创建Callable接口实现类实例,使用FutureTask包装类来包装Callable实例对象。 4.使用FutureTask对象作为Thread的target来创建Thread对象。 5.调用start()方法开启线程。 6.调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。 */ public class TestCallable implements Callable<Boolean> { @Override public Boolean call() throws Exception { //重写call()方法 for (int i = 0; i < 10; i++) { System.out.println("小明在厨房做饭"); } return true; } public static void main(String[] args) throws ExecutionException, InterruptedException { //创建Callable接口实现类实例 TestCallable testCallable = new TestCallable(); //使用FutureTask包装类来包装Callable实例对象 FutureTask<Boolean> task = new FutureTask<>(testCallable); //使用FutureTask对象作为Thread的target来创建Thread对象 //调用start()方法开启线程 new Thread(task).start(); for (int i = 0; i < 200; i++) { System.out.println("小红在客厅打王者"); } //调用FutureTask对象的get()方法来获得子线程执行结束后的返回值 System.out.println(task.get()); //获取call()的返回值。若调用时call()方法未返回,则会阻塞线程等待返回值 } }
执行结果:
二. 创建线程三种方式的优缺点
1. 继承Thread类
-
优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this即可。
-
缺点:java是单继承的,故无法再继承其他类。
2. 实现Runnable接口
-
优点:线程类只是实现了Runnable接口,还可以继承其他类。这种情况下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将cpu代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
-
缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
3. Runnable和Callable的区别
-
Runnable规定的方法是run(),Callable规定的是call()。
-
Runnable的任务执行后无返回值,Callable的任务执行后有返回值。
-
call()方法可以抛出异常,run()方法不可以,因为run()方法本身没有抛出异常,所以自定义的线程类在重写run()方法的时候也无法抛出异常。
-
运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消人物的执行,还可获取执行结果。
4. start()和run()的区别
-
start()方法用来,开启线程,但是线程开启后并没有立即执行,他需要获取cpu的执行权才可以执行。
-
run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)。
任务执行情况,可取消人物的执行,还可获取执行结果。
4. start()和run()的区别
-
start()方法用来,开启线程,但是线程开启后并没有立即执行,他需要获取cpu的执行权才可以执行。
-
run()方法是由jvm创建完本地操作系统级线程后回调的方法,不可以手动调用(否则就是普通方法)。
-
创建和使用类
2021-01-29 12:34:31## Python类和对象Python是一种面向对象的编程语言。Python中的几乎所有东西都是具有其属性和方法的对象。类就像对象的构造函数,或者是创建对象的“蓝图”。*****## 创建类要创建一个类,请使用关键字`class`。示例...## Python类和对象
Python是一种面向对象的编程语言。Python中的几乎所有东西都是具有其属性和方法的对象。类就像对象的构造函数,或者是创建对象的“蓝图”。
*****
## 创建类
要创建一个类,请使用关键字`class`。
示例,创建一个名为MyClass的类,并带有一个名为x的属性:
```
class MyClass:
x = 5
```
*****
## 创建对象
现在我们可以使用名为MyClass的类来创建对象。
示例,创建一个名为p1的对象,并打印x的值:
```
p1 = MyClass()
print(p1.x)
```
*****
## \_\_init \_\_()函数
上面的示例是类和对象的最简单形式,在实际应用中并没有真正的用处。要了解类的含义,我们必须了解内置的\_\_init \_\_()函数。所有类都有一个名为\_\_init \_\_()的函数,该函数始终在启动类时执行。使用\_\_init \_\_()函数为对象属性或创建对象时必须执行的其他操作分配值。
示例,创建一个名为Person的类,使用\_\_init \_\_()函数为名称和年龄分配值:
```
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("John", 36)
print(p1.name)
print(p1.age)
```
注意:每次使用该类创建新对象时,都会自动调用该`__init__()`函数。
*****
## 对象方法
对象也可以包含方法。对象中的方法是属于该对象的函数。
示例,让我们在Person类中创建一个方法,插入一个打印问候语的函数,并在p1对象上执行它:
```
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def myfunc(self):
print("Hello my name is " + self.name)
p1 = Person("John", 36)
p1.myfunc()
```
注:该`self`参数是对类的当前实例的引用,并用于属于类访问的变量。
*****
## self参数
该`self`参数是对该类当前实例的引用,用于访问属于该类的变量。它不必命名`self`,可以随意命名,但必须是该类中任何函数的第一个参数。
示例,使用单词*mysillyobject*和*abc*代替*self*:
```
class Person:
def __init__(mysillyobject, name, age):
mysillyobject.name = name
mysillyobject.age = age
def myfunc(abc):
print("Hello my name is " + abc.name)
p1 = Person("John", 36)
p1.myfunc()
```
*****
## 修改对象属性
您可以像这样修改对象的属性,示例,将p1的年龄设置为40:
```
p1.age = 40
```
*****
## 删除对象属性
您可以使用`del`关键字删除对象的属性,示例,从p1对象中删除age属性:
```
del p1.age
```
*****
## 删除对象
您可以使用`del`关键字删除对象,示例,删除p1对象:
```
del p1
```
*****
## pass 语句
`class`定义不能为空,但是如果由于某种原因而有一个`class`不包含任何内容的定义,请放入`pass`语句中,以避免出错。
```
class Person:
pass
```
## 创建和使用类
使用类几乎可以模拟任何东西。比如编写一个表示小狗的简单类Dog,它表示的不是特定的小狗,而是任何小狗。对于大多数宠物狗,它们都有名字和年龄,另外大多数小狗还会蹲下和打滚。
由于大多数小狗都具备上述两项信息(名字和年龄)和两种行为(蹲下和打滚),我们的Dog类将包含它们。这个类让Python知道如何创建表示小狗的对象。编写这个类后,我们将使用它来创建表示特定小狗的实例。
## 创建 Dog 类
根据Dog类创建的每个实例都将存储名字和年龄。我们赋予了每条小狗蹲下(sit())和打滚(roll\_over())的能力:
```
class Dog():
def __init__(self, name, age):
"""初始化属性name和age"""
self.name = name
self.age = age
def sit(self):
"""模拟小狗被命令时蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模拟小狗被命令时打滚"""
print(self.name.title() + " rolled over!")
```
在class 处,我们定义了一个名为Dog的类。根据约定,在Python中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。然后我们编写了一个文档字符串,对这个类的功能作了描述。
类中的函数称为方法;你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别是调用方法的方式。方法\_\_init\_\_()是一个特殊的方法,每当你根据Dog类创建新实例时, Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突。
我们将方法\_\_init\_\_()定义成了包含三个形参: self、 name和age。在这个方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个\_\_init\_\_()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
我们创建Dog实例时, Python将调用Dog类的方法\_\_init\_\_()。我们将通过实参向Dog()传递名字和年龄; self会自动传递,因此我们不需要传递它。每当我们根据Dog类创建实例时,都只需给最后两个形参( name和age)提供值。
之后定义的两个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实例来访问这些变量。 [](http://self.name)[self.name](http://self.name) = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例。 self.age = age的作用与此类似。像这样可通过实例访问的变量称为属性。
Dog类还定义了另外两个方法: sit()和roll\_over()。由于这些方法不需要额外的信息,如名字或年龄,因此它们只有一个形参self。我们后面将创建的实例能够访问这些方法,换句话说,它们都会蹲下和打滚。当前, sit()和roll\_over()所做的有限,它们只是打印一条消息,指出小狗正蹲下或打滚。但可以扩展这些方法以模拟实际情况:如果这个类包含在一个计算机游戏中,这些方法将包含创建小狗蹲下和打滚动画效果的代码。如果这个类是用于控制机器狗的,这些方法将引导机器狗做出蹲下和打滚的动作。
-
c++类创建对象带括号和不带括号的区别
2021-08-05 14:34:43因此对于有定义构造函数的类,对象的创建会调用相应的构造函数,类成员变量是否被初始化取决于自己编写的构造函数是否对成员变量进行初始化。//被编译器认为是返回值为cat对象的c2()函数声明,因此没有实际对象的... -
Spring的单例bean与原型bean的区别和创建过程
2020-09-11 01:24:20实际上,Spring最基本的scope只有两种,即singleton和prototype。 可以参看spring源码中的BeanDefinition.java的定义,只有这两种: String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String ... -
Python中矩阵创建和矩阵运算方法
2020-11-24 05:37:44a1=array([1,2,3])a2=mat(a1)矩阵与方块列表的区别如下:2、data2=mat(ones((2,4)))创建一个2*4的1矩阵,默认是浮点型的数据,如果需要时int类型,可以使用dtype=int3、data5=mat(random.randint(2,8,size=(2,5))... -
在消费者共享和内容共同创建的情况下提供数字文化产品的策略-研究论文
2021-05-20 13:55:13随着消费者(1)越来越多地交换有关产品和提供者的信息(从而减少信息不对称性),以及(2)通过贡献用户的参与,越来越多地参与文化产品的创造,在线社区和社交网络中隐式的消费者合作的新形式会影响需求偏好。... -
JS创建类和对象
2018-07-08 17:31:34JavaScript 创建类/对象的几种方式在JS中,创建对象(Create Object)并不完全是我们时常说的创建类对象,JS中的对象强调的是一种复合类型,JS中创建对象及对对象的访问是极其灵活的。JS对象是一种复合类型,它允许... -
MySQL创建表和约束条件(四)
2019-11-15 14:09:16古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。 上一章简单介绍了 MySQL的数据类型(三),如果没有看过,请观看上一章 ...在创建表时,一定要在 database 里面进行创建, 既先使用 use 数据库名来选择... -
jQuery创建元素节点
2021-12-28 09:54:47在 jQuery 中,我们可以采用字符串的形式来创建一个元素节点,再通过 append( )、before( ) 等方法把这个字符串插入到现有的元素节点中。 语法: /方式1 var str = "字符串"; $().append(str); //方式2 $().append... -
new创建类对象与直接定义的区别
2016-11-11 14:03:40多处使用new创建类对象使用完需delete销毁new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间new对象指针用途广泛,比如作为函数返回值、函数参数等频繁调用场合并不适合new,就像new申请和释放内存... -
java创建对象的五种方式
2021-12-14 13:14:52创建对象的五种方式,new,Class.newInstance(),Constructor.Instance(),clone(),反序列化 -
数组创建的5种方式
2021-09-02 14:47:42数组创建的5种方式 一维数组的声明方式 语法结构 数据类型[] 数组名称 = new 数据类型[数组的长度];(动态方式) ...以上两种方式从结果上来说是一样的,第二种声明方式和变量的声明区分,进而提高代 -
详解Java的对象创建
2021-02-26 12:03:30》和《面向对象再探究》两篇文章中,都介绍了关于面向对象程序设计的概念和特点。其中也涉及到了许多代码,比如:Dog dog = new Dog();这篇文章就主要来谈谈创建对象时的具体操作。2. 引入例子下面是一个Dog类:/***... -
虚拟现实 虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生
2021-06-15 01:29:25虚拟现实虚拟现实技术是一种可以创建和体验虚拟世界的计算机仿真系统它利用计算机生成一种模拟环境是一种多源信息融合的交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中。中文名虚拟现实,灵境技术... -
Python创建空列表的字典2种方法详解
2021-03-05 23:01:04如果要在 Python 中创建键值是空列表的字典,有多种方法,但是各种方法之间是否由区别?需要作实验验证,并且分析产生的原因。本文针对两种方法做了实验和分析。如果要在 Python 中创建一个键值都是列表的字典,类似... -
[转载]Python中矩阵创建和矩阵运算
2019-05-17 21:45:53Python中矩阵创建和矩阵运算 原文链接:https://blog.csdn.net/qian_fighting/article/details/79080711 矩阵创建和矩阵运算 矩阵创建 1、from numpyimport *; a1=array([1,2,... -
Python创建目录文件夹
2020-08-06 14:21:49Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建。 主要涉及到三个函数 1、os.path.exists(path)判断一个目录是否存在 2、os.makedirs(path)多层创建目录 3、os.mkdir... -
JS创建对象的几种方法
2018-07-29 17:41:16自己认为目前能较好理解的创建对象方法,可能在某些方面不是最优的方法 // 1. 创建使用函数创建(工厂模式) function Person(age,name){ this.age = age || void 0; //void 0 相当于 undefined ,,自己设置好... -
IDEA 创建工作空间 (空项目) 项目组
2022-02-11 10:57:49简单记录下 IDEA 创建一个空的 Project...3、填好项目名称和项目创建在哪,点击 FINISH 4、接着创建在工作空间中的项目 5、 根据自己的需要填好 Module 的创建信息后在 Modules 的列表处就能看到我们创建的项目了 -
Python中创建二维数组
2020-11-30 11:14:26Python中创建二维数组二维数组二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。二维数组又称为矩阵,行列数相等的矩阵称为方阵。对称矩阵a[i][j] = a[j]... -
Python | 创建一个文件夹
2022-02-28 15:21:23Python对文件的操作还算是方便的,只需要包含os模块进来,使用相关函数即可实现目录的创建。 主要涉及到三个函数 1、os.path.exists(path)判断一个目录是否存在 2、os.makedirs(path)多层创建目录 3、os.mkdir... -
Java创建数组的方法
2020-12-18 08:14:36Java创建数组的方法大致有三种 说明:这里以int为数据类型,以arr为数组名来演示 一、声明并赋值 int[] arr = {1,2,4, …}; 注意这里的花括号不是语句块,而且而且花括号后的分号也不能省,…不是元素意思是可以... -
五、创建模式----创造者模式
2018-12-06 14:48:40工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。... -
人工智能真的具有创造力?
2018-11-25 23:32:03作为科学家,他最引以为傲的就是利用自己的直觉和创造力去解决我们人世间还尚未解决的问题。但是AlphaGo的表现似乎是展现了人工智能的“创造力”,尤其是作者提到的距离棋盘边5行的下法,更是颠覆了人类在围棋上的... -
如何创建一个类
2020-07-04 22:53:49如何创建一个类 类。是一些列对象特征的抽象。...成员变量和成员对象 例如:int age,char name,double money等的定义。 成员例如代码示意中的haha类定义的h对象。 构造函数 构造函数的功能主要用于创建一个对象。不 -
TypeScript反射机制动态创建类
2021-10-20 16:13:51在前一篇文章桥接模式与策略模式的区别与刘伟老师的桥接模式中,我们可以明白桥接模式处理得比较好的一个点是在于Java的反射机制。 那么,假如我们需要再TypeScript中,来实现桥接模式的处理,需要怎么样来实现这个... -
创建基于绩效的部门文化.doc
2022-06-04 13:49:01创建基于绩效的部门文化.doc