=====================================================
包名.类名
写法区别:
在程序中这样写比较麻烦
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文件当中声明的方法都是公共方法,凡是类型,都要写括号,在方法名后,一个参数要一个括号,如
#import <Foundation/Foundation.h>
@interface Student : NSObject {
int age;
}
-(int)getAge;
-(void)setAge:(int)age;
@end
实现类时,首先要导入.h的声明.
#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];
通常情况下,使用系统自带的一些静态方法创建的对象都是可以自动释放的。