java学习笔记(八)

java学习笔记(八)

java部分:

静态成员变量:
static修饰,静态成员变量是属于类的,而普通成员变量是属于对象的。静态成员变量也只加载一次。
xx.java–>xx.class–>类加载(静态成员变量会和类一起加载到方法区中)。
类加载:
类加载的时间是第一次使用类之前。使用类的情况包括第一次调用静态成员变量或静态方法和第一次实例化对象,所以一般来说静态成员变量在初始就定义好,而不是在构造函数中赋值,会有不实例化对象而使用其类的静态成员变量的情况。
静态方法:
可以在普通成员方法中被调用,静态方法中因为使用时类的对象不一定已经创建了,所以不能使用普通成员变量,也不能使用this关键词。
代码块:
关键词{},没有修饰,在构造方法前面执行,作用主要是提取构造方法的公共部分,初始化成员变量,实际使用较少。
静态代码块:
static修饰的代码块,静态代码块中的变量都是局部变量,在三种使用类的情况下都会执行,而且会在普通代码块之前执行,可以用来提高执行效率,把只需要执行一次的东西放到静态代码块之中。静态代码块可以写在静态成员变量之前,谁在前面谁先执行。
有父子类关系的代码块,静态代码块,构造方法的执行顺序:
父类静态代码块–>子类静态代码块–>父类代码块–>父类构造方法–>子类代码块–>子类构造方法.
静态代码块和静态变量:
静态变量在静态代码块之后定义,静态代码块中给静态变量赋值是不会报错的,但是如果是进行++或者输出之类的操作就会报错。
public class Solution {
	static{   
		c=1; 
	    c++;
		System.out.println(c);
	}
	static int c=0;
}
因为类加载时会将成员变量先加载进去的,所以赋值是没问题的。静态代码块里打印出错可能因为编译器将它当成是局部变量了,没有进行类型定义当然是不能引用的,Println又需要实例对象,解决用类名.变量就行了。
public class Solution {
	static{   
		c=1;
    	Solution.c++;
		System.out.println(Solution.c);
	}
	static int c=0;
}
注:最后c会等于0,因为执行顺序其实是static int c,静态代码块,c=0,static int c 会被拆分成两个原子操作,然后先加载c的定义。

final:

final修饰对于变量时,该变量无法改变,初始化完后就固定了(修饰引用类型时固定的是地址,而非值,引用的量可以变化),final成员变量要在构造函数或者定义时初始化,final局部变量要在使用前初始化。final修饰的方法是不能被重写的,final修饰的类是不能被继承的。
被final 修饰的变量,被称为常量。被final static修饰(final和static可以互换位置)的常量必须声明同时初始化,不可被改变。

接口:

interface关键词修饰,可以理解为一种特殊的类,实际为一种引用类型。类通过implements来实现该接口,并重写其中所有的抽象方法。实现类可以不重写接口的默认方法,此时直接继承接口的默认方法,重写默认方法时注意实现类不能用default修饰词,用idea的一键重写时用public修饰。
如果继承的多个接口有相同的默认方法或抽象方法时必须重写,同样父类和继承的接口有相同的默认方法或抽象方法时也必须要重写。
在jdk1.7以下,接口中只能有抽象方法和静态常量(默认全大写,用下划线拼接),默认都是用public abstract 修饰(可以省略不写)。
在jdk1.8之后,接口可以有静态方法和默认方法(用default修饰且不能省略),重合了一部分抽象类的功能,强化了接口。
在jdk1.9之后,接口新增了私有方法,用private修饰,可以减少默认方法和静态方法(使用静态私有方法)中的重合代码量且不会被实现类所实现,实现了代码复用。
接口也能继承接口,而且可以extends多个接口,但是接口是不能继承普通的类的。
接口是可以作为返回值和参数类型的,但是因为接口不能实例化对象,所以实际传入的参数和返回值都是接口的实现类。返回时用接口类直接接收(此时向上整合,实现了多态)。例:
public static InterfaceA method(){
    return new InterfaceAImpl();//InterfaceAImpl是Interface的实现类
}
public static void main(Stringp[] args){
	IntefaceA a = method();
}

算法部分:

平衡二叉树:
优化算法:利用后序遍历:左节点,右节点,根节点的顺序,先到底部,然后在回溯的过程中再一步步判断是否平衡。如果此时不平衡直接return -1,就可以减少之后没有必要的递归,最后和-1进行比较就行了。
public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        return getDepth(root) != -1;
    }
    private int getDepth(TreeNode root) {
        if (root == null) return 0;
        int left = getDepth(root.left);
        if (left == -1) return -1;
        int right = getDepth(root.right);
        if (right == -1) return -1;
        return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值