初次见面请多关照

=====================================================

包名.类名

写法区别:
在程序中这样写比较麻烦
java.io.InputStream is = java.lang.System.in;
java.io.InputStreamReader isr= new java.io.InputStreamReader(is);

java.io.BufferedReader br = new java.io.BufferedReader(isr);

import就是在java文件开头的地方
首先,在程序开头写:
import java.lang.System;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.BufferedReader;

于是我们就可以在程序中这样写到:

InputStream = System.in;

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

=====================================================

一.
import导入声明:导入声明仅导入声明目录下面的类,而不导入子包。
1.导入类或接口的简名具有 编译单元作用域。
2.不允许定义独立的函数和常量,属性和方法的使用必须依附于某个东西,例如使用类或接口做为挂靠单位。

二.
Java类的搜索路径
import p1.Test; 该语句表明要导入p1包中的Test类。
导入相应的类,也就是加载.class文件的过程。

三.
Eclipse之java build path配置

======================================================

在标签的内部的标签下的

和两句声明。

用于把该Activity作为本程序的主活动,即点击应用图标后首先打开的activity

若应用程序中没有声明任何一个活动作为主活动,该仍可正常安装的,只是无法在启动器中看到或者打开这个程序。
一般都是作为第三方服务供其他的应用在内部进行调用的,如支付宝快捷支付服务。

intent 意图
category 类别
action 动作

intent 是一个类

category 和 action 是intent的属性

======================================================
实现android的Activity之间相互跳转需要用到Intent,

Intent又分为显式Intent和隐式Intent,

显式Intent很简单,比如我在FirstActivity中想跳转到SecondActivity,只需要直接声明就行了:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);

而在使用隐式Intent实现Activity之间跳转的时候,并没有明确指定要打开哪个activity,

而是通过指定3个参数:action,category,data,

然后让系统去寻找能够匹配得上这三个参数的Acativity,
如果有多个符合条件的Activity,就会让用户选择其中一个打开。

======================================================
java

1.标识符
2.关键字
3.数据类型
4.运算符
5.数组
6.流程控制语句

JDK JRE JavaEE JavaSE JavaME
配置环境变量:让java jdk\bin目录下的工具,可以在任意目录下运行,原因是,将该工具所在目录告诉了系统,当使用该工具时,由系统帮我们去找指定的目录。
javac命令和java命令:一个是编译生成class文件,一个是运行,启动jvm.加载运行时所需的类库,并对class文件进行执行。

一个文件要被执行,必须要有一个执行的起始点,这个起始点就是main函数.

9.常量
10.变量:其实就是内存中的一个存储空间
11.语句:If switch do while while for
12.函数
13.主函数
14.java分了5片内存 1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

15.面向对象: 1:成员变量 2:成员函数
总结:开发时,记住,属性是用于存储数据的,直接被访问,容易出现安全隐患,所以,类中的属性通常被私有化,并对外提供公共的访问方法。

这个方法一般有两个,规范写法:对于属性 xxx,可以使用setXXX(),getXXX()对其进行操作。

16.类中怎么没有定义主函数呢?

注意:主函数的存在,仅为该类是否需要独立运行,如果不需要,主函数是不用定义的。
主函数的解释:保证所在类的独立运行,是程序的入口,被jvm调用。

构造代码块和构造函数有什么区别?

构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块,只要对象一建立,就会调用这个代码块。

构造函数:是给与之对应的对象进行初始化,它具有针对性。


“Person p = new Person();”

创建一个对象都在内存中做了什么事情?

1:先将硬盘上指定位置的Person.class文件加载进内存。

2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。

3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new

4:在该实体空间中进行属性的空间分配,并进行了默认初始化。

5:对空间中的属性进行显示初始化。

6:进行实体的构造代码块初始化。

7:调用该实体对应的构造函数,进行构造函数初始化。()

8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)


1.1 静态:

当加载一个类时,JVM会根据属性的数据类型第一时间赋默认值(一举生成的)。 000000000000000
然后再进行静态属性初始化,并为静态属性分配内存空间,静态方法的声明,静态块的加载,没有优先级之分,按出现顺序执行,静态部分仅仅加载一次。至此为止,必要的类都已经加载完毕,对象就可以被创建了。

1.2 普通:

