首页 > 编程语言 > 详细

java基础--面向对象以及相关知识

时间:2019-05-21 14:00:52      阅读:149      评论:0      收藏:0      [点我收藏+]

一、 面向对象特征与原则

  1、三大特征:封装、继承、多态。

    (1)封装:将客观的事物封装成抽象的类,封装代码逻辑,并通过访问控制符来控制访问的方式,从而保护程序(使用反射时,可以获取对象的私有方法和成员,会破坏封装性)。

    (2)继承:某个类通过继承可以获取另外一个类的大部分方法(非私有的方法),同时可以编写属于自己的方法,便于程序的扩展。

    (3)多态:指一个类的实例的相同方法在不同的情形下有不同的结果。一般与继承、重写、向上转型等概念相关。

  2、五大原则:单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则(多用于框架)、接口分离原则。

  3、任一事物均可抽象为对象,事物状态可以抽象为对象的变量,事物的行为可以抽象为对象的方法,类似的多个对象可以归为一类。简单的讲,类是对象的模板,对象是类的实例。

 

二、构造方法、方法重载(overload)与方法重写(override)

  1、构造方法,通过构造方法实现对象的初始化,若没写构造方法,则系统默认提供一个无参构造。

    格式:  

      (1)构造方法的名称必须与类名相同。

      (2)构造方法没有返回值,但是也不能用void修饰。

      (3)子类继承父类时,构造方法中最好使用super关键字来调用父类的构造方法。若子类中没写,那么编译器会自动加入super(),且此时若父类中没有无参构造方法,会报错。

  2、方法重载,出现在同一类中,其方法名相同,但参数类型或者参数个数不同。

  3、方法重写,出现在子类中,其方法名,参数类型,参数个数,返回类型与父类相同,且方法的访问修饰符要比父类的方法权限高。

  4、重载与重写的区别:

    (1)重载为编译期绑定,即编译时根据参数变量的类型、个数来判断应该调用哪个方法。
    (2)重写为运行期绑定,即运行时根据引用变量实际指向的对象调用方法。

 /**
 2  * 父类
 3  */
 4 class Father {
 5     public void talk() {
 6         System.out.println("This is father");
 7     }
 8 }
 9 
10 /**
11  * 子类
12  */
13 class Son extends Father {
14     public void talk() {
15         System.out.println("This is son");
16     }
17 }
18 
19 /**
20  * 演示类
21  */
22 class Demo {
23     public void show(Father obj) {
24         System.out.println("Father");
25         obj.talk();
26     }
27 
28     public void show(Son obj) {
29         System.out.println("Son");
30         obj.talk();
31     }
32 }
33 
34 /**
35  * 测试类
36  * 
37  * 测试结果为:
38  * Father
39  * This is father
40  * Son
41  * This is son
42  * Father
43  * This is son
44  */
45 public class Test {
46     public static void main(String[] args) {
47         Father father = new Father(); //实例化一个Father对象
48         Son brother = new Son();//实例化一个Son对象
49         Father sister = new Son();//向上转型,实例化一个Father对象
50 
51         Demo demo = new Demo();//实例化一个演示类
52         demo.show(father);//由于方法重载,father属于Father类,故执行第一个show方法,执行Father类的talk方法。
53         demo.show(brother);//由于方法重载,brother属于Son类,故执行第二个show方法,执行Son类的talk方法。
54         demo.show(sister);//由于方法重载,sister属于Father类,故执行第一个show方法,但由于方法重写,执行的是Son类的talk方法。
55     }
56 }

 

三、JVM内存结构(方法区、栈、堆)

  1、方法区:方法区用于存放类的信息。当java程序运行时,首先通过类装载器载入字节码信息(.class文件),经过解析后将其装入方法区。即类的各种信息均在方法区保存。

  2、栈:栈用于存放程序运行中所有的局部变量。一个java程序运行直到结束的过程中会调用多个方法,而JVM会为每个方法在栈中分配一个对应的空间,这个空间称为方法的栈帧。栈帧中存储了该方法的参数、局部变量等数据,当一个方法结束,则清除对应的栈帧。

  3、堆:堆用来存放对象,比如使用new关键字实例化一个对象,则其相关的成员变量将存于堆中某个区域。

 

