zoukankan      html  css  js  c++  java
  • JavaSE (面向对象)

    JavaSE (面向对象)

    写在前面:分享技术,共同进步,把之前写的笔记搬运至博客,有不足请见谅*,相关意见可评论告知 ╰( ̄ω ̄o)

    编程路漫漫,学习无止尽!

    面向对象三大特性: 封装,继承,多态

    封装

    在这里插入图片描述

    封装的优点
    1.提高程序的安全性,保护数据
    2.隐藏代码的实现细节
    3.统一接口
    4.增加系统的可维护性

    public class application {
    
        public static void main(String[] args) {
            final student s1 = new student();   //?
            s1.money=1.0 ;
    //        s1.String ="" ;      报红因为私有
    
            String name = s1.getName();
    
            s1.setName("LZH");
            System.out.println(s1.getName());
    
            s1.setAge(12)  ;  // 不合法
            System.out.println(s1.getAge());
    
        }
    }
    
    //————————————————————————————————————————————————————————————————————————————————————————————
             
    public class student {
                     // 封装一般对属性进行封装,方法也可,但一般不
    
                     // 属性私有
                     private String name;
                     private int id;
                     private char sex;
                     private int age;
    
                     public double money;
    
    
                     //但提供一些可以操作这个属性的方法
                     // 提供一些public 的get,set 方法
    
                     // get 获得这个数据
                     public String getName() {
                         return this.name;
                     }
    
    
                     // set 给这个数据设置值
                     public void setName(String name) {
                         this.name = name;
    
                     }
    
                     // 方法封装的应用
                     public int getAge() {
                         return age;
                     }
    
                     // 对其进行内部操作
                     public void setAge(int age) {
                         if (age > 120 || age < 0) {
                             this.age = 3;
                         } else {
                             this.age = age;
                         }
    
                     }
                 }
    
    

    继承

    继承图解

    在这里插入图片描述

    继承中成员变量的访问特点

    在父子类的继承关系当中,如果成员变量重名,则创建子类对象时,访问有两种方式:

    重要

    1. 直接通过子类对象访问成员变量:
      等号左边是谁,就优先用谁,没有则向上找。
    2. 间接通过成员方法访问成员变量:
      该方法属于谁(再哪里定义),就优先用谁,没有则向上找。

    在这里插入图片描述

    注意子类中三种成员变量重名的情况
    局部变量 直接写成员变量名
    本类的成员变量 this.成员变量名
    父类的成员变量名 super.成员变量名

    继承方法中的覆盖重写

    在这里插入图片描述
    方法覆盖重写的注意事项

    1. 必须保证父子类之间方法的名称相同,参数列表也相同。
      @Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
      这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。

    2. 子类方法的返回值必须【小于等于】父类方法的返回值范围。
      小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是Object的子类。

    3. 子类方法的权限必须【大于等于】父类方法的权限修饰符。
      小扩展提示:public > protected > (default) > private
      备注:(default)不是关键字default,而是什么都不写,留空。

    4. 成员变量是不能覆盖重写( @override )的 int num = 10 ;

    设计原则
    对于已经投入使用的类,尽量不要进行修改,推荐定义一个新的类,来重复利用其中的共性内容,并添加改动新内容。

    在IDAE中查看树的快捷键 ctrl +H

    值传递与引用传递

    在这里插入图片描述

    构造器

    快捷键 alt + insert (生成构造器)
    在这里插入图片描述

    package oop.objectClass;
    
    public class constructor_04 {
        // 一个类即使什么都不写,他也会存在一个方法
        // 显示定义的构造类
    
        String name ;
    
        // 实列化初始值
        // 1.使用new关键字,本质是调用构造器
    
        // 显化  无参构造
        public constructor_04() {
            this.name = "Qy";
        }
    
        // 有参构造      注意一旦定义了有参构造,无参就必须显示定义
        public  constructor_04(String name){
            this.name = name ;        // 前者name 为7行 String name  后者name为传进来name 18
    
        }
    
    
    }
    
    //___________________________________________________________________________
    
    
    package oop.objectClass;
    
    //   一个项目中因该只有一个方法
    public class Application_02 {
        public static void main(String[] args) {
            // 类  抽象的   实例化
            // 类实列化后会返回一个自己的对象
            // 以下第二个单词(student)就是一个Student 类的具体实列
    
    //        Student student = new Student() ;
    //        Student xiaoming  = new Student() ;
    //        Student xiaohong = new Student() ;    // 由于第一个单词报错
              // 原因与类名相同    第二个单词  对象名可以不同
    
            classAndObject_03 student = new  classAndObject_03() ;
            classAndObject_03 xiaoming  = new  classAndObject_03() ;
            classAndObject_03 xiaohong = new  classAndObject_03() ;
    
            xiaoming.name ="小明" ;
            xiaoming.age = 3 ;
    
            System.out.println(xiaoming.name);
            System.out.println(xiaoming.age);
    
            System.out.println(xiaohong.name);
    
    
    
            //   constructor_04 部分·
            constructor_04 constructor_04 = new constructor_04();
            System.out.println(constructor_04.name);
    
    
        }
    }
    

    Super

    (一)继承关系中,父子类构造方法的访问特点:

    1. 子类构造方法当中有一个默认隐含的“super()”调用,所以一定是先调用的父类构造,后执行的子类构造。
    2. 子类构造可以通过super关键字来调用父类重载构造。
    3. super的父类构造调用,必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。
      总结:
      (二)子类必须调用父类构造方法,不写则赠送super();写了则用写的指定的super调用,super只能有一个,还必须是第一个。

    (三)super关键字用来访问父类内容,而this关键字用来访问本类内容。用法也有三种:

    1. 在本类的成员方法中,访问本类的成员变量。
    2. 在本类的成员方法中,访问本类的另一个成员方法。
    3. 在本类的构造方法中,访问本类的另一个构造方法。
      在第三种用法当中要注意:
      A. this(...)调用也必须是构造方法的第一个语句,唯一一个 ※
      B. super和this两种构造调用,不能同时使用。

    ※ 详细见图分析
    在这里插入图片描述

    super 注意点

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

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

    3.super 和 this 不能同时调用构造方法 (同为第一优先级矛盾)

    super 与 this 的区别

    在这里插入图片描述

    两者关系图解
    在这里插入图片描述

    抽象方法与抽象类

    抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束。
    抽象类:抽象方法所在的类,必须是抽象类才行。在class之前写上abstract即可。

    如何使用抽象类和抽象方法:

    1. 不能直接创建new抽象类对象。
    2. 必须用一个子类来继承抽象父类。
    3. 子类必须覆盖重写抽象父类当中所有的抽象方法。
      覆盖重写(实现):子类去掉抽象方法的abstract关键字,然后补上方法体大括号。
    4. 创建子类对象进行使用。

    在这里插入图片描述

    public abstract class Fu{
       public abstract void eat() ; 
    }
    

    使用注意事项

    在这里插入图片描述

    在这里插入图片描述
    代码体现如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    j在这里插入图片描述
    在这里插入图片描述

    多态

    体现形式,父类引用指向子类对象。
    格式:
    父类名称 对象名 = new 子类名称()
    接口名称 对象名 = new 实现类名称()

    访问成员变量的两种方式:

    1. 直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
    2. 间接通过成员方法访问成员变量:看该方法属于谁,优先用谁,没有则向上找。

    多态方法的访问规则是:
    看new的是谁,就优先用谁,没有则向上找。

    口诀:编译看左边,运行看右边。

    对比一下:
    成员变量:编译看左边,运行看左边。
    成员方法:编译看左边,运行看右边。

    多态好处的实列体现:
    在这里插入图片描述

    对象的向上转型与向下转型

    类比数据类型的转化:
    低 -------------> 高
    byte,short,char -> int -> long -> float -> double

    package base;
    
    public class typeCast_03 {
        public static void main(String[] args) {
    
            int i =128 ;
            byte b = (byte)i ; // 内存溢出    // 强制转换
            double c = i ;   // 自动转换
            // 强制转换   (类型)变量名   高 - 低
            // 直动转换   低 - 高
            System.out.println(i);
            System.out.println(b);
            System.out.println(c);
    
            System.out.println("______");
    
            // 例子2
            char d = 'a' ;
            int e =d+1  ;  // 自动转换   低 - 高
            System.out.println(e);
            System.out.println((int)e);  //  强制转换
    
            int money = 10_0000_0000 ;  // jdk7 新特性
            int years = 20 ;
            int total = money*years ;    // 数据溢出
            long  total2 =  money*years ;  // 默认int 在转换之前已存在问题
            // 正解
            long total3 = money*((long)years)  ;
            System.out.println(total);
            System.out.println(total2);
            System.out.println(total3);
    
        }
    }
    
    

    方法图解:
    在这里插入图片描述

    Instanceof

    引言: 如何才能知道一个父类引用的对象,本来是什么类?如果希望调用子类特有方法,则需要向下转型。

    instanceof 是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型。

    格式
    对象 instanceof 类名称

    eg:
    在这里插入图片描述

    图解分析
    在这里插入图片描述

    面向对象小结

    1.类与对象: 类是一个模板,抽象的,对象是一个具体的实列(先有对象再有类)

    2.方法 : 定义,调用

    3.对象的引用

    引用类型,除八大基本类型外,对象是通过引用来操作的:栈 -> 堆

    4.属性: 字符field 成员变量

    默认初始化 数字0 0.0

    ​ char u0000

    ​ boolean false

    ​ 引用 null

    属性格式: 修饰符 属性类型 属性名 = 属性值

    5、对象的创建和使用

    必须使用new 关键字创造对象, 构造器 Person Qy new Qy() ;

    对象的属性 Qy.name

    对象的方法 Qy.sleep()

    6.类: 静态的属性 属性 动态的行为 方法

    写在最后:全栈方向,前端已经大部分学完,将会以复习的形式出现在博客,大家敬请期待哈~

  • 相关阅读:
    day30 python类的继承,抽象类等
    20170702-变量说明,静态方法,类方法区别,断点调试,fork,yield协程,进程,动态添加属性等。。
    day29 面向对象入门
    day28 import,from * import *,__name__
    day27 模块:正则re, configparser, subprocess
    day26 re正则表达式
    MD5的学习与练习
    HBase
    Struts13---Ognl
    Struts12---文件的下载
  • 原文地址:https://www.cnblogs.com/lzhCreate/p/13266848.html
Copyright © 2011-2022 走看看