当new一个对象时,此时会调用构造方法,但是在调用构造方法之前,(此刻1.1已经完成,除非被打断而暂停)执行动态属性定义并设置默认值(一举生成的)。
然后动态属性初始化,分配内存,构造块,普通方法声明(只是加载,它不需要初始化,只有调用它时才分配内存,当方法执行完毕后内存立即释放),没有优先级之分,按出现顺序执行。最后进行构造方法中赋值。
当再次创建一个对象,不再执行静态部分,仅仅重复执行普通部分。

注意:如果存在继承关系,创建对象时,依然会首先进行动态属性进行定义并设默认值,然后父类的构造器才会被调用,其他一切都是先父类再子类(因为子类的static初始化可能会依赖于父类成员能否被正确初始化),如果父类还有父类,依次类推,不管你是否打算产生一个该父类的对象,这都是自然发生的。


18.封 装
This
static

成员变量和静态变量的区别:

1,成员变量所属于对象,所以也称为实例变量。

静态变量所属于类,所以也称为类变量。

2,成员变量存在于堆内存中。

静态变量存在于方法区中。

3,成员变量随着对象创建而存在,随着对象被回收而消失。

静态变量随着类的加载而存在,随着类的消失而消失。

4,成员变量只能被对象所调用。

静态变量可以被对象调用,也可以被类名调用。

所以,成员变量可以称为对象的特有数据,静态变量称为对象的共享数据。

静态的注意:静态的生命周期很长。

静态代码块:就是一个有静态关键字标示的一个代码块区域,定义在类中。

作用:可以完成类的初始化,静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。

-===========================================================================================================

java中有23种设计模式:

单例设计模式:★★★★★

解决的问题:保证一个类在内存中的对象唯一性。

比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。

Runtime()方法就是单例设计模式进行设计的。

如何保证对象唯一性呢?

思想:

1,不让其他程序创建该类对象。

2,在本类中创建一个本类对象。

3,对外提供方法,让其他程序获取这个对象。

步骤:

1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;

2,就在类中创建一个本类的对象;

3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)

代码体现:

1,私有化构造函数;

2,创建私有并静态的本类对象;

3,定义公有并静态的方法,返回该对象。


在C++中:
c++编程,自身类的对象不可以作为该类的成员,自身类的指针或引用却可以。


//饿汉式

class Single{

private Single(){} //私有化构造函数。

private static Single s = new Single(); //创建私有并静态的本类对象。

public static Single getInstance(){ //定义公有并静态的方法,返回该对象。

    return s;

}

}


//懒汉式:延迟加载方式。

class Single2{

private Single2(){}

private static Single2 s = null;

public static Single2 getInstance(){

    if(s==null)

        s = new Single2();

    return s;

}

}


继 承(面向对象特征之一)

好处:

1:提高了代码的复用性。

2:让类与类之间产生了关系,提供了另一个特征多态的前提。

父类的由来:其实是由多个类不断向上抽取共性内容而来的。

java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。

单继承:一个类只能有一个父类。

多继承:一个类可以有多个父类。

为什么不支持多继承呢?

因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。

但是java支持多重继承。A继承B B继承C C继承D。

多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。

所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。那么想要使用一个体系时,需要建立对象。建议建立最子类对象,因为最子类不仅可以使用父类中的功能。还可以使用子类特有的一些功能。

简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。

子父类出现后,类中的成员都有了哪些特点:

1:成员变量。

 当子父类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。

 如果想要调用父类中的属性值,需要使用一个关键字:super

 This:代表是本类类型的对象引用。

 Super:代表是子类所属的父类中的内存空间引用。

 注意:子父类中通常是不会出现同名成员变量的,因为父类中只要定义了,子类就不用在定义了,直接继承过来用就可以了。

2:成员函数。

当子父类中出现了一模一样的方法时,建立子类对象会运行子类中的方法。好像父类中的方法被覆盖掉一样。所以这种情况,是函数的另一个特性:覆盖(复写,重写)

什么时候使用覆盖呢?当一个类的功能内容需要修改时,可以通过覆盖来实现。

3:构造函数。

发现子类构造函数运行时,先运行了父类的构造函数。为什么呢?

原因:子类的所有构造函数中的第一行,其实都有一条隐身的语句super();

super(): 表示父类的构造函数,并会调用于参数相对应的父类中的构造函数。而super():是在调用父类中空参数的构造函数。

为什么子类对象初始化时,都需要调用父类中的函数?(为什么要在子类构造函数的第一行加入这个super()?)