四、抽象类、接口、extends、implements、向上造型、instanceof

  1、抽象类:使用abstract关键字修饰,若方法没有方法体,必须由abstract关键字修饰。不能被实例化,其子类必须重写所有abstract方法才可以被实例化。

  2、接口:使用interface关键字修饰,java1.8之前方法没有方法体,java1.8之后方法可以有方法体,但必须由default关键字修饰。不能被实例化,其子类必须重写所有abstract方法才可以被实例化。

  3、通过extends关键字实现继承,子类可以继承父类的方法以及成员变量,且可以声明自己的成员变量、方法。

  4、通过implements关键字实现接口,原理类似继承。

  5、Java不支持多继承,但可以通过实现多个接口来达到多继承的效果。一个类可以实现多个接口,一个接口可以继承多个接口。

  6、向上造型:一个子类可以向上造型为父类,即父类的引用指向子类的实例(对象)。比如:Father father = new Son();

  7、一个父类的引用可以指向该父类的对象,也可以指向其子类的任意一个对象。可通过instanceof关键字可以判断某变量具体指向的数据类型。

 

五、访问控制符

  1、private:只能在本类中访问。

  2、default:可以在本类以及同包中访问。即private + 同包。

  3、protected:可以在本类、同包、以及子类中访问。即default + 子类。

  4、public:可以在任意一个地方访问。即protected + 不同包。

 

六、static、final关键字

  static关键字:

  1、static修饰成员变量:

    (1)static修饰的成员变量不属于对象的数据结构。

    (2)static变量属于类的变量,通过(类名.变量名)来访问。
    (3)static变量存在方法区中,不在堆里。
    (4)一个类只用一份static变量,无论创建多少个对象,此变量均共享。
  2、static修饰方法:(类似于修饰成员变量)
    (1)static方法属于类的方法,直接使用(类名.方法名)调用。
    (2)通常用于提供一些工具方法、工厂方法等。
  3、static修饰代码块:(类似于修饰成员变量)  

 

  final关键字:

  1、final修饰类:
    final修饰的类不能被继承。
  2、final修饰方法:
    final修饰的方法不能被重写。
  3、final修饰成员变量:
    该成员变量需在初始化时赋值,对象创建后不可被修改,通常用于声明常量。

 

七、参数传值(值传递还是引用传递?)

  1、对于基本类型,参数传递指的是值传递。其传递的是参数的复制值,即将参数拷贝一份再传入,此时修改参数是对拷贝的值进行修改,不会影响原来的值。

  2、对于引用类型,参数传递可以理解为引用传递,也可以理解为值传递。其传递的是参数的地址的复制值,即将参数的地址拷贝一份再传入,此时若通过参数(引用地址)修改参数的值,会影响原来的值。若修改参数(引用地址),则不会影响原来的值。

 1 /**
 2  * 测试类,用于测试参数传递为引用传递还是值传递。
 3  * 测试结果为:
 4  * hello
 5  * hello world
 6  * hi
 7  * hi
 8  */
 9 public class Test {
10     public static void main(String[] args) {
11         StringBuilder str = new StringBuilder("hello");
12         System.out.println(str); //输出为hello
13         test1(str); //由于引用传递,将str所指向的地址拷贝,通过地址修改地址上的参数,所以会修改地址上的参数。
14         System.out.println(str);//输出为hello world
15 
16         String str1 = "hi";
17         System.out.println(str1);//输出为hi
18         test2(str1);//由于引用传递,将str1的地址拷贝,由于String的不可变性,其会导致拷贝后的地址重新指向另一个地址,故不会修改原地址上的参数
19         System.out.println(str1);//输出为hi
20 
21     }
22 
23     /**
24      * 将参数的地址拷贝,并根据参数的地址,向参数中追加字符串。
25      * 此时原地址的参数被修改。
26      * @param str
27      */
28     public static void test1(StringBuilder str) {
29         str.append(" world");
30     }
31 
32     /**
33      * 将参数的地址拷贝,由于String的不可变性,所以拷贝的地址将被替换为一个新的地址,新的地址指向"world"参数。
34      * 即相当于给拷贝的地址修改了地址,不会对原有的地址造成影响。
35      * 此时原地址未被修改,且参数未被修改。
36      * @param str
37      */
38     public static void test2(String str) {
39         str = "world";
40     }
41 }

 

java基础--面向对象以及相关知识

原文:https://www.cnblogs.com/l-y-h/p/10899374.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!