M>>n结果为m/2的n次幂
算术运算符:
+-*/(两个整数相除结果仍为整数)
++后缀:
inti=a++;即i=a;a=a+1;
前缀:
inti=++a;即a=a+1;i=a;
面试点:
Chara=’a’;
Charb=13;
Charc=a+b;//报错a提升为int类型
Chard=’a’+13;//int自动转换为char。
通过键盘输入:
Scannert=newScanner(System.in);
Intm=t.nextInt();
循环语句
Switch语句:
计算出表达式的值,与每个case后的值比较,若相等,就执行相应的代码段,否则执行defult后的代码段。
Switch(表达式或值(只接收byteshortintchar){
case值1:
代码段1;
break;
case值2:
代码段2;
break;
case值3:
代码段3;
break;
default:
代码段4:
break;
}
Switch和if语句的应用场景:
判断的具体数值不多,符合byteshortintchar类型时用switch语句,效率高。
判断区间,结果为boolean类型的语句的判断等用if语句
If语句的使用更广泛。
if和switch的应用:
if:
1,对具体的值进行判断。
2,对区间判断。
3,对运算结果是boolean类型的表达式进行判断。
switch:
1,对具体的值进行判断。
2,值的个数通常是固定的。
对于几个固定的值判断,建议使用switch语句,因为switch语句会将具体的答案都加载进内存。
效率相对高一点。
Switchcase语句结束1,全部的case都执行完。
2.遇到break
Dowhile和while的区别:
Dowhile无论条件是否满足,循环体至少执行一次。
While先判断条件,后执行。
Dowhile先执行,后判断。
语句由;结束,所以dowhile中while的后边要加;号。
For循环
For(初始化表达式(只执行一次);布尔表达式;循环后的操作表达式){
循环体
}
While循环和for循环的区别:
(for和while完全可以互换)
若果循环语句的初始变量,只用来控制循环次数,则用for循环。
如果初始化变量想在后续的操作中使用则用while循环。
For循环中的初始变量作用域是for循环内部,循环执行开始,开辟内存,循环结束,立即销毁。
而while循环的初值还在内存中。
即变量有自己的作用域
无限循环的最简单表现形式:
for(;;){}
while(true){}
写循环语句时,要明确那些语句参与循环,那些不需要
System.out.println()换行
嵌套循环:
打印图形,外圈控制行数,内圈控制每一行元素的个数。
。
Break和continue
Break:
中断整个循环
Continue:
中断本个循环的本次执行,继续下一次循环
Continue和break语句单独存在时。
其后都不能再写任何语句。
面向对象
面向对象是一种思想,将功能封装进对象中,强调对象。
面向对象的三个特征:
封装、继承、多态。
以后开发:
找对象使用。
没有对象,就创建一个对象。
找对象,建对象,使用对象,维护对象之间的关系。
类和对象的关系:
类:
对现实生活中事物的抽象描述。
对象:
该类事物实际存在的个体。
类中包含:
成员变量、成员方法。
成员变量的调用:
对象.对象成员
成员变量:
堆内存中。
作用于整个类中
局部变量(localvariable):
栈内存中。
作用于方法或语句块中。
必须进行初始化。
匿名对象:
调用成员变量没有意义。
使用方式一:
当对象的方法只调用一次时,可以用匿名对象。
使用方式二:
可以将匿名对象作为实际参数进行传值。
newcar().get();
get(newcar());
compile:
编译
封装
定义:
隐藏对象的属性和实现细节,仅对外提供公共访问方式。
特点:
提高安全性;
提高复用性
通过权限修饰符将类的成员变量封装起来。
私有不是封装,仅仅是封装的一种体现
将age私有化后,类外的对象不能访问。
此时就需要在person类中提供age对应的访问方式。
即get和set方法。
对外提供访问方式,是因为可以在访问方式中加入判断语句,对访问的数据进行操作,提高代码的健壮性。
继承
如何使用继承体系中的功能:
先看父类体系的描述,因为父类中定义的是该体系的共性功能。
通过了解共性功能就知道该体系的基本功能。
在具体使用时要创建子类的对象。
1.可能父类不能创建对象
2.创建子类对象可以使用更多的功能,包括父类基本的功能和子类特有的功能。
总结:
查阅父类功能,创建子类对象使用功能。
若果子类中出现非私有的同名变量时,子类要访问本类中的同名变量时用this;
子类要访问父类中的同名变量时用super
通过继承,子类自动拥有父类所有的成员变量和成员方法
子类的引用可以访问继承的父类成员,父类的引用不能访问子类的独有成员
子类不能继承父类中用private修饰的成员
子类和父类不在同一个包时,不能继承父类中用private和默认的成员
子类实例化
1.子类所有构造方法默认访问父类无参构造方法。
而且这个过程是必须的。
父类会在其构造方法中对自己的属性进行赋值。
子类必须要继承这些变化。
2.子类构造方法中默认第一句是super();它用来调用父类中的无参构造方法。
若是父类中没有无参构造方法,则会报错,子类必须手动通过super()语句来指定要访问父类中的哪个构造函数。
3.若父类中没有定义无参构造方法,子类的构造方法就要用super表明要调用那个构造方法。
4.Super要写在构造函数的第一行,因为要先完成父类动作的初始化
5.Super和this都只能写在构造函数的第一行,所以他们不可能同时出现,
This存在时super不存在。
this调用本类的构造函数,但可以保证子类中肯定还有其它构造方法访问父类构造方法
&&&子类中至少有一个构造方法会访问子类的构造方法。
子类的构造方法
。
。
子类不能重写父类的构造方法,子类创建对象时,
先加载父类构造方法,在加载子类构造方法。
子类所有的构造方法第一行默认是super();语句。
如果父类中没有无参构造方法,子类构造方法需要手动的用super语句调用父类构造方法。
Object根类
Java代码执行顺序
创建对象时,先对成员变量进行默认初始化,然后再调用构造方法对父类变量初始化,然后子类自己的成员变量才能显示初始化
父类初始化完毕才能让子类自己的变量显现出来
方法
方法的定义:
修饰符返回值类型函数名(参数类型形参,参数类型形参){
执行语句;
Return返回值;
}
方法的特点:
1.定义方法可以将功能代码封装;
2.方法只有在调用时才会被执行,
3.提高了代码的复用性;
4.方法中只能调用方法,不能在方法内部定义方法。
5.无返回值时用void表示
定义方法需注意:
1.明确功能结果,即返回值
2.参数
构造方法:
在创建对象时调用
1.方法名和类名相同
2.无返回值
作用:
给成员变量赋值,对象的初始化
一个类中如果定义了构造方法,则默认的构造方法就没有了,否则一定存在一个默认的空参数构造方法。
构造方法和一般成员方法的区别:
1.创建对象时构造方法就已经被调用,对对象进行初始化。
而成员方法是在创建对象后需要该功能时专门调用
2.构造方法在创建对象时(一个对象),只被调用一次,成员方法在创建对象后可以调用多次
若是类中有了有参构造方法,系统不再自动生成无参构造方法。
则创建对象时需要传参,否则报错。
要想不传参,则需要再定义一个无参构造方法。
何时调用构造函数:
当某事物具备特性或者行为时
一个类中默认会有一个空参数构造方法,它的权限和所属类一致。
如果类被public修饰,则默认无参构造方法也被public修饰。
若类没有被public修饰,则默认的构造方法也没有被public修饰。
默认构造方法的权限是随着类的变化而变化的。
构造代码块:
格式:
{}
作用:
给对象进行初始化。
其中定义不同对象都具有的共性
创建对象时调用,优先于构造方法。
构造代码块和构造方法的区别:
构造代码块:
给所有对象统一进行初始化。
构造函数:
只给对应的对象初始化。
创建对象内存分析
1.主函数先执行,加载类文件
栈中:
mainp
2.执行类代码块,给类进行初始化
3.在堆内存中开辟空间创建对象分配内存地址
4.在堆内存中建立对象的特有属性,成员变量先默认初始化,初始化为该类型的0值。
5.成员变量显式初始化,
6.构造代码块初始化
7.调用构造方法初始化
8.将对象的内存地址赋值给栈内存中的引用变量p
方法放在方法区,调用方法是,方法暂时进入栈内存中,方法执行完后消失
方法的重写:
1.必须有继承
2.重写方法和被重写方法方法名相同,参数个数。
类型、顺序相同
3.返回类型协变或相同
注:
private修饰的方法不能被重写;
子类方法不能缩小父类方法的访问权限;
子类不能抛出比父类更多的异常;
非静态方法不能被静态方法重写;
静态方法不能被重写,但是静态变量和方法都可以被屏蔽。
方法的重载:
在同一个类中,方法的类名相同,参数,类型,个数,顺序至少有一个不同。
自己的想法:
在一个类中,成员变量先不赋值,系统分派内存先进行默认初始化。
然后通过构造方法对成员变量赋值。
创建对象时根据参数的类型,个数,顺序判断要调用哪个构造方法。
重载方法的调用:
根据参数的个数,类型、顺序不同来区分调用的是哪个方法。
方法的实参与形参类型相同或兼容、个数相同、顺序一致。
重写和重载的区别:
相同点:
方法名相同
不同点:
1.条件:
重写:
必须有继承,在子类中重写
重载:
在同一个类中
2.参数:
重写:
参数个数、类型、顺序相同
重载:
参数个数。
类型、顺序至少有一个不同
3.返回类型:
重写:
返回类型必须一致或协变
重载:
对返回类型无要求
4.次数:
父类的一个方法只能被一个子类重写一次
一个类中可以有一个方法的多个重载方法
5.权限和异常
重写:
对方法的访问权限不能缩小,对方法抛出的异常不能扩大
重载:
没有限制
局部变量和成员变量同名时。
屏蔽类中的成员变量。
子类中的成员变量和父类中的成员变量同名时,在子类范围内屏蔽父类的成员变量。
子类重写父类的方法后,子类范围内,屏蔽父类的成员方法。
子类某静态方法和父类方法同名时,子类范围内,屏蔽父类的方法。
This关键字:
This表示当前对象。
用在构造方法和成员方法中,只能放在第一行。
用于解决变量的命名冲突和不确定性问题。
1.当局部变量和成员变量同名时,局部变量屏蔽成员变量。
用this调用成员变量。
2.在构造方法中调用该类中的另一个构造方法,并传递要调用的构造方法所需的参数。
(java中,多个构造方法可能存在共同的代码)
例:
this();this(1,‘L’,48);
3.在一个成员方法内,访问当前实例的引用(作为方法的实参)
Print(this);不太明白
This的应用:
当定义类中功能时,该方法的内部用到调用该方法的对象,就用this来表示这个对象。
但凡功能内用到了本类对象,都用this表示。
Super关键字放在第一行的原因:
任何一个类在实例化时,必须先实例化父类
关于this关键字为何只能放在第一行?
自己的想法:
在构造方法中调用其它构造方法,本类中所有的构造方法中必须有一个会访问父类构造方法,然后又返回到了super上。
以下是老师解答:
假设说你在构造方法里面第一行没有写this()而是在第二行写的this()
那么第一行是不是自动的回去调用super?
然后第二行又去调用this(),那么调用的构造方法是不是还得再去调用super?
你必须在构造器的第一行放置super或者this构造方法,否则编译器会自动地放一个无参的super构造器的,其他的构造方法也可以调用super或者this,调用成一个递归的结构,最后的结果是父类的构造方法(可能有多级父类构造方法)始终在子类的构造器之前执行,递归的调用父类构造方法。
无法执行当前的类的构造器。
也就不能实例化任何对象,这个类就没作用了
static
Static:
关键字修饰成员变量和成员方法。
Static特点:
1.随着类的加载而加载,随着类的消失而消失,它的生命周期最长。
Stringname;成员变量实例变量随着对象的创建而存在,随着对象的消失而消失。
Staticcountry=“china”静态的成员变量类变量
2.静态变量优先于对象存在。
3.被satic修饰的内容不在堆内存中,类中所有对象共享。
4.可以直接用类名来调用。
成员变量和静态变量的区别:
1.存放位置:
类变量随着类的加载存在于方法区中
实例变量随着对象的建立而存在于堆内存中。
2.生命周期:
类变量生命周期最长,类的产生到消失
实例变量生命周期其次,对象的产生到消失。
Static使用注意事项:
1.静态方法只能访问静态成员(静态成员变量和静态成员方法)
非静态方法既可以访问静态也可以访问非静态(后来的可以访问先来的)
2.静态方法中不可以定义this,super关键字。
因为静态优先存在,所以静态方法中不可以出现this,super等代表对象的关键字。
3.主函数是静态的。
Static的优缺点:
优点:
对对象的共享数据进行单独存储,节约空间。
没必要每个对象中都存储一份。
可以直接被类名调用
缺点:
生命周期过长,访问出现局限性。
(静态虽好,只能访问静态)
Static使用的场景:
1.静态变量:
当对象中出现共享数据时,用static修饰。
对象中的特有数据定义成非静态。
2.静态方法:
当功能内部没有访问非静态数据(对象的特有数据),用static修饰
静态代码块:
Static{
}
特点:
随着类的加载而执行,只执行一次,并优先于主函数。
用于给类进行初始化。
用到了类中的内容时才会加载。
若定义过多的静态变量则太消耗内存。
对象消失后静态变量还在。
用static修饰的变量、常量、方法是定义在类中。
即这些成员是类相关的。
只属于某个类,被这个类的对象所共享。
(可以直接通过类名来调用,也可用对象来调用)而前面介绍的成员变量和成员方法是实例相关的。
(其使用必须要通过声明实例来完成)
静态变量只在类加载时初始化一次,初始化为该类型的零值;静态常量必须在定义时初始化,且只在类加载时初始化一次。
静态变量、静态常量不能定义在方法中。
静态方法中不能引用非静态成员变量、成员方法,(非静态可以调用静态的)
调用:
对象名.变量名对象名.方法名
类名.变量名类名.方法名
主函数
主函数的主要作用就是调用。
主函数:
是一个特殊的函数。
作为程序的入口,可以被jvm调用。
主函数的定义:
Public:
代表该函数的访问权限是最大的;
Static:
代表主函数随着类的加载已经存在了;
Void:
主函数没有具体的返回值;
Main:
不是关键字,但很特殊,可以被jvm识别;
(String【】args):
主函数的参数,参数是一个字符串类型的数组。
主函数是固定格式的,虚拟机识别。
Jvm在调用主函数时,传入的是长度为0的字符串类型数组,数组内没有元素。
Su