因为子类继承父类,会继承到父类中的数据,所以必须要看父类是如何对自己的数据进行初始化的。所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程。

注意:子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();

如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数。

如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数。

问题:super()和this()是否可以同时出现的构造函数中。

两个语句只能有一个定义在第一行,所以只能出现其中一个。

super()或者this():为什么一定要定义在第一行?

因为super()或者this()都是调用构造函数,构造函数用于初始化,所以初始化的动作要先完成。

继承的细节:

什么时候使用继承呢?

当类与类之间存在着所属关系时,才具备了继承的前提。a是b中的一种。a继承b。狼是犬科中的一种。

英文书中,所属关系:" is a "

注意:不要仅仅为了获取其他类中的已有成员进行继承。

所以判断所属关系,可以简单看,如果继承后,被继承的类中的功能,都可以被该子类所具备,那么继承成立。如果不是,不可以继承。

细节二:

在方法覆盖时,注意两点:

1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则,编译失败。

2:覆盖时,要么都静态,要么都不静态。 (静态只能覆盖静态,或者被静态覆盖)

继承的一个弊端:打破了封装性。对于一些类,或者类中功能,是需要被继承,或者复写的。

这时如何解决问题呢?介绍一个关键字,final:最终。

final特点:

1:这个关键字是一个修饰符,可以修饰类,方法,变量。

2:被final修饰的类是一个最终类,不可以被继承。

3:被final修饰的方法是一个最终方法,不可以被覆盖。

4:被final修饰的变量是一个常量,只能赋值一次。

其实这样的原因的就是给一些固定的数据起个阅读性较强的名称。

不加final修饰不是也可以使用吗?那么这个值是一个变量,是可以更改的。加了final,程序更为严谨。常量名称定义时,有规范,所有字母都大写,如果由多个单词组成,中间用 _ 连接。

抽象类: abstract

抽象:不具体,看不明白。抽象类表象体现。

在不断抽取过程中,将共性内容中的方法声明抽取,但是方法不一样,没有抽取,这时抽取到的方法,并不具体,需要被指定关键字abstract所标示,声明为抽象方法。

抽象方法所在类一定要标示为抽象类,也就是说该类需要被abstract关键字所修饰。

抽象类的特点:

1:抽象方法只能定义在抽象类中,抽象类和抽象方法必须由abstract关键字修饰(可以描述类和方法,不可以描述变量)。

2:抽象方法只定义方法声明,并不定义方法实现。

3:抽象类不可以被创建对象(实例化)。

4:只有通过子类继承抽象类并覆盖了抽象类中的所有抽象方法后,该子类才可以实例化。否则,该子类还是一个抽象类。

抽象类的细节:

1:抽象类中是否有构造函数?有,用于给子类对象进行初始化。

2:抽象类中是否可以定义非抽象方法?

可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象函数。而且比一般类少了一个创建对象的部分。

3:抽象关键字abstract和哪些不可以共存?final , private , static

4:抽象类中可不可以不定义抽象方法?可以。抽象方法目的仅仅为了不让该类创建对象。


模板方法设计模式:

解决的问题:当功能内部一部分实现时确定,一部分实现是不确定的。这时可以把不确定的部分暴露出去,让子类去实现。

abstract class GetTime{

public final void getTime(){ //此功能如果不需要复写,可加final限定

    long start = System.currentTimeMillis();

    code(); //不确定的功能部分,提取出来,通过抽象方法实现

    long end = System.currentTimeMillis();

    System.out.println("毫秒是:"+(end-start));

}

public abstract void code(); //抽象不确定的功能,让子类复写实现

}

class SubDemo extends GetTime{

public void code(){ //子类复写功能方法

    for(int y=0; y<1000; y++){

        System.out.println("y");

    }

}

}

=======================================================================================

javascript基础部分"数组, 函数, 作用域, 对象, 标准库"

数组的声明(2种):;

a,自变量声明 var a = [‘a’,‘b’];

b,内置构造函数声明 var b = new Array();

循环数组:

1,for循环

2.for in循环

3.Array.forEach()循环

=====================================
匿名函数和自调用函数

自调用匿名函数,可以封装作用域.
//自调用匿名函数
(function (){
console.log(1);
})();

将函数作为返回值来使用 ( 闭包 ) //注: 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,有的时候,在退出函数之前,将不使用的局部变量全部删除。
function f1(){
var h = function(){
console.log(‘11111’);
}
//将函数作为返回值来使用
return h;
}
var k = f1();

