`
new_Line
  • 浏览: 10332 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

黑马程序员_java面向对象三大特征

 
阅读更多

------- android培训java培训、期待与您交流! ----------

Java是面向对象的程序设计语言,主要表现为java完全支持面向对象的三种基本特征:封装、继承、多态。
封装:
    封装是面向对象三大特征之一,它指的是将对象的实现细节隐藏在对象内部,不允许外部直接访问。
    通过提供的公有方法供外部使用提高了程序的安全性,和代码的可维护性。通过访问修饰符来实现封装。
    Java提供了4中访问修饰符:private、default、protected、public,访问级别按照抒写顺序从小到大。
    具体访问权限如下:
    private(当前类访问权限):
        如果类中的成员使用private修饰,则被修饰的成员只能在此类中供内部访问。
        因此一般使用private修饰成员属性,实现封装。
    default(包访问权限):
        这里的default是指默认不写,不是修饰符叫default。如果类中的成员或者定义类时不使用
        任何访问修饰符,就称为包访问权限,default修饰的成员和类可以被同一包下的其他类访问。
    protected(子类访问权限):如果一个成员使用protected修饰,该成员可以被同一包中的其他类访问,
        也可以被不同包中的子类访问,如果方法被protected修饰,一般是希望子类重写该方法。
    public(公共访问权限):
        被public修饰的成员或类,该成员和类可以被所有类访问。访问权限最大。
        访问修饰符用于控制一个类的成员是否可以被其他类访问,因此局部变量不能使用访问修饰符,
        因为局部变量的作用范围只在所在的一对大括号中有效。对于类而言(此篇中的类不是内部类),
        只能使用public和默认访问修饰符修饰,因为类没有处于任何类的内部,所以不能使用private
        和protected修饰。
          封装代码示例:
            public class Sample {
                /**
                 * 将属性私有化,不允许其他类直接访问
                 */
                private String name;
                private int age;
                /**
                 * Sample类的无参构造器
                 */
                public Sample(){}
                /**
                 * Sample类的有参构造器
                 * @param name
                 * @param age
                 */
                public Sample(String name, int age) {
                    this.name = name;
                    /**
                     * 通过判断,保证录入的年龄合法
                     */
                    if(age < 0 || age > 120){
                        System.out.println("输入的年龄不合法");
                        return;
                    }
                    this.age = age;
                }
                /**
                 * 对外提供获取name的方法
                 * @return 返回name
                 */
                public String getName() {
                    return name;
                }
                /**
                 * 对外提供设置name的方法
                 * @param name 该参数指定对象的name
                 */
                public void setName(String name) {
                    this.name = name;
                }
               
                /**
                 * 对外提供获取age的方法
                 * @return 返回age
                 */
                public int getAge() {
                    return age;
                }
               
                /**
                 * 对外提供该方法,设置age的方法
                 * @param age 该参数指定对象的age
                 */
                public void setAge(int age) {
                    /**
                     * 通过判断,保证录入的年龄合法
                     */
                    if(age < 0 || age > 120){
                        System.out.println("输入的年龄不合法");
                        return;
                    }
                    this.age = age;
                }   
            }
        上面程序演示外部不能直接对age和name进行操作,而是通过Sample类对外提供的get和set
        方法来访问,提高了程序的可维护性。
    使用访问修饰符的基本原则:
        1、类中的属性一般使用private修饰,static修饰的类变量除外。用于辅助实现其他方法的
           方法也用private修饰。
        2、如果一个类是其他类的父类,希望其他类重写该类里的方法,而不是被外界直接调用,
           一般用protected修饰
        3、希望暴露出来给其他类自由调用的方法应该用public修饰,因此一般构造器用public修饰
继承:
    关键字:extends
    概述:类本身就是一种抽象行为,它是从对象中抽取出共性的属性,来描述某一类事物。而类与类之间
          也存在共性的属性和方法,将这些共性向上抽取到一个单独的类中(父类或基类,超类),那么
          多个类(子类)就无需重复定义,只要继承该类即可,子类可以直接访问父类中的非私有属性和行为。
          提高了代码的复用性
              例:public class b{}
                  public class A extends B{}
    好处:提高了代码的复用性,让类与类之间产生了关系,为多态提供了先决条件
    特点:java只支持单继承,不支持多继承
        例:public class A extends B{} //OK
             public class A extends B,C{}//Error
          为什么不支持多继承?
            因为多继承容易带来安全隐患,当多个父类中定义了相同功能,而功能主题不同时,
              子类对象不确定运行哪一个方法。但是java保留了这种机制,用另一种表现形式来实现,
              即多实现。不过java支持多层继承,也就是一个体系
          例:public class A extends B{}
              public class B extends C{}
          如何使用一个体系中的功能?
          查阅父类功能,创建最子类对象
          为什么是创建子类对象?
              1、有可能父类不能创建对象(如:抽象类,接口)
          2、创建子类对象可以更多的功能,包含了子类
    注意:不要纯粹为了简化代码而继承,必须是类与类之间有所属关系才可以继承(is a)
    子父类中属性的特点:
        当子父类中出现一模一样的函数时,子类对象调用该函数,会运行子类中的函数,
        如同父类中的函数被覆盖了一样,这种情况是函数的另一个特征:重写(覆盖)
        举例:
            public class Test{
                  主函数(){
                      Zi z = new Zi();
                      z.show();  //
                  }
              }
                Class Fu{
                  public void show(){Sop(“父类函数运行了”)}
                  //如果把void改为int,编译失败,因为不仅实现不了重写而且
                //违背了函数重载的特性
              }
             Class Zi{
                  public void show(){Sop(“子类函数运行了”)}
             }
    重写:
        子类覆盖父类必须保证子类访问权限大于等于父类(否则编译失败),并且参数列表和返回值
        类型以及方法名一模一样才能实现覆盖。记住:重写子父类方法要一模一样,重载只是参数
        列表不一样。
        注意事项:静态只能覆盖静态,因为覆盖必须是子父类中的函数一模一样,如果去掉其中一个类中
        的static,编译会不通过,因为违反了函数重载的特性
        演示:
            public class Test {
                public static void main(String[] args)
                {
                    Zi z = new Zi();
                    z.show();  //运行结果:子类中的函数运行了
                }
            }
             class  Fu
            {
                static void show()
                {
                    System.out.println("父类中的函数运行了");
                   
                }
            }
            class Zi extends Fu
            {
                 static void show()
                {
                   
                    System.out.println("子类中的函数运行了");
                }
            }
    子父类中构造函数的特点:
        子父类中的构造函数不能实现重写(覆盖),因为子父类中的函数名不可能一样,
        不符合重写的要求。
        为什么创建子类对象时,会先运行父类构造器?
            因为子类构造器的第一行有一条隐式语句super();而super是父类的引用,super()会访问
        父类空参数的构造函数,并且所有子类构造函数中的第一行默认都是super();当父类构造
        函数中没有空参数的构造函数时,必须手动建立super(与之对应的参数)
        演示:
            public class Person {
                String name;
                int age;
                public Person(){}
                public Person(String name, int age)
                {
                    this.name = name;
                    this.age = age;
                }
                public void sleep()
                {
                    System.out.println("睡觉");
                }
                public String toString()
                {
                    return name + "  " + age;
                }
            }
            class Student extends Person
            {
                private String stuNo;
                public Student(){}
                public Student(String name, int age, String stuNo)
                {
                      //通过super显示的给父类构造器传参
                    super(name, age);
                    this.stuNo = stuNo;
                }
                public String toString()
                {
                    return name + "  " + age+ "  " + stuNo;
                }
            }
        为什么子类一定要访问父类中的构造函数?
        因为父类中的非私有数据子类可以直接获取,所以子类在对象建立时,需要先查看父类
        是如何对这些数据进行初始化的
多态:
    初步理解:其实就是子父类(接口或实现类)中的类型转换。子类转父类即小转大,和变量一样会
        自动类型转换,或称之为类型提升,父类转子类即大转小,要做强制类型转换
    程序中的体现:父类或接口的引用指向或者接收子类的对象,不能是子类引用指向父类对象,
        自始至终多态都是子类对象在做变化
    好处:大大提高了程序的扩展性
    前提:1、必须是类与类之间有关系,要么继承,要么实现(接口)
          2、必须存在覆盖
    弊端:只能使用父类中引用指向父类中的成员,但是会由子类中方法对其覆盖,如果掉用父类中
        不存在的方法,会编译失败
    属性的特点:属性不是多态的,当子父类中出现相同的属性时,以左边的引用为准
        演示说明:
            class A{
                Int num = 3;
            }
            Class B extends A
            {
                Int num = 5;
            }
            Main(){
                A a = new B;
                Sop(a.num);//输出3
                B b = new B;
                Sop(b.num);//输出5
            }
    非静态私有函数的特点:
          1、编译时期:参阅引用变量所属类(父类)中是否有调用方法,如果有编译通过,
               如果没有编译失败
            2、运行时期:如果子类中复写了父类中的方法,运行子类中的方法,
               如果子类没有复写,运行父类自己的方法
    静态函数的特点:和属性一样,static方法不是多态的,无论是编译还是运行都参考左边
        演示说明:
            public class DemoTest {
                public static void main(String[] args) {
                    A a = new B();
                    a.show(); //运行结果:父类函数
                }
              }
              class A
              {
                public static void show()
                {
                System.out.println("父类函数");
                }
              }
              class B extends A
              {
                public static void show()
                {
                    System.out.println("子类函数");
                  }
              }
    Instanceof运算符:
        Instanceof的前面是一个引用类型变量,后面是一个类,用于判断前面的对象是否是后面类
        的实例,如果是返回true,否则返回false。避免了ClassCastException异常。
    综合案例体现:
        public class Test {
            public static void main(String[] args)
            {
                Animal a = new Cat();//类型提升,向上转型。和基本数据类型一样,
                //如:byte a = 3; int b = a;
                function(a);
                //function(new Cat);
            }
            public static void function(Animal a)
            {
                a.eat();
                //如果调用父类中不存在的方法,编译失败,因为父类中不存在子类中
                //的特有方法,但如果要使用子类中的特有方法怎么做呢?将父类的引用
                //强制转换为子类类型
                if(a instanceof Cat)
                {
                    Cat c = (Cat)a;
                    c.catchMouse();
                }else if(a instanceof Dog)
                {
                    Dog d = (Dog)a;
                    d.kanHouse();
                }    }
        }
        public interface Animal {
            public abstract void eat();
        }
        public class Cat implements Animal {
            public void eat()
            {
                System.out.println("吃鱼");
            }
            public void catchMouse()
            {
                System.out.println("抓老鼠");
            }
        }
        public class Dog implements Animal {
            public void eat()
            {
                System.out.println("吃骨头");
            }
            public void kanHouse()
            {
                System.out.println("看家");
            }
        }
              ------- android培训java培训、期待与您交流! ----------         

分享到:
评论

相关推荐

    黑马程序员_Java基础辅导班教程课件[第01期]第15天

    总结来说,《黑马程序员_Java基础辅导班教程课件[第01期]第15天》的内容可能涉及了Java语言的核心概念,包括面向对象编程、控制结构、异常处理、文件I/O、集合框架以及内存管理等。通过深入学习和实践这些知识点,...

    黑马程序员_Java基础辅导班教程课件[第01期]第13天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第13天"中,我们聚焦于Java编程语言的基础知识,这是一门面向初学者的课程,旨在帮助学员快速掌握Java开发的基本技能。第13天的课程通常会涵盖上一天(第12天)所学...

    黑马程序员_毕向东_Java基础视频教程第05天-01-面向对象(概述).avi

    黑马程序员_毕向东_Java基础视频教程第05天-01-面向对象(概述).avi

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day02

    《黑马程序员_hibernate框架开发2016版讲义...通过对黑马程序员提供的这门课程的学习,开发者不仅能掌握Hibernate的核心概念和技术,还能提升在实际项目中的数据库操作效率,为构建高效、稳定的Java应用打下坚实基础。

    黑马程序员_Java基础辅导班教程课件[第01期]第14天

    接下来,学员将深入学习类与对象的概念,这是Java面向对象编程的核心。类是对象的模板,定义了对象的属性和行为;对象则是类的实例,可以进行具体的交互和操作。在Java中,通过关键字`class`来定义类,通过`new`...

    01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip

    【标题】"01_黑马程序员_张孝祥_Java基础加强_课程价值与目标介绍.zip" 提供的是一门由黑马程序员机构推出的Java基础强化课程,由讲师张孝祥主讲,旨在深入讲解Java编程的基础知识并进行能力提升。 【描述】中提到...

    黑马程序员_毕向东_Java基础源码.rar

    这个名为“黑马程序员_毕向东_Java基础源码.rar”的压缩包文件,包含了丰富的Java基础源代码实例,对于初学者来说,是深入了解Java编程的良好资源。 一、Java基本语法 Java语言以其严格的类型检查和面向对象特性...

    黑马程序员_Java基础辅导班教程课件[第01期]第11天

    2. **封装**:封装是面向对象编程的三大特性之一,通过访问控制修饰符(如public、private)来保护数据,防止外部代码随意修改,确保数据安全。 3. **继承**:Java中的继承允许一个类(子类)继承另一个类(父类)...

    黑马程序员_hibernate框架开发2016版讲义和笔记资料_day1_day2_day3_day4

    《Hibernate框架深度解析——基于黑马程序员2016版教学资料》 Hibernate,作为一个强大的对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供数据持久化的对象模型,使得开发者可以...

    黑马程序员_(适合初学者入门的Java基础视频)

    3. **面向对象编程**:深入讲解Java的核心特性——面向对象编程,包括类的定义、对象的创建与使用、封装、继承和多态等概念。 4. **数组和集合框架**:介绍数组的使用,以及ArrayList、LinkedList、HashSet、...

    黑马程序员_Java基础辅导班教程课件[第01期]第8天

    1. **面向对象编程(OOP)**:Java是一门面向对象的语言,第8天的课程可能会重点讲解OOP的四大特性——封装、继承、多态和抽象。封装是隐藏对象的属性和实现细节,仅对外提供公共访问方式;继承允许一个类(子类)...

    黑马程序员_Java基础辅导班教程课件[第01期]第5天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第5天"中,我们主要聚焦于Java编程语言的基础知识。这是一份专为初学者设计的教学资源,旨在帮助学员扎实地掌握Java编程的基本概念和技能。第5天的课程可能涵盖了变量...

    黑马程序员_Java基础辅导班教程课件[第01期]第10天

    4. **封装、继承和多态**:这是面向对象编程的三大特性。封装隐藏了对象的实现细节,提供了公共接口供外部使用;继承允许子类继承父类的属性和方法,实现了代码复用;多态则允许不同类的对象对同一消息做出不同的...

    黑马程序员_Java基础辅导班教程课件[第01期]第4天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第4天"中,我们可以推测这是针对初学者的Java编程课程,旨在帮助学员掌握Java的基础知识。 在课程的第4天,可能讲解了以下核心概念: 1. **类(Class)**:`Demo.class...

    黑马程序员_Java基础辅导班教程课件[第01期]第6天

    在"黑马程序员_Java基础辅导班教程课件[第01期]第6天"中,我们主要聚焦于Java编程语言的基础知识,这通常包括了变量、数据类型、运算符、流程控制语句等核心概念。此课程面向初学者,旨在为学员构建坚实的Java编程...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    1、 面向对象、跨平台性、健壮性、安全性、可移植性、多线程性、动态性等。 2、 JRE(Java Runtime Environment,Java 运行时环境),它相当于操作系统部分,提供了 Java 程序运 行时所需要的基本条件和许多 Java ...

    黑马程序员_Java基础辅导班教程课件[第01期]第7天

    2. **封装**:封装是面向对象编程的三大特性之一,它隐藏了对象的内部细节,仅通过公共接口(方法)与外界交互,以提高代码的安全性和可维护性。 3. **继承**:继承允许一个类(子类)继承另一个类(父类)的属性和...

    黑马程序员_Java基础辅导班教程课件[第01期]第12天

    黑马程序员提供的"Java基础辅导班教程课件[第01期]第12天"旨在帮助学员深入理解Java语言的核心概念,进一步提升编程技能。在这个阶段的学习中,学员将接触到Java的高级特性以及实际应用。 首先,"day12"这个目录很...

    黑马程序员入学Java精华总结

    ### 黑马程序员入学Java精华总结 #### 一、Java概述与基础知识 1. **何为编程?** - 编程是指通过编写计算机能够理解的指令来解决问题或完成特定任务的过程。这些指令通常被组织成算法,并使用某种编程语言实现。...

    黑马程序员_从零开始征服Android之旅(第二季)源码和笔记(上)

    学习Java的面向对象编程概念,如类、对象、继承、多态等,以及异常处理和集合框架,是Android开发的前提。另外,Kotlin作为现代的Android开发语言,也被越来越多的开发者采用,其简洁的语法和安全特性使得编写代码...

Global site tag (gtag.js) - Google Analytics