命名规则:
工程名:一般小写
Package名字:小写
类名:每个单词的首字母大写
属性和方法名:小驼峰 首个单词首字母小写,其余单词首字母大写
static final修饰的认为是常量:常量属性全大写
基本数据类型
数值型:
整型(整数 byte short int long)
浮点型(小数float double(默认))
字符型:char(单个字符,2字节)
布尔型:Boolean(true/false 经常用作开关)
引用数据类型(类、接口、数组)
char 型变量中能不能存贮一个中文汉字?#
可以,char占两个字节
运算符
逻辑与或与按位与或的区别:
逻辑与 false&&true false (有短路操作, 只能参与逻辑运算,不可以参与位运算)
按位与 false&true false (无短路操作, 可以参与位运算)
++i 先加后赋值
i++ 先赋值后加
+= x+=y;----- x=x+y;
逻辑运算符:
&& and
|| or
! not
位运算符:
& and
| 或
^ 异或
<< 左移 左移一位*2 左移2位 *22 左移n位 *2n
右移 右移一位/2 右移2位 /22 右移n位 /2n
用最有效率的方法算出 2 乘以 8 等於几?
2 << 3
因为将一个数左移 n 位,就相当于乘以了 2 的 n 次方,那么,一个数乘以 8 只要将其左移 3 位即可,
而位运算 cpu 直接支持的,效率最高,所以,2 乘以 8 等於几的最效率的方法是 2 << 3。
三元运算符
表达式1?表达式2:表达式3
boolean b=(1>2)?true:false;System.out.println(b);------>falseinti=(2>3)?1:0;System.out.println(i);------>0
分支
if/switch
switch
每个分支判断条件类型相同 switch支持的表达式类型为int、byte、char、short,String(JDK17+)
switch 语句能否作用在 byte 上----->能
能否作用在 long 上, ----->不能
能否作用在 String 上 ----->jdk1.7后能
假设switch –a分支没有break,那么他会继续向下执行,直到遇到break;
@Test
public void test2() {
char c='b';
switch (c) {
//a或者b进行相同的处理
case 'a':
//如果选择了a,那么执行什么
case 'b':
//如果选择了a,那么执行什么
System.out.println("您选择了a或者b");
break;
default://如果上述情况都不满足,就默认
break;
}
while与 dowhile区别
while直接判断是否成立 ---->有可能一次都没执行
do----while 先执行一次,然后再判断条件是否成立 ---->至少执行一次
for/foreach
for(inti=0;i<=100;i+=2){}for(循环到的对象类型 引用名称:循环谁){ 引用名称。。。。。。。 }
死循环
while(true){
}
for(;;)
循环中断:
两种:
中断整个循环:break;
中断当次循环,进行到下一次循环(跳过本次循环,进行下一次)continue;
break语句用于终止某个语句块的执行。用在循环语句体中,可以强行退出整个循环。
“break;”语句:可以出现在while、do…while、for、switch语句体中。
“break label”语句 :可以出现在任何语句体中。
循环的中断
continue语句用在循环语句体中,用于终止某次循环过程,跳过本次循环,开始下一次循环过程
“continue;” 语句:只能出现在循环语句while、do…while、for中,不能用在switch语句中
Break label:为每层循环定义个别名,break可以指定跳出哪一外名字的循环。
练习题
1.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
@Testpublicvoidtest18(){/**
* 1.一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下
* 求它在第10次落地时,共经过多少米?第10次反弹多高?
*/doubleh=100.00;//从第2次开始算,跳的高度 100+50+25+12.5+...//h/1+h/2+h/4+h/8doublesum=100.00;for(inti=1;i<=9;i++){System.out.println("h="+h);sum+=h/2*2;h=h/2;}System.out.println("最终h="+h/2);System.out.println("sum="+sum);}
2.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各个位数字立方和等于该数本身。
个位数字的立方+十位数字的立方+百位数字的立方的和= 它本身
@Testpublicvoidtest1(){for(inti=100;i<=999;i++){intbai=i/100;intshi=i/10%10;intge=i%10;if(bai*bai*bai+shi*shi*shi+ge*ge*ge==i){System.out.println(i);}}}153370371407
3、int total = 0;
for ( int i = 0; i < 4; i++ ){
if ( i == 1) continue;
if ( i == 2) break;
total += i;
}
则执行完该程序段后total的值为:( )。
A、0 B、1 C、3 D、6
数组
第一种通过下标放值//数组定义inta[]=newint[5];//数组第一个元素为1a[0]=1;//数组第2个元素为1a[1]=456;//数组第3个元素为1a[2]=123;a[3]=567;a[4]=2;System.out.println(a[1]);第二种 通过new+{}组合方式//数组初始化 方括号不写数字,根据初始化个数自动确定数组长度数组类型 数组名[]=new数据类型[]{元素1,元素2,…}inta[]=newint[]{1,456,123,567,2};第三种 直接初始化数组类型 数组名[]={元素1,元素2,…}inta[]={1,456,123,567,2};@Testpublicvoidtest3(){//先建立一个一维数组,长度为100,存放1-100之间的数//存放完之后再写一段程序,把数组的每个元素打印出来inta[]=newint[100];inti=0;for(i=0;i<100;i++){//a[0]=1;a[1]=2 a[i]=i+1;}for(i=0;i<100;i++){System.out.println(a[i]);}}多维数组:定义数组类型 数组名[][]数组类型[][]数组名数组类型[]数组名[]inta[][];int[][]b;int[]c[];多维数组的创建数组名=new数据元素类型[行数][列数]数组名=new数据元素类型[行数][];a=newint[3][4];a=newint[3][];a=newint[][4];//非法int[][]array={{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
方法定义与调用
[访问权限控制符][修饰符]返回值类型 方法名(参数类型 形参,参数类型 形参,…){方法体//方法做什么业务}
3、重载(编译时)和重写(运行时)##
运行时多态的三个必要条件:
1、必须有继承或实现(子类继承父类 实现类实现接口)
2、必须有重写 (子类重写父类的方法, 实现类覆盖接口的方法)
3、父类的引用指向子类的对象 也就是要有向上转型
重写:方法的定义完全相同,只是方法方法体不同
相同的方法名、相同的参数列表(参数类型,参数顺序)、相同的返回值类型
一定发生在子类当中,与父类同名,同参,同返回值类型的方法,子类覆盖方法的访问权限要不小于父类中被覆盖方法的访问权限
重载:同一个类中,相同的方法名、参数必须不同(参数类型不同或参数个数不同)、返回值可以相同也可以不同
请说出作用域 public ,private ,protected ,以及不写时的区别
作用域 当前类 同一package 子孙类 其他 package
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √
继承和多态
类单继承
接口可以多继承
同一个类可以实现多个接口
构造方法
构造方法名与类名相同,无返回值类型,也不需要用void补位
如果你没有写有参构造,系统为你生成无参构造
如果你写了有参构造,不会再为你自动生成无参构造,这时候如果想用无参构造,需要重写
如何给新实例的对象赋值
1、属性的set方法赋值
2、通过有参构造方法赋值
变量类型
局部变量
方法级别的变量
局部变量只能在该方法里的有效
实例变量
成员变量 类级别
如果是公有的,其他类也能访问到
如果是私的的,当前类的所有方法都可以访问他
静态变量
第三种静态变量
用static修饰的变量 static修饰的变量是可以共享的变量
书写格式:访问权限 访问修饰 变量类型 变量名
java 中实现多态的机制是什么?
父类的引用指向子类的实例(接口与实现类之间 父类与子类之间)
抽象类与接口的区别
抽象类和接口都不能实例化
1)接口里的方法都是抽象的,而抽象类可以有非抽象方法。
2)类是单继承,多实现
3)接口和接口之间可以多继承(接口可以合并)
4)抽象类可以理解为抽象方法和非抽象方法的混合体,而接口中的方法全是抽象方法,是一套纯粹的规范。
接口里的属性必须是static final的,但抽象类无限制
*接口里不能有构造方法,抽象类可以有构造方法
static与final
用static修饰的内容系统启动时就会加载进来,适合做一些初始化工作
Static 修饰的元素主要用来实现各个类之间共享,特别是属性
修饰:属性:方法 代码块需要注意的问题 只能修饰类成员,不能修饰局部变量(不能修饰方法体里的变量)。 • 用static修饰变量(属性) 所有对象共享• 也称为类变量 用static修饰的成员变量,它们在类被载入时创建,只要类存在,static变量就存在(参考java虚拟机视频) 两种方式访问:• 直接访问:类名.属性;• 实例化后访问:对象名.属性• 用static修饰方法 不需要实例化,可以直接访问• 也称为类方法 两种方式访问:• 直接访问:类名.方法名()• 实例化后访问:对象名.方法名()• 注意事项 静态方法里只能直接访问静态成员,而不能直接访问类中的非静态成员 静态方法中不能使用this、super关键字 静态方法不能被非静态方法覆盖,静态方法不能修饰构造器• 静态代码块 一个类中由static关键字修饰的,不包含在任何方法体中的代码块 当类被载入时,静态代码块被执行,且只被执行一次 静态块经常用来进行类属性的初始化
Final(终极的不可修改的)
可以修饰的内容:类 变量(属性) 方法 类:不能被继承(没有下一代),可被实例化 变量:常量,不能被重新赋值 方法:不能被重写。
单例
• 单例模式实现:– 拥有一个私有构造方法 – 提供一个自身静态私有的成员变量– 提供一个公有的静态的方法(返回实例化后的对象)publicclassSingleton{/*• 单例模式实现:
– 拥有一个私有构造方法
– 提供一个类型为自身的 静态的私有的成员变量(属性)
– 提供一个公有的静态的方法(返回实例化后的对象)*///step 2 提供一个类型为自身的 静态的私有的成员变量privatestaticfinalSingletoninstance=newSingleton();//step 1拥有一个私有构造方法 privateSingleton(){}//step 3提供一个公有的静态的方法publicstaticSingletongetSingleton(){returninstance;}publicstaticvoidmain(String[]args){Singletons1=Singleton.getSingleton();Singletons2=Singleton.getSingleton();System.out.println(s1);System.out.println(s2);}}
final, finally, finalize 的区别
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,
可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM 不保证此方
法总被调用
String StringBuffer StringBuilder区别
String是不可变字符串常量,对它的改动都创建了新的对象;
StringBuffer与StringBuilder代表一组可以改变的字符串
StringBuffer是线程安全的
StringBuilder是线程不安全的,效率高于StringBuffer,单线程操作可以使用StringBuilder
String与 Math是否可被继承,为什么
不可以,因为被final修饰
计算子串在父串中出现的次数
publicvoidtest3(){System.out.println("请输入字符串1");Strings1=newScanner(System.in).next();System.out.println("请输入字符串2");Strings2=newScanner(System.in).next();//引进计数器用于记录次数intcount=0;while(s1.indexOf(s2)!=-1){System.out.println("存在");count++;s1=s1.substring(s1.indexOf(s2)+s2.length());System.out.println(s1);}System.out.println(count);//indexOf求子串在整串的次数//键盘输入//首先判断是否存在子串abc在父串中存在,如果存再计算次数}
List Set map
数组是定长的 可以存放基本类型和引用类型 访问较快 java.lang包中
集合是可变长的 集合只能存放引用类型 java.util包内
Set与list map
Set - 无序的集合;不允许重复(可用于去重)
List有序的集合;允许重复
Map key-value key-唯一标识 value实际存放的数据 适合根据指定唯一标识来查找
set的类型
• Set接口的实现类
HashSet — HashSet的特性在于其内部对象的散列存取,即采用哈希技术
TreeSet — TreeSet存入的顺序跟存储的顺序不同,但是存储是按照排序存储的
ArrayList与linkedlist区别
ArrayList--内部基于数组实现,随机查询速度快,插入删除速度慢;
(建议用普通for循环读取)
LinkedList--内部基于链表实现,随机查询速度慢,插入删除速度快
(用迭代器读取会比较快)
Map接口有两个实现:
HashMap:按hashcode排序 基于数组的
TreeMap:按自然顺序 基于红黑二叉树的
LinkedHashMap;按存入的顺序 基于链表的
冒泡算法(略)
扑克牌
packagecom.neuedu.test;publicinterfaceCard{// 匹配情况String[]cases={"花色点数都相同","花色相同","点数相同","不相同"};// 花色String[]suits={"红桃","黑桃","梅花","方块"};// 牌面值String[]faces={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};// 判断两张牌的牌型StringshowPokerHands(Cardcard);publicStringgetSuit();publicStringgetFace();}packagecom.neuedu.test;publicclassSuitExceptionextendsException{publicSuitException(Stringmessage){super(message);}}packagecom.neuedu.test;publicclassFaceExceptionextendsException{publicFaceException(Stringmessage){super(message);}}packagecom.neuedu.test;publicclassCardImplimplementsCard{privateStringface;privateStringsuit;publicCardImpl(Stringface,Stringsuit)throwsSuitException,FaceException{// 判断花色是否在suits范围内。如果花色不对抛SuitExceptionbooleansuitFlag=false;// 不在花色范围内for(Stringmysuit:suits){if(mysuit.equals(suit)){suitFlag=true;// 花色合法}}if(suitFlag==false){thrownewSuitException("花色不合法");}booleanfaceFlag=false;// 不在花色范围内for(Stringmyface:faces){if(myface.equals(face)){faceFlag=true;// 花色合法}}if(faceFlag==false){thrownewFaceException("花色不合法");}// 判断花色是否在faces范围内。如果牌面不对抛FaceExceptionthis.face=face;this.suit=suit;}@OverridepublicStringshowPokerHands(Cardcard){// 判断花色和点数都相同if(face.equals(card.getFace())&&suit.equals(card.getSuit())){returncases[0];}elseif(face.equals(card.getFace())){returncases[2];}elseif(suit.equals(card.getSuit())){returncases[1];}else{returncases[3];}}@OverridepublicStringgetSuit(){// TODO Auto-generated method stubreturnnull;}@OverridepublicStringgetFace(){// TODO Auto-generated method stubreturnnull;}publicstaticvoidmain(String[]args)throwsSuitException,FaceException{// 创建一张红桃3,一张黑桃6,调用方法判断两张牌的牌型。CardImplcard1=newCardImpl("3","红桃");CardImplcard2=newCardImpl("6","黑桃");Stringresult=card1.showPokerHands(card2);System.out.println(result);}}
转至:↓↓↓
链接:https://www.jianshu.com/p/ff7dc46dcfe9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。