k(); //11111

把函数当做值传递回去( 回调函数 )

function f1(k){
    k();
}
function f2(){
    console.log(222);
}
//将函数当做实参进行传递
f1(f2);         //222

=====================================

变量提升

定义变量的时候, 变量的声明会被提升到作用域的最上面, 变量的赋值不会提升.

函数提升

js解析器首先会把当前作用域的函数声明提前到整个作用域的最前面

=====================================
对对象进行循环

//for......in
var obj = {
    n1:'刘能',
    n2:'刘英',
    n3:'刘明',
};

for(var k in obj){
    // console.log(k);      //n1,n2,n3
    console.log(obj[k]);    //刘能,刘英,刘明
}

=====================================

标准库对象;

====================================

other:

JniHeper
“([Ljava/lang/String;)V” 对函数返回值和参数的编码。这种编码叫做JNI字段描述符

JNI方法描述符,主要就是在括号里放置参数,在括号后面放置返回类型,如下:

   (参数描述符)返回类型

调用有参数的java函数时,需要把对应的参数传递进去。需要把参数按顺序加入到classid、methodid后面,并且需要做类型转换。
参数类型转换关系

====================================

oc

m是OC源文件扩展名,入口点也是main函数,第一个OC程序:
1.预处理指令import会自动检验头文件有没有被包含过,防止重复包含
2.NSLOG是日志输出,OC字符串以@开头,自动换行 NSLog(@“Hello, World!”);
3.OC所有关键字以@开头
4.OC中的类分两个文件,.h用来声明类的变量和函数
.m文件负责实现,与.h配合使用。

5.声明类以@interface开头,以@end结尾
6.实现类用@implementation开头,以@end结尾
7.OC是单继承的。声明类以@interface开头
8.OC当中使用一个类时,导包就是#import一个类的头文件。

9.声明类时,成员变量要声明在大括号中,方法声明在大括号外,如果是对象方法要写-号,静态方法要写+号,所有在.h文件当中声明的方法都是公共方法,凡是类型,都要写括号,在方法名后,一个参数要一个括号,如

//Student.h

#import <Foundation/Foundation.h>

@interface Student : NSObject {

int age;

}

-(int)getAge;

-(void)setAge:(int)age;

@end

实现类时,首先要导入.h的声明.

//Student.m

#import “Student.h”

@implementation Student

  • (int)getAge {

    return age;

}

  • (void)setAge:(int)newAge {

    age = newAge;

}

@end

对象的创建需要调用类的静态方法alloc分配内存,调用静态方法要写[],里面是类名和方法名,返回值需要用指针来接收,
也就是说OC中的对象都要写个*,比如这句话调用了Student的一个静态方法alloc分配内存,并返回了一个指针来接收,其实alloc方法返回的是id类型,可以暂时理解为任何类型:

Student *stu = [Student alloc];

分配内存后要调用一个动态方法进行初始化,相当于stu指针给Student发送了一个init消息:

stu = [stu init];

12.也就是说定义一个变量需要两句话,但是很麻烦,所以可以连起来写,这种方法最常用:

Student *stu = [[Student alloc] init];

13.OC不支持垃圾回收,需要用后释放:

[stu release];

14.调用方法不用括号:

[stu setAge:100];

@autoreleasepool与内存管理有关。

整个调用代码:

#import <Foundation/Foundation.h>

#import “Student.h”

int main(int argc, const char * argv[])

{

@autoreleasepool {

    Student *stu = [[Student alloc] init];

    [stu setAge:100];

    int age = [stu getAge];

    NSLog(@"%i", age);

    [stu release];

}

return 0;

}

=================================================================
15.
方法名可以拆成多个部分

如果要定义有多个参数的方法可以:

  • (void)setAge:(int)newAge andNo:(int)newNo{

    age = newAge;

    no = newNo;

}

调用:

[stu setAge:100 andNo:1];

也就是说方法名可以拆成多个部分。

注意,这里的方法的方法名是setAge:andNo:,冒号也是方法名的一部分。

=================================================================
16.
注意OC当中构造函数并没有要求函数名和类名一样

可以让一个变量自动释放内存,需要多调用一个autorelease方法,比如:

Student *stu = [[[Student alloc] initWithAge:10 andNo:2] autorelease];

通常情况下,使用系统自带的一些静态方法创建的对象都是可以自动释放的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值