zoukankan      html  css  js  c++  java
  • 黑马程序员——java学习3(62-83)——面向对象——封装

    1、面向对象

    三大特性:封装、继承、多态

    面向过程-想到啥做啥

    面向对象-整体化分析,再分块制作。

    发生变化时,面向过程可能要推倒重做,面向对象则可以适应变化

    1.1封装:Encapsulation

    (1)把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位(对象)中。

    (2)把不需要让外界知道的信息隐藏起来,有些对象的属性及行为允许外界用户知道或使用,但不允许更改,而另一些属性或行为,则不允许外界知道,或只允许使用对象的功能,而尽可能隐蔽对象的功能实现细节。

    另一个特点,为封装在一个整体内的变量及方法规定不同级别的“可见性”或访问权限

    1.2继承:

    (1)提高代码复用性,提高开发效率。

    (2)首先拥有反映事物一般特性的类,然后再其基础上派生出反映特殊事物的类。

    (3)若子类只允许继承一个父类,则称为单继承;若允许继承多个父类,则称为多继承。java通过接口(interface)的方式来弥补因java不支持多继承而带来的子类不能想用多个父类的成员的缺点。

    1.3多态性:

    允许程序中出现重名现象。使程序的抽象程度和简洁程度更高,有助于程序设计人员对程序的分组协同开发。

    (1)方法重载

    (2)对象多态,子类对象与父类对象进行相互转换,而且根据其使用的子类的不同,完成的功能也不同。

    PS:面试关于对象

    面试官需要寻找具有专业编程功能的人来完成公司工作

    我就是那个对象,具备这个功能

    你就是在指挥我,就是在使用我的专业技能

    当然,我不禁具备专业编程技能,还会一些更多的。

    一切皆对象,万物皆对象。

    2、多个引用指向同一个对象,一变全变。

    3、成员变量和局部变量

    成员变量作用于整个类,

    局部变量作用于函数中,或语句中。

    成员变量在堆内存中,因对象存在而存在

    局部变量,栈内存

    4、匿名对象

    new Car().num=5;//执行完变垃圾

    new Car().color="blue";//执行完变垃圾

    new Car().run;

    使用方式

    (1)当对对象的方法只调用一次时可用,较简化。

      若对一个对象进行多个成员调用,必须给对象起名字

    (2)可将匿名对象作为实际参数进行传递

    且调用过后,会自动变为垃圾,释放内存

    5、封装

    5.1、私有private(仅是封装的一种形式)

    权限修饰符,用于修饰类中的成员(成员变量,成员函数)

    私有只在本类中有效

    可提供方法来访问,在方法中加判断等语句。

    提高代码的健壮性

    6、构造函数

    作用:对象的初始化(没写的话都自带空参数的构造函数)

    多个构造函数是以重载的形式存在

    6.1、构造函数与一般函数比较

    构造函数在对象已建立就运行,给对象初始化。                    只运行一次

    一般函数是对象调用才执行,给对象添加其具备的功能。         可调用多次

    7、构造代码块

    {}//没函数名

    作用: 给对象初始化

    对象一建立就运行,优先于构造函数。

    区别: 构造代码块是对所有对象进行统一初始化,

    而构造函数是给对应的对象初始化。

    8、this关键字

    8.1、哪个对象调用this所在的函数,this代表哪个对象

    定义类功能时,该函数内部要用到该函数的对象时,这时用this来表示这个对象

     1 package learn;
     2 
     3 class Person{
     4     private String name;
     5     private int age;
     6     Person(int age)
     7     {
     8         this.age=age;
     9     }
    10     public void speak(){
    11         System.out.println("name="+name+"...age="+age);
    12     }
    13     public boolean compare(Person p)
    14     {
    15         return this.age==p.age;//相当于p1.age==p2.age;
    16     }
    17 }
    18 
    19 public class PersonDemo3 {
    20     public static void main(String[] args){
    21         Person p=new Person(40);
    22         Person p2=new Person(20);
    23         System.out.print(p.compare(p2));
    24     }
    25 
    26 }

    8.2、构造函数之间调用,可用this

    不过this()语句需要放在第一行。即初始化动作需要第一行执行,有更细致的初始化则使用更细致的。

    9、静态static

    修饰符,用于修饰成员(成员变量,成员函数),共性变量,存放于方法区

    调用方式+1: 类名.静态变量

    9.1特点

    (1)随着类的加载而加载,随着类的消失而消失即生命周期长(弊端1)

    (2)优先于对象存在

    (3)被所有对象共享(利处2)

    (4)可以直接被类名调用(利处3)

    9.2、类变量和实例变量

    类变量随着类的加载而存在于方法区中(利处1)

    实例变量随着对象的建立而存在于堆内存中

    9.3、静态方法

    静态方法只能访问静态成员,不可用this,super关键字。(弊端2)

    ps:相当于有了类名.

    9.4、main函数

    main不是关键字,只是可被jvm识别的特殊单词

    public static void main(String[] args)唯一可改args

    传入的是new String[0]

     1 package learn;
     2 
     3 public class MainDemo {
     4     public static void main(String[] args)
     5     {
     6         String[] arr={"hah","hehe","heihei","xixi","hiahia"};
     7         MainTest.main(arr);
     8     }
     9 }
    10 class MainTest{
    11     public static void main(String[] args)
    12     {
    13         for(int x=0;x<args.length;x++)
    14         {
    15             System.out.println(args[x]);
    16         }
    17     }
    18 }

    9.5何时使用静态

    共享数据--静态变量

    功能内部没有访问到非静态数据--静态方法

    工具类私有化,包括构造函数都私有化,只通过类名调用。

    10、调用他人的class时,记得设置classpath=.;cclass;(记得保留当前路径)

    11、文档

    必须为public类

    javadoc -d myhelp -author -version ArrayTool.java

        生成处的文档名 作者,版本号可不加 文档依据的源文件

    index文件开始查看

    12、静态代码块

    随着类的加载而执行,只执行一次,用于给类初始化,无法含有非静态内容,优先于主函数

     1 package learn;//执行结果 ac9d
     2 
     3 class StaticCode{
     4     int num=9;
     5     StaticCode()
     6     {
     7         System.out.println("b");
     8     }
     9     
    10     static{
    11         System.out.println("a");
    12     }
    13     
    14     {
    15         System.out.println("c"+num);
    16     }
    17     
    18     StaticCode(int x)
    19     {
    20         System.out.println("d");
    21     }
    22     
    23     public static void show(){
    24         System.out.println("show run");
    25     }
    26 }
    27 
    28 public class StaticCodeDemo{
    29     public static void main(String[] args){
    30         new StaticCode(4);
    31     }    
    32 }

    13、执行顺序

    1、因new用到了Person.class,所以会先找到Person.class文件并加载到内存中。

    2、执行该类中的static代码块

    3、在堆内存中开辟空间,分配内存地址

    4、在堆内存中建立对象的特有属性,并进行默认初始化

    5、对属性进行显式初始化

    6、对对象进行构造代码块初始化

    7、对对象对应的构造函数初始化

    8、将内存地址赋给栈内存的p变量。

    14、单例模式-一个类中只存在一个对象

    14.1特点

    (1)禁止其他程序建立该类对象--将构造函数私有化

    (2)让其他程序能访问该类对象--类中创建一个本类对象

    (3)方便其他程序对对象的访问--可以对外提供一些访问方式(只有这个进出口)

    保证对象在内存中唯一才用到

    饿汉式:

    Single类一进内存就已经创建好了对象

     1 package learn;
     2 
     3 class Single{
     4     private int num;
     5     public void setNum(int num)
     6     {
     7         this.num=num;
     8     }
     9     public int getNum()
    10     {
    11         return num;
    12     }
    13     private Single(){}
    14     private static Single s=new Single();
    15     public static Single getInstance(){
    16         return s;
    17     }
    18 }
    19 public class SingleDemo {
    20     public static void main(String[] args)
    21     {
    22         Single s1=Single.getInstance();
    23         Single s2=Single.getInstance();
    24         s1.setNum(40);
    25         System.out.print(s2.getNum());
    26     }
    27 }

    懒汉式:

    Single类进内存,对象还不存在,只在调用了getInstance方法时,才建立对象.

     1 package learn;
     2 class Single2{
     3     private static Single2 s=null;
     4     private Single2(){};
     5     public static Single2 getInstance(){
     6         if(s==null)//此处两条语句执行,容易因cpu多线程导致报错。具体解决见多线程。故除面试外,多用饿汉式
     7             s=new Single2();
     8         return s;
     9     }
    10 }
    11 public class SingleDemo2 {
    12     public static void main(String[] args){
    13         Single2 s2=Single2.getInstance();
    14     }
    15 }
  • 相关阅读:
    linux Apache 安装与配置
    从零开始的JAVA 2. java程序的构成及命名规则
    从零开始的JAVA 1. 安装 JAVA 与 设置环境变量
    通过系统光盘搭建本地yum仓库
    Linux网站服务Apache+php+mysql的安装
    PostgreSQL学习手册(常用数据类型)
    1.4、WebRTC源码
    1.3、WebRTC架构
    1.2、初识WebRTC
    必读前言—— 作者的独白
  • 原文地址:https://www.cnblogs.com/sunxlfree1206/p/4663173.html
Copyright © 2011-2022 走看看