面向对象编程基础(上)

面向过程和面向对象的区别

  • 面向过程:要求的是做每件事的具体步骤 例如 得到两个数的和 第一步就是定义两个数的数据类型,第二步就是将两个数相加得到和,最后一步就是返回和。这三步就是实现得到两个数的和的功能他是面向过程编程的。
  • 面向对象:要求的是每件事是由谁来做,具体的步骤是封装起来的不需具体了 解 例如得到一个数的绝对值 只需要用Math这个静态的对象调用abs方法即可,无需知道他里面是如何得到这个数的绝对值。

面向对象的主线

  • 1.特点:封装,继承,多态
  • 2.类结构和对象内存
  • 3.关键字

类和对象

  • 类:类是所有对象的模板,通过这个模板可以创建不同的对象。例如 学校提供参考的简历模板就是一个类,这个模板他有简历都应该有的东西,通过同学将自己的个人信息填上去就是一个对象。
  • 对象:对象就是由模板具体化出来的,例如同学将自己的信息填在了个人简历模板上就是一个具体的对象,因为每个同学的信息千差万别所以一个模板(类)可以创建出无数个具体的对象。所以说设计好类是面向对象编程的重点。

行为和属性

  • 行为(方法):行为从表面上就是一个对象(类)可以做的事情。例如:Math中的abs,min,max就是这个对象(类)的方法,他可以进行加减乘除。行为的组成包括修饰符,返回值,方法名,形参列表(可有可无)
 public static void main(String... args)
 public static int abs(int a) {
        return (a < 0) ? -a : a;
    }
  • 属性:用来描述一个类或对象当前的状态或者是应当被赋予的东西。例如:人这个类或对象就会有姓名,年龄,性别的属性。这些属性就是一个人类应当与生俱来的东西。属性的组成包括修饰符,数据类型,属性名,字面值(可有可无)
 public static final double PI = 3.14159265358979323846;

属性和局部变量的区别 有无修饰符,定义的范围不同,存在的空间不同,是否初始化

  • 属性 :定义在类中,先声明后使用,存在于堆空间中,有修饰符修饰,有数据类型和变量名,默认初始化。
  • 局部变量:定义在方法的形参,构造器的形参,方法体中,构造器中,代码块中,先声明后使用,存在于栈空间中,无修饰符修饰,有数据类型和变量名,手动赋值。

return关键字

  • 1.用于结束一个方法
  • 2.为方法返回一个结果值

对象数组

        Student[] students = new Student[5];
        for (Student student : students) {
            System.out.print(student + "\t");
        }
        System.out.println();
        students[0] = new Student();
        students[1] = new Student();
        students[2] = new Student();
        students[3] = new Student();
        students[4] = new Student();
        for (Student student : students) {
            System.out.print(student + "\t");
        }
null    null    null    null    null    
com.pojo.Student@5d6f64b1   com.pojo.Student@32a1bec0   com.pojo.Student@22927a81   com.pojo.Student@78e03bb5   com.pojo.Student@5e8c92f4
  • 引用数据类型只存储两种值:null或者地址值

匿名对象

    public void eat()
    {
         System.out.println(this);
    }
    public void sleep()
    {
         System.out.println(this);
    }
 new Student().eat();//com.pojo.Student@5d6f64b1
 new Student().sleep();//com.pojo.Student@32a1bec0
  • 匿名对象就是没有变量名的对象
  • 一个对象只能操作一次属性或方法,使用一次后就不可以使用了
  • 使用匿名对象的常规方法
public class Builder {
    public void create(Student student)
    {
        student.eat();
        student.sleep();
    }
}
new Builder().create(new Student());
com.pojo.Student@5d6f64b1
com.pojo.Student@32a1bec0

com.pojo.Student@22927a81
com.pojo.Student@22927a81

重载overLoad

  • 定义:在同一个类中,允许存在一个以上的同名方法,只要方法的参数个数或参数类型不同或参数的位置不同即可
  • 跟方法的修饰符,返回类型,形参变量名,方法体没关系
  • 判断是否构成重载:同一个类,同个方法名,不同的参数个数,不同的参数类型,不同的参数位置

值传递

  • 1.基本数据类型
    赋值的是变量所保存的数值
public static void main(String[] args)
    {
        int m=10;
        int n=20;
        swap(m,n);
        System.out.println(m+"\t"+n);
    }

    public static void swap(int m,int n)
    {
        int temp=m;
        m=n;
        n=temp;
        System.out.println(m+"\t"+n);
    }
  • 2.引用数据类型
    赋值的是变量所保存的地址值
  public static void main(String[] args) {
        /*int m=10;
        int n=20;
        swap(m,n);
        System.out.println(m+"\t"+n);*/

        Data data = new Data();
        data.m = 10;
        data.n = 20;
        swap(data);
        System.out.println(data.m + "\t" + data.n);
    }

    public static void swap(Data data) {
        /*int temp=m;
        m=n;
        n=temp;
        System.out.println(m+"\t"+n);*/

        int temp = data.m;
        data.m = data.n;
        data.n = temp;
        System.out.println(data.m + "\t" + data.n);
    }

}

class Data {
    int m;
    int n;
}

