博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序设计的一些原理
阅读量:5905 次
发布时间:2019-06-19

本文共 3702 字,大约阅读时间需要 12 分钟。

一: 自曾自减原理

1
2
3
4
5
6
7
class 
VarDemo  {
public 
static 
void 
main(String[] args) {
int 
x = 
30
;
x = x++;
System.out.println(x);
}
}

结果: 30

内存中计算实现的过程

temp = x     => temp =30

x = x + 1    => x = 31

x = temp     => x =30

注: 第一步编译器发现是 x++;所以会把x先转到temp临时内存中,然后x++实现了x=31, 然后将x++赋值给x, x=temp

换成

x = ++x

内存中实现过程是:

x= x + 1  x => 31

x = x    x => 31

二: 自动转换数据类型和强制转换类型

byte x = 30;

x = x +4;

以上会报错,解释:

第一步:

byte x =30;实现的过程是,将int型的30赋值给byte类型的时候,java编译器底层会做,强制转换,(如果int型的整数能放入byte类型的话)将30转换成为byte类型(否则报错),在赋值给byte类型的变量x。

第二步:

x是byte类型 + int类型的4,因为x是变量,底层无法判断x+4是否能正确的转换到byte类型,所以报错

E:\java3200\day002>javac VarDemo2.java

VarDemo2.java:4: 错误: 可能损失精度

                x = x +4;

                      ^

  需要: byte

  找到:    int

1 个错误

但可以强制进行转换:

x = (byte)(x +4);

三:x+=5; 是否等于 x = x+5

解答:

byte x = 30;

x+=5;

以上不会报错,以上只有赋值一个步骤。

byte x = 30;

x = x +5;

这个会报错,报错的原因就是第二种情况,类型自动转换不了!以上有先计算x+5 在赋值的两个步骤

四: 双与和单与的区别(java中)

&& 

&

两种的区别是,逻辑运算的结果一样,但是过程不一样

&& 当左边的执行结果为false的时候,右边不参加运算

& 无论左边为何结果,右边都会运算

综合以上,&&的效率更高,但是有时候要得到与结果,接右边一定要参加运算的情况,要使用单与

单与还有一个作用在位运算(6&3)结果 2

0000-0000 0000-0000 0000-0000 0000-0010

五: 两个变量的交换

两个变量之间数值的交换

如:

a = 5

b = 9

方法一:采用第三个临时变量

t = a

a = b

b = t

开发的时候,是使用这种方法,因为阅读性强,且临时空间的开辟不会对性能造成很大的影响!

方法二:不采用第三个临时变量

a = a + b

b = a -b

a = a - b

这种方法: 可能回超出int型的取值范围,会强制转换,数据就会变。且阅读性差,常用于面试题

方法三: 异或的方法

a = a ^ b    ; a = 5 ^ 9

b = a ^ b    ; b = (5 ^ 9)^9

a = a ^ b    ; a = (5^9)^5

原理: 就是一个数异或一个两次,还是原来的值

六:三目运算的应用

//获取两个数的最大数

max = a>b?a:b

//获取三个数的最大值

int temp = o>p?o:p

int max = temp>q?temp:q

七:一条语句的代码块可以省略{},在流程控制中,什么叫一条语句呢?

1
2
3
4
5
if 
(score >=
90
) {
    
if 
(score >=
95
) {
        
System.out.println(
"very very good"
);
    
}
}

可以省略成:

1
2
3
if 
(score >=
90
    
if 
(score >=
95
        
System.out.println(
"very very good"
);

因为: 相对if(score >90) 而言

1
2
    
if 
(score >=
95
        
System.out.println(
"very very good"
);

是一个条件语句。

相对if (score >90)而言 

1
System.out.println(
"very very good"
);

是一条语句

八:代码块的用途:

1
2
3
4
5
6
{
    
int 
a=
1
    
a=a+
1
;
    
//代码块内的运算,可以定义变量的生命周期,作用域值只在这个代码块内
    
System.out.println(a);
}

代码块可以优化性能,将一些运算放置在代码块内,可以节省内存空间,因为代码块内的变量,运算结束后就消失,被回收。作用范围决定的。 JVM内存有限,代码劣质可能会造成内存溢出。

九:Switch中的执行过程和顺序

不常规的写法,分析过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class 
SwitchDemo {
    
public 
static 
void 
main(String[] args) {
        
int 
x =
4
;
        
switch 
(x) {
            
default
:
                
System.out.println(
"d"
);
                
// break;
            
case 
1
:
                
System.out.println(
"a"
);
                
// break;
            
case 
2
:
                
System.out.println(
"b"
);
                
break
;
            
case 
3
:
                
System.out.println(
"c"
);
                   
break
;
        
}
    
}
}

执行结果是:

d

a

b

原因:

case 和default两个无序,在内存中一定是先执行case,在执行defaul。x=4 先执行case 不配 1 2 3

所以执行default,打印输出"d",因为没有break跳出switch,所以往下执行,因为已经匹配了default,就不用再去判断是否匹配case中的表达式,所以打印"a", "b",然后遇到break,跳出循环。

注意: 默认的靠近下面花括号的那个case或者default可以省略break的,这样即使都不写break也不会死循环,保证了一定存在break

 

十: while和for的区别

共同点,都是循环,while等做的for也能做,for能实现的,while也能实现,但是两者还是有区别的。

看以下代码,执行会出错

int x =1;

while(x<3) {

System.out.println("x="+x);

x++;

}

System.out.println(x);

for(int y=1;y<3;y++) {

System.out.println("y="+y);

}

System.out.println(y);

原因: for语句中的变量作用域只在for语句中,当for循环完毕后,所有变量都在内存中被销毁。所以只针对循环而言,for的循环对程序节省内存开销。

十一: 强类型和弱类型语言的区别

如: 强类型语言java C,数据类型都是分的比较细的,如整数分 byte short int long,任何数据都要定义类型。

如:弱类型语言python 对数据类型就没那么细微,整数就是整数类型,且定义变量不需要声明类型

函数方面的区别(java ,python)对比

java 中函数可以嵌套调用,但是不能嵌套定义,如mian主函数中,不能定义其他函数,只能调用其他函数,因为java中的函数都是在类当中的,所以函数之间只能存在"兄弟"级别。

python中函数可以嵌套定义,如装饰器中

java中即使是一个函数,也要定义返回的数据类型,即定义函数的时候,指定这函数的类型,即使没有函数没有返回值,也要定义函数的类型为void类型(不带返回值的类型),main主函数就是一个void函数类型。

python中return就可以返回任何数据类型了,函数定义不需要指明类型

十二: 函数(方法)的重载

重载:

1.同一个类中

2.函数名相同

3.参数个数不同,或者参数类型不同

4.与返回值类型无关

5.java是严谨性的语言,如果存在调用异常,会编译失败

重载的实现:

java编译器会通过参数的不同,选择调用不同的函数(函数名相同的)

重载的优点:

方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。

如:

public static int add(int a, int b) {

return a +b;

}

public static double add(double a, double b) {

return a+b;

本文转自残剑博客51CTO博客,原文链接http://blog.51cto.com/cuidehua/1790660如需转载请自行联系原作者

cuizhiliang

你可能感兴趣的文章
zabbix 3.2.7 (源码包)安装部署
查看>>
vsCode 快捷键、插件
查看>>
网络最大流问题算法小结 [转]
查看>>
iOS推送消息报错误“Domain=NSCocoaErrorDomain Code=3000”的可能问题
查看>>
kvm-1
查看>>
leetcode 64. Minimum Path Sum
查看>>
textkit
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
Developing a Service Provider using Java API(Service Provider Interface)(转)
查看>>
oschina程序开发
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
Java 设计模式专栏
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
Office文档出错的几种原因与解决方法
查看>>
正则表达式 学习笔记1.1
查看>>