java知识点

来源:互联网 发布:唯一视觉婚纱摄影 知乎 编辑:程序博客网 时间:2024/06/09 21:58

构造方法是创建对象的重要方法,但是他只负责初始化,当new的时候对象已经产生(划分空间,引用指向,默认值),之后才轮到构造方法初始化里面的属性(各种赋值和方法调用),构造方法会返回一个对象。

一个对象,包含this(对自身的引用),super(父类的引用),extends的类,等于说在自己类中创建了一个父类,子类独有的属性等于额外添加。this和super只能写在方法第一行,构造方法中。

多态:父类引用指向子类对象,可以用A instenceof B 检查a是不是b的实例,或者间接实例

继承的时候尽量不要暴漏父类的方法和变量,private防止子类随意访问和修改,protected子类可以使用,public公开,final无法修改,尽量不要在父类中调用将被子类重写的方法,因为由于类的加载,在执行父类构造的时候早就把方法重写了,只能调用子类的重写方法。

继承会破坏封装,如果子类没有新的属性的添加和新的方法,应该不用继承,可用组合。即 一个动物类,一个老虎类,一个狮子类,都有吃的方法。实例一个动物对象作为老虎狮子的成员变量,传入老虎的构造方法,传入狮子的构造方法,狮子老虎的吃的方法直接调用动物的吃的方法。那么在main方法中可以实例化老虎狮子的对象,调用老虎狮子对象的吃的方法,这些方法实际都去调用传入的动物对象的吃的方法。继承 (is a)组合(has a)

执行顺序:静态代码块(针对类进行初始化),普通代码块(针对对象)比构造方法(针对对象)还早,事实上普通初始化代码块是个假象,会在javac运行后同步到构造方法前端


包装类Integer的源码实现其实是一个Integer数组池

类成员可以直接通过类名访问,用对象可以访问只是对象,当对象=null,通过对象也可以调用类方法,类变量。不会报错,正常运行


单例类:private构造方法,public公开一个方法返回实例(方法中要new一个对象),static修饰可以用类名调用,如果有多线程需要,还需要注意线程安全问题synchronized


final修饰类,不可悲继承

final修饰方法,不能被改写

final修饰变量,不可修改,需定义时就赋值,也可以在构造和初始化快中赋值

(一句话,在编译时就确定下来,而不是运行时才确定)

一开始就定义,会被当成宏定义宏变量,接近于常量,缓存在常量池中,当后续创建相同变量,将直接调用。


静态块不能给实例变量赋值,也不能调用实例方法。因为类存在时,对象不一定存在。

final修饰的引用类型变量可以改变其对象所引用的对象的内容。改不了儿子,就改孙子。指向孙子的指针不能改,但是儿子指向孙子的指针能改。

为了防止可以改孙子,可以考虑使用匿名类。

比如Person中的name对象,在main方法中创建一个name对象,传入Person构造,不要直接把name赋值给Person的成员变量name,而是应该this。name=new name(name。getname),这样就会有一个匿名类被Person的成员变量指向,而main方法中的name即使被修改也不会影响Person。


不可变类:可以创建,不可修改,private final修饰成员变量,不提供修改方法,构造方法开放,提供getter方法不提供setter方法


经常使用不可变类可考虑设计缓存。存集合或数组当中


abstract只能修饰方法和类,只有方法签名没有方法实现,不可悲实例化只能被继承


一个类a extends b implements c,d,e.

都可以用bcde的引用指向a对象。

interface接口类可以extends多个父类接口,抽象类同理。都默认public static final修饰变量,接口只能定常量;只能public abstract修饰方法


java8允许在接口定义public static的类方法,不能default,默认也是自动添加public。要么public static 要么default 不static,接口允许多继承,直接extends a,b,c,d


重写方法实现接口等都要返回类型不变,权限相等或更大,一般都用public


一个类只能继承一个类,包括抽象类,但接口可以有N个,接口体现的是规范和实现分离的设计哲学,降低模块之间的耦合,提高可扩展新和维护行;


内部类可以访问外部类的private的成员,因为拥有外部类的引用,内部类可以作为成员变量的身份;访问方法和变量时,内部类先在自己内部找,找不到就到外部类找,再找不到就编译错误

因为内部类是寄生在外部类的,当内部类访问外部类的,则说明对象已存在,而当外部类访问非静态内部类的成员时,对象不一定存在,所以编译错误

非静态内部类里不允许定义静态变量。


静态内部类的实例方法不能访问外部类的实例方法,因为静态内部类寄生在外部类上,只持有类引用,而没有外部类的实例的引用,该实例也不一定存在,故编译错误。


使用内部类时,优先考虑静态内部类,不需要创建外部类对象即可创建内部类对象

内部类无法通过继承重写


内部类不管是什么类,就把它当做一个普通成员,或者普通的变量,联想一下,各种场景各种情况下能够被访问调用就能想明白了,包括什么static等等,不要因为是个类就晕

如果内部类非private,甚至可以被其他类extends,只不过前面要加上外部类名作前缀。

静态不能访问非静态,非静态可以访问所有。


方法体内的类称为局部内部类,外界访问不到,所以没有必要publicprivateprotectedfriendly。很鸡肋,可以说用不到,局部内部类就当玩玩看看。


Lamdba表达式是为只有一个抽象方法的接口创建对象用的,格式为:(被重写方法的参数列表) -> {处理方法(重写)} 


用人话说:函数式接口就是只有一个抽象方法的接口,可以用lamdba表达式非常方便的重写;

原始:new 接口()-> {类体{方法体}}

Lambda :  (重写方法的参数列表)->{方法体}

lambda表达式只能用于函数式接口,记住,是函数式接口,只有一个抽象方法的接口


Lamdba表达式用于重写一个函数式接口里的唯一一个抽象方法,可以直接重写进去,也可以用把传入该方法的数据转到已有的类或对象的方法去处理,也就是拿现成的类或对象的方法去重写,只需要(参数列表)-> 类或对象::方法名;   即可,根据方法的属性不同,有的方法要用类名调用,有的需要用对象来调用,如果是实例方法,参数列表要多一个对象的引用变量


某些语言允许传入代码块作为参数,java8的lambda表达式允许传入代码块作为参数

外部类名.class   外部类名$内部类名.class