可变个数参数Varargs机制

  • 定义:允许定义和多个实参相匹配的形参,用更简单的方法传递个数可变的实参
  • 当调用可变个数参数的方法时可以传递0个或0个以上的实参
  • 可变个数形参方法和同类中同名方法构成重载但是优先考虑具体类型的形参方法
  • 可变个数形参方法和同类中同名的同类型数组形参不能定义在一起
public class Person {

    public void show(String... strings)
    {

    }

    /*public void show(String[] strings)
    {

    }*/
}
  • 可变个数形参方法的遍历和数组形参遍历一样
public void show(String... strings)
    {
       for(String string:strings)
       {
           System.out.println(string);
       }
    }
  • 方法中的可变个数形参必须声明在末尾Vararg parameter must be the last in the list
 public void show(int i,String... strings)
    {
       for(String string:strings)
       {
           System.out.println(string);
       }
    }
  • 在方法中只能声明一个可变个数形参

封装性

  • 隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可扩展性,可维护性,通俗的说,把该隐藏的隐藏起来,把暴露的暴露出来。

  • 体现:
    成员属性的私有化,提供公共的Settter,getter方法
    成员方法的私有化
    构造方法的私有化 单例模式

权限修饰符

  • public:(公共权限)

可以修饰类,成员变量,成员方法,构造方法
被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符

  • protected:(受保护权限)

可以修饰成员变量,成员方法,构造方法,不能修饰类(外部类,内部类不考虑)
如果有不同包的类想调用它们,那么这个类必须是定义它们的类的子类。

  • default(默认权限)

类,成员变量,成员方法,构造方法都能使用默认权限,即不写任何关键字
默认权限即同包权限,同包权限的元素只能在定义它们的类中使用,以及同包的类中被调用

  • private:(私有权限)

可以修饰成员变量,构造方法,成员方法,不能修饰类(外部类,内部类不考虑)
被private修饰的成员,只能在定义它们的类中使用,在其他类中不能调用。

修饰符 同类中 同一个包中(子类和无关类) 不同包(子类) 不同包(无关类)
public
protected ×
默认 × ×
private × × ×
  • 并不是每个修饰符都可以修饰类(指外部类),只有public和default可以
  • 所有权限修饰符都可以修饰数据成员,方法成员,构造方法
  • 为了代码安全起见,修饰符不要尽量使用权限大的,而是适用即可。比如,成员变量,如果没有特殊需要,尽可能用private

构造器

  • 作用:用于创建对象 new + 构造器和对对象属性进行初始化
  • 如果没有显式定义构造器,系统会默认提供一个空参构造器
  • 定义:权限修饰符 类名(形参列表) {}
  • 一个类中多个构造器彼此构成重载
  • 一旦显示定义构造器系统就不会提供默认的无参构造器
  • 一个类中至少有一个无参构造器

this关键字

  • this表示当前对象或当前正在创建的对象,可以调用属性,方法,构造器
  • 在类的方法中,使用this.方法()或this.属性,表示调用当前对象的属性或方法,但是通常省略。如果方法中形参和成员属性同名时,必须显示的使用this来区别成员属性和局部变量
  • 在类的构造器中,使用this.方法()或this.属性,表示调用当前正在创建的对象的属性或方法,但是通常省略。如果构造器中形参和成员属性同名时,必须显示的使用this来区别成员属性和局部变量
  • this调用关键字 可以使用this(形参列表)调用本类中其他的构造器,但是不可以通过this.(形参列表)自己调用自己,而且最终只初始化了一个对象
  • 如果一个类中有n个构造最多只有n-1使用了this关键字调用构造器
  • this.(形参列表)要放在构造的首行即同一个构造器不能有两个this.(形参列表)
 public class Animal {
    

    private String name;
    private int age;


    public Animal()
    {
        System.out.println("初始化信息");
    }


    public Animal(String name) {
        this();
        this.name = name;
    }

    public Animal(String name,int age)
    {
        this(name);
        this.age=age;
    }
}

package关键字

  • 为了更好的管理项目中的类,提出了package关键字
  • package放在源文件的首行
  • 创建包需要符合命名规范 xxx.xxx.xxx,每"."一次代表一层文件目录
  • 同一个包下,不可以命名同一个类和接口,不同包下可以命名同一个类和接口

import关键字

  • 在源文件中显式的调用import结构导入指定的包下的接口和类,声明package包和class之间
  • 如果需要导入多个结构,可以并列的写出来或者是用占位符* 。如import java.util.Map.*;
  • 如果使用java.lang.*下的类和接口可以不用使用import结构,在同一个包中调用类和接口也不用使用import结构
  • 如果在源文件中使用了不同包中的同名类,必须有一个类使用全类名来表示
  • 使用import导入xxx.下所有结构,但是其xxx包下的子包任需要导入。如import java.lang.reflect.;
  • 使用import static 可以导入指定的类和接口的静态结构。如import static java.lang.System.*;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,124评论 0 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 面向对象学习三条主线 》类与类的成员:属性、方法、构造器;代码块(或初始化块)、内部类 》面向对象的三个特征...
    RockShi阅读 466评论 0 0
  • 第四章 面向对象 面向对象思想 面向对象思想的引入前面我们讲过数组,当有多个数组都需要遍历时,我们可以将遍历的代码...
    chongsheng阅读 543评论 0 0
  • 写在之前 因为简书字数限制,完整版地址:https://www.zybuluo.com/hainingwyx/no...
    hainingwyx阅读 13,862评论 0 41