Java入门笔记-(面向对象:封装,多态,继承)

来源:互联网 发布:csgo淘宝买枪 编辑:程序博客网 时间:2024/06/05 00:44

这里写图片描述

包名命名规范

  • 英文字母小写(推荐)
  • 域名倒序 + 模块 + 功能

跨包类调用(解决同名文件冲突)

定义包 package 包名倒入包 import 包名.类名(相对于*,优先级更高)在程序直接加包名.类名(两个位置)ctrl + shift + o 快速导入包alt + / 获取提示菜单

这里写图片描述

面向对象

这里写图片描述

这里写图片描述

创建类

这里写图片描述
这里写图片描述

引用类

这里写图片描述
这里写图片描述

成员属性默认带有初始值

这里写图片描述

这里写图片描述

单一功能原则

这里写图片描述
有且只有一个引起功能变化的原因

new关键字(对象引用)

声明对象:在内存中开辟空空间(null),存放堆地址
实例化对象:在内存中开辟空间,初始化

这里写图片描述

无参(有参)构造方法

这里写图片描述

这里写图片描述

这里写图片描述

赋值错误?

这里写图片描述

就近原则

这里写图片描述

this

这里写图片描述

普通方法和构造方法重名不推荐

这里写图片描述

构造方法不能被普通方法调用,只能在构造方法之间完成

这里写图片描述

封装(private)

这里写图片描述

封装步骤

这里写图片描述

这里写图片描述

F10 逐过程
F11 逐语句
逐语句,就是每次执行一行语句,如果碰到函数调用,它就会进入到函数里面。
逐过程,碰到函数时,不进入函数,把函数调用当成一条语句执行。
跳出,是当你进入到函数内,跳出可以让你直接执行函数内剩余的语句,直到返回到该函数被调用时的后面的语句处。
“逐语句”和“逐过程”的差异仅在于它们处理函数调用的方式不同,这两个命令都指示调试器执行下一行的代码。如果某一行包含函数调用,“逐语句”仅执行调用本身,然后在函数内的第一个代码行出停止,而“逐过程”执行整个函数,然后在函数外的第一行处停止。
如果要查看函数调用的内容,请使用“逐语句”。
若要避免单步执行函数,请使用“逐过程”。

快速生成属性的操作方法(set只写,get只读):右键->Source->Generate Getters and Setters

static静态信息(属性和方法)

这里写图片描述

两种调用方式

  • 类名.成员(推荐)
  • 对象名.成员
    不同类对象共享。类加载时产生,销毁时释放,生命周期长

    静态方法不能直接调用一个类中的非静态成员,只能直接调用静态成员
    静态方法不能使用this
    只能通过对象实例化后,对象.成员方法的方式访问静态方法
    static不能创建方法内的局部对象
    在普通成员方法中,可以直接访问类中的静态成员
    在定义内部类的时候,可以在其前面加上一个权限修饰符static。


这里写图片描述

静态代码块(调用一次),普通代码块(定义在方法中),构造代码块(定义在类中)

