java中有四大修饰符的区别

  • private(私有的)
    private可以修饰成员变量,成员方法,构造方法,不能修饰类(此刻指的是外部类,内部类不加以考虑)。被private修饰的成员只能在其修饰的本类中访问,在其他类中不能调用,但是被private修饰的成员可以通过set和get方法向外界提供访问方式
  • default(默认的)
    defalut即不写任何关键字,它可以修饰类,成员变量,成员方法,构造方法。被默认权限修饰后,其只能被本类以及同包下的其他类访问。
  • protected(受保护的)
    protected可以修饰成员变量,成员方法,构造方法,但不能修饰类(此处指的是外部类,内部类不加以考虑)。被protected修饰后,只能被同包下的其他类访问。如果不同包下的类要访问被protected修饰的成员,这个类必须是其子类。
  • public(公共的)
    public是权限最大的修饰符,他可以修饰类,成员变量,成员方法,构造方法。被public修饰后,可以再任何一个类中,不管同不同包,任意使用。
    重点来了
public protected default private
同一个类
同一个包
子类
不同包

自动数据类型转换

  • 数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中 “ 悄然 ” 进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。
    自动数据类型转换
    自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
    低 ---------------------------------------------> 高
    byte,short,char-> int -> long -> float -> double
    运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如下:
操作数1类型 操作数2类型 转换后的类型
byte、short、char int int
byte、short、char 、int long long
byte、short、char 、int、long float float
byte、short、char 、int、long、float double double

接口和抽象类的区别是什么?

  • Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
    接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
    类可以实现很多个接口,但是只能继承一个抽象类
    类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
    抽象类可以在不提供接口方法实现的情况下实现接口。
    Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
    Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
    接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
    也可以参考JDK8中抽象类和接口的区别

瞬间开悟 接口只能定义一系列方法,算是定义行为,而不能包含具体的变量,不能拥有自己的属性,但是抽象类能够拥有变量

什么是传递值和引用传递?

  • 作者:Intopass
    链接:链接: link
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中。更何况,要想知道Java到底是传值还是传引用,起码你要先知道传值和传引用的准确含义吧?可是如果你已经知道了这两个名字的准确含义,那么你自己就能判断Java到底是传值还是传引用。这就好像用大学的名词来解释高中的题目,对于初学者根本没有任何意义。一:搞清楚 基本类型 和 引用类型的不同之处int num = 10;
    String str = “hello”;从放弃到入门如图所示,num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。二:搞清楚赋值运算符(=)的作用num = 20;
    str = “java”;从放弃到入门对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。如上图所示,“hello” 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)三:调用方法时发生了什么?参数传递基本上就是赋值操作。第一个例子:基本类型
    void foo(int value) {
    value = 100;
    }
    foo(num); // num 没有被改变

  • 第二个例子:没有提供改变自身方法的引用类型
    void foo(String text) {
    text = “windows”;
    }
    foo(str); // str 也没有被改变

  • 第三个例子:提供了改变自身方法的引用类型
    StringBuilder sb = new StringBuilder(“iphone”);
    void foo(StringBuilder builder) {
    builder.append(“4”);
    }
    foo(sb); // sb 被改变了,变成了"iphone4"。

  • 第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
    StringBuilder sb = new StringBuilder(“iphone”);
    void foo(StringBuilder builder) {
    builder = new StringBuilder(“ipad”);
    }
    foo(sb); // sb 没有被改变,还是 “iphone”。
    重点理解为什么,第三个例子和第四个例子结果不同?下面是第三个例子的图解:从放弃到入门builder.append(“4”)之后从放弃到入门下面是第四个例子的图解:从放弃到入门builder = new StringBuilder(“ipad”); 之后从放弃到入门

相关文章: