zoukankan      html  css  js  c++  java
  • Java:面向对象三大特征

    学习资料

    b站狂神说:https://www.bilibili.com/video/BV12J41137hu

    访问修饰符

    资料来源:https://www.runoob.com/java/java-modifier-types.html#protected-desc

    Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

    • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
    • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
    • public : 对所有类可见。使用对象:类、接口、变量、方法
    • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
    • 接口及接口的成员变量和成员方法不能声明为 protected
    修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
    public Y Y Y Y Y
    protected Y Y Y N
    default Y Y Y N N
    private Y N N N N

    非访问修饰符

    为了实现一些其他的功能,Java 也提供了许多非访问修饰符。

    static 修饰符,用来修饰类(静态)方法和类(静态)变量。

    final 修饰符,用来修饰类、方法和变量,final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。

    abstract 修饰符,用来创建抽象类和抽象方法。

    synchronized 和 volatile 修饰符,主要用于线程的编程。

    封装

    追求高类聚,低耦合

    属性私有,提供get/set方法

    package com.zy7y.oop;
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 下午2:23
     * @Description: 封装
     */
    public class Packaging {
        // 私有属性,只能在当前类使用
        private String name;
    
        // 提供对外的set方法设置值
        public void setName(String name) {
            this.name = name;
        }
    
        // 提供对外提供的get方法取到值
        public String getName() {
            return name;
        }
    }
    

    启动文件

    package com.zy7y.oop;
    
    import sun.net.www.http.HttpClient;
    
    import java.io.File;
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/14 下午11:58
     * @Description: 启动方法
     */
    public class Application {
        public static void main(String[] args) {
            Packaging packaging = new Packaging();
            packaging.setName("哈哈");
            System.out.println(packaging.getName());
        }
    }
    
    

    封装的意义

    提供程序的安全性,保护数据

    隐藏代码接口的实现

    统一接口

    增加可维护性

    继承

    关键字 extends

    Java 中只有单继承,直接只能继承一个,间接可以继承多个

    package com.zy7y.oop;
    // 父类Person,所有类默认继承Object类
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 上午12:04
     * @Description: 构造方法: public 类名(), 无返回值
     */
    public class Person {
        private int age;
        String name;
        // 类中默认有一个无参构造方法
    
        // 定义有参构造方法;构造方法的作用,初始化属性, 如果定义了有参构造方法,还需要无参构造方法,需要显示定义无参构造方法
        public Person(String name){
            this.name = name;
        }
        // alt + insert 快速生成构造方法
    
    
        // 显示定义无参构造方法
        public Person() {
            this.name = "zy7y";
        }
        private void privateMethod(String msg){
            System.out.println("私有方法,无法继承!" + msg);
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    package com.zy7y.oop;
    //子类继承Person类
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 下午2:31
     * @Description:
     */
    // 继承Person类, Teacher 为Person的子类/派生类
    public class Teacher extends Person {
        // 子类可以继承父类,非私有的属性与方法
    
        private String name = "子类";
    
        public void test(){
            System.out.println(name);
            System.out.println(this.name); // 调用本地的name
            System.out.println(super.name); // 调用父类的name
        }
    }
    
    

    super注意点

    super调用父类的构造方法,必须在构造方法的第一个

    super 必须只能出现在子类的方法或者构造方法中

    super和this不能同时调用构造方法

    this、super区别

    this:代表当前对象的引用

    super:代表父类对象的引用

    this: 没有继承也可以使用

    super:只能在继承条件后才可使用

    this():本类的构造

    super(): 父类的构造

    方法重写

    重写都是方法的重写,和属性无关,重写只能重写非静态方法,只有public修饰的方法。被fianl修饰的方法也不可以被重写

    需要继承关系,子类重写父类的方法

    方法名必须相同

    参数列表必须相同

    修饰符:范围可以被扩大,不能缩小 public > protected > default > private

    抛出的异常:范围可以被缩小,不能扩大

    重写:子类和父类的方法必须一致,方法体不同!

    package com.zy7y.oop;
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 下午2:31
     * @Description:
     */
    // 继承Person类, Teacher 为Person的子类/派生类
    public class Teacher extends Person {
        // 子类可以继承父类,非私有的属性与方法
    
        private String name = "子类Teacher";
    
    
        @Override
        public void test() {
            System.out.println(name);
            System.out.println(this.name); // 调用本地的name
        }
    }
    
    package com.zy7y.oop;
    
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 上午12:04
     * @Description: 构造方法: public 类名(), 无返回值
     */
    public class Person {
        private int age;
        String name = "父类Person";
        // 类中默认有一个无参构造方法
    
        // 定义有参构造方法;构造方法的作用,初始化属性, 如果定义了有参构造方法,还需要无参构造方法,需要显示定义无参构造方法
        public Person(String name){
            this.name = name;
        }
        // alt + insert 快速生成构造方法
    
    
        // 显示定义无参构造方法
        public Person() {
            this.name = "zy7y";
        }
        private void privateMethod(String msg){
            System.out.println("私有方法,无法继承!" + msg);
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void test(){
            System.out.println("父类Person"); // 调用本地的name
        }
    }
    

    多态

    同一方法根据发送对象的不同而采用多种不同的行为方式

    条件:

    • 有继承关系

    • 子类重写父类方法

    • 父类引用指向子类对象

    ⚠️:多态是方法的多态,属性没有多态性

    类型转换异常: ClassCastException

    // 启动文件
    package com.zy7y.oop;
    
    /**
    * @ProjectName: JavaSE
    * @PackageName: com.zy7y.oop
    * @Author: zy7y
    * @Date: 2020/8/14 下午11:58
    * @Description: 启动方法
    */
    public class Application {
       public static void main(String[] args) {
           Teacher teacher = new Teacher();
           teacher.test();
           System.out.println();
    
    
           // (向上转型)父类引用指向子类, 父类Person,子类Teacher, 对象能执行那些方法与左边类型有关,与new 无关
           Person teacher1 = new Teacher();
           teacher1.test();
    
           // eat方法 只有子类有
           teacher.eat();
           // 父类中没有
           teacher1.eat();
    
           // (向下转型,可能会丢失一些方法)高类型 转 底类型,用强转,
           ((Teacher)teacher1).eat();
    
    
       }
    }
    
    
    // 父类
    package com.zy7y.oop;
    
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 上午12:04
     * @Description: 构造方法: public 类名(), 无返回值
     */
    public class Person {
        private int age;
        String name = "父类Person";
        // 类中默认有一个无参构造方法
    
        // 定义有参构造方法;构造方法的作用,初始化属性, 如果定义了有参构造方法,还需要无参构造方法,需要显示定义无参构造方法
        public Person(String name){
            this.name = name;
        }
        // alt + insert 快速生成构造方法
    
    
        // 显示定义无参构造方法
        public Person() {
            this.name = "zy7y";
        }
        private void privateMethod(String msg){
            System.out.println("私有方法,无法继承!" + msg);
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void test(){
            System.out.println("父类Person"); // 调用本地的name
        }
    }
    
    
    // 子类
    package com.zy7y.oop;
    
    /**
     * @ProjectName: JavaSE
     * @PackageName: com.zy7y.oop
     * @Author: zy7y
     * @Date: 2020/8/15 下午2:31
     * @Description:
     */
    // 继承Person类, Teacher 为Person的子类/派生类
    public class Teacher extends Person {
        // 子类可以继承父类,非私有的属性与方法
    
        private String name = "子类Teacher";
    
    
        @Override
        public void test() {
            System.out.println(name);
            System.out.println(this.name); // 调用本地的name
        }
    
        public void  eat(){
            System.out.println("eat");
        }
    }
    

    instanceof

            // 对象 instanceof 类 ,判断是否有关系
            System.out.println(person instanceof Object);
            System.out.println(teacher1 instanceof Object);
            System.out.println(teacher instanceof Object);
    
    作者:zy7y
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    55. 跳跃游戏
    45. 跳跃游戏 II
    对称的二叉树
    字符型图片验证码,使用tensorflow实现卷积神经网络,进行验证码识别CNN
    python版本升级及pip部署方法
    Two Sum [easy] (Python)
    工作中常用的linux命令(持续更新)
    PAT-1001. 害死人不偿命的(3n+1)猜想 (15)
    C++二维数组的动态声明
    19. Remove Nth Node From End of List(C++,Python)
  • 原文地址:https://www.cnblogs.com/zy7y/p/13509087.html
Copyright © 2011-2022 走看看