![这里写图片描述](http://img.blog.csdn.net/20170804184910719?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM5MzY0ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)![这里写图片描述](http://img.blog.csdn.net/20170804193153521?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM5MzY0ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

继承

is-a(英语:subsumption,包含架构)指的是类的父子继承关系
满足is a的关系就可以形成继承关系
- 代码复用
- 缩短开发周期

![这里写图片描述](http://img.blog.csdn.net/20170807204552436?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM5MzY0ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)![这里写图片描述](http://img.blog.csdn.net/20170804195400670?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzM5MzY0ODE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

单继承实现

子类可以访问父类非私有成员
这里写图片描述

方法重写(继承:子类重写父类)

  • 语法规则(都要与父类继承的方法相同)
    • 返回值类型
    • 方法名
    • 参数类型,顺序,个数

这里写图片描述

这里写图片描述

访问修饰符

  • 公有的: public
  • 私有的: private
  • 受保护的: protected
  • 默认

这里写图片描述

super父类对象的引用(重名时)

super.父类对象
- 父类构造方法不允许被继承,不允许被重写,但是会影响子类对象的实例化
- 子类构造默认调用父类无参构造方法
- super(…参数)
- 这里写图片描述

这里写图片描述
这里写图片描述

继承后的初始化顺序

问题:静态成员优于静态代码块先执行?
访问修饰符不影响成员加载顺序,跟书写位置有关

这里写图片描述

this当前对象,super父类对象

  • 不能再静态方法中调用
  • this();会优先调用无参构造的方法
  • 构造方法中super和this不能并存

这里写图片描述

这里写图片描述

Object类(重写)

这里写图片描述

注意空指针异常
- 例:String类型重写了Object类型的equals方法
- Object equals 判断两个引用在内存地址中是否相同(是否指向同一个对象),相当于==
- String equals 判断传入的字符串是否相等

这里写图片描述

这里写图片描述

这里写图片描述

  • 继承Object的toString方法,打印出对象的字符串的表现形式(类型信息 + @ +地址信息)
  • 输出对象名时,默认会直接调用类中的toString

final关键字的使用(不允许继承)

  • 位置可以和修饰资源符互换 public final class | fnal public class
  • 该类没有子类
  • final 方法 : 该方法不允许被子类重写,但是可以正常被子类继承使用
  • final 方法内局部变量: 只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改
  • final 类中成员属性: 赋值过程:1 定义直接初始化 2 构造方法 3 构造代码块。 如果没有进行赋值,报错

这里写图片描述

注解

这里写图片描述

    @Override//  子类重写父类    public void eat() {        // TODO Auto-generated method stub        super.eat();    }

设计模式

这里写图片描述
这里写图片描述

单例设计模式

这里写图片描述

饿汉式:创建对象实例直接初始化,空间换时间,线程安全package com.hanxiao.signleton;public class SingletonOne {//  私有构造    private SingletonOne(){    }//  创建私有静态实例    private static SingletonOne instance  = new SingletonOne();//  公有静态方法返回静态实例对象    public static SingletonOne getInstance(){        return instance;    }}
懒汉式:类内实例对象创建时并不直接初始化,直到第一次调用方法时,才能完成初始化操作,时间换空间。线程存在风险package com.hanxiao.signleton;public class SingletonTwo {//  私有构造方法    private SingletonTwo(){    }//  静态实例对象    private static SingletonTwo instance = null;//  公有静态方法返回并创建静态实例对象    public static SingletonTwo getInstance(){        if(instance == null)            instance = new SingletonTwo();        return instance;    }}
  • 解决懒汉式线程风险
    • 同步锁
    • 双重校验锁
    • 静态内部类
    • 枚举

这里写图片描述

多态(Polymorphism,最重要)

意味着允许不同类的对象对同一消息做出不同的响应

  • 必要条件:
    • 满足继承关系
    • 父类引用指向子类对象
  • 多态分类
    • 编译时多态
      • 别名:设计时多态
      • 通过方法重载实现
    • 运行时多态(JAVA)
      • 程序运行时动态决定调用哪个方法

这里写图片描述

向上(隐式,自动)转型:子类对象转型为父类对象,父类引用指向子类实例
小类转大类
可以调用子类重写父类的方法以及父类派生的方法
注意:父类中的静态方法无法被重写,所以向上转型之后,只能调用到父类原有的静态方法
无法调用子类独有方法

向下(强制类型转换)转型
子类引用指向父类对象,此类必须进行强转
instanceof 判断是否满足对象条件(提高安全性) 判断某对象(父类)是否有该实例的特征

这里写图片描述

抽象类 abstract

不允许直接实例化,可以通过向上转型,指向子类实例
解决问题:限制子类的设计随意性,无意义父类的实例化

这里写图片描述

抽象方法

  • 不允许包含方法体
  • 子类中需要重写父类的抽象方法,否则子类需要变成抽象类
  • static, final,private 不能与abstract并存

这里写图片描述

问题:一个孩子怎么有多个爸爸?

  • 大哥大
    • 智能手机
      • 功能手机
        • 游戏手机
    • 智能手表,电脑,怎么并入呢?(相同行为)
      解决通过接口进行行为关联,也就是行为继承

这里写图片描述

接口(抽象方法和常量)

这里写图片描述

  • 命名规则,以I打头
  • implements 接口名称

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

接口(默认方法和静态方法)

这里写图片描述

这里写图片描述

多接口中重名默认方法处理的解决方案

一个类可以实现多接口
新建一个自己的重名默认方法

接口继承

这里写图片描述

内部类(更好的封装)

这里写图片描述
这里写图片描述

这里写图片描述

成员内部类(最常见,普通内部类)

这里写图片描述

静态内部类

这里写图片描述

方法内部类

类对象生命周期仅在方法里有效,在方法执行完毕后销毁

这里写图片描述

匿名内部类

  1. 类定义,类创建一起完成
  2. 匿名内部类没有类型名称,实例对象名称
  3. 编译后的文件命名:外部类$数字.class
  4. 无法使用private,public,protected,abstract,static修饰
  5. 无法编写构造方法,不过可以使用构造代码块
  6. 不能出现静态成员
  7. 匿名内部类可以实现接口也可以继承父类,但是不可兼得

这里写图片描述

这里写图片描述

阅读全文
0 0
原创粉丝点击