11月韩顺平第十章学习

10.28 -p388开始看韩顺平的第十章面向对象编程
之前因为感染很久没有用耳机。。。。。
开心的是科研的模型跑出来了!!(断断续续改了三个星期,终于改出来了)
10.30 p389

类变量和类方法

一个问题:一个类,新建一个对象就记录一下,则每new一次用count++?非常麻烦(原因:count独立于对象)
思考:count变为所有对象共享?----->类变量
不创建实例,只通过类名就访问方法?----->类方法
类变量
又叫静态变量
在类内声明一个 public static int count

  • (该变量会被类所有对象实例共享)
  • 可通过类名访问,在类加载时生成,即使没有对象实例也可访问,在类消亡时销毁
  • 内存布局:静态域存在class对象,class对象在堆里
  • 什么时候使用:某类所有对象都共享
    类方法
    public/xx +static+ 类型 名字(){}
  • 可通过类名或对象名访问
  • 不允许使用与对象有关的关键字!如this,super
  • 只能访问静态方法或静态成员!但普通方法可访问静态成员或普通成员!
  • 内存布局:与普通方法同,结构信息储存在方法区,随着类加载,但是无this参数(普通方法隐含this)
  • 什么时候使用:当方法不涉及与对象相关的成员,当希望不创建实例也能使用(当做工具)如math类,如实际开放中通用的方法冒泡排序等

构造器那块写的挺好的,自动计数,而且id就有了

在这里插入图片描述

main的理解

public static void main(String[] args)

  1. main方法是虚拟机调用的,必须public(虚拟机根本不在这个类)
  2. 虚拟机调用时不必创建对象,必须static
  3. args数组是保存执行java命令时传递给运行类的参数(在cmd中 javac 类名.java xx1,xx2,xx3)xx1、2、3即被传入args
  4. main的语法:可调用main中的静态成员,但不能调用非静态成员(相当于看成这只是一个叫main的静态方法!)
  5. 扩展3—在idea中传入参数见下图
    在这里插入图片描述

代码块

没接触过,还要看看
p386在这里插入图片描述

如构造器重载时,可将相同语句放入代码块,比构造器先调用!在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单例设计模式

在这里插入图片描述
饿汉式
在这里插入图片描述
public static Cat getInstance(){ if(cat==null)cat=new Cat(“xxx”) return cat;}懒汉式:类名 对象名,但后面没有= new 类名 ,而是getinstance里面if 对象名为空,则 对象名 = new 类名(这时才调用构造器)
在这里插入图片描述

final

何时用final:类不被继承,方法不被覆盖,值不被修改
在这里插入图片描述
常量必须给值,常量可以在定义/构造器/代码块 赋值。若为static final ,则不能在构造器中赋值。(因为static,则比构造器先加载,常量加载后还未赋值)在这里插入图片描述

  • final class 后就不必final 方法了
  • final不能修饰构造器
  • final与static一起用效率更高,不会导致类加载
  • 包装类Integer,Double,Float,Boolean都是final,String也是

抽象类

  • TestTemplatep p402自己写代码

出现父类方法不确定的问题:animal有个eat类,但是不知道eat什么----->抽象类
抽象类:abstract class xxx

  • 抽象类只能修饰类/方法,更多作用在于设计,需要被继承重写
  • 抽象类不能被实例化
  • 抽象类可以没有abstract方法,但如果有,一定要声明为abstract类
    抽象方法就是没有实现的方法(没有方法体)
  • public void eat();会报错,后要有{}方法体
  • public abstract void eat();不会报错
  • 子类继承一定要实现抽象方法
  • 抽象方法不能用private、final、static修饰(则不能重写)

System.currenttimemillis()得到当前时间

接口

三个程序员写三个类管理mysql,oracle,db2数据库,功能相似,但是三个写出了f1()/con()/connect()?维护起来调用起来非常不方便?能不能写的规范一点,如规定全部使用connect做类名?-----用接口
接口即:将一些没有实现的方法封装在一起,当类要使用时,必须具体写出来(like抽象方法的集合)
jdk7前均为抽象方法,jdk8后可有方法具体实现(需使用default/static修饰)

  • 接口就是一个规范
  • 实现接口,就是实现接口内定义的方法
  • 默认public方法,可不写public
  • 普通类用接口, 必须全部实现,抽象类可不实现
  • 一个类可有多个接口 class xx implements x1,x2{}
  • 接口中的属性其实全是(public static final)类型 xx=xx(必须赋值),可通过 接口名.属性来调用
  • 接口不可继承其他类,可继承(多个)接口
  • 修饰符只能是默认or public

接口和继承类会有什么不同?
继承,子类自动拥有父类的功能,如果子类需要扩展,可以通过实现接口来扩展,接口是对单继承的补充
继承:解决代码复用性和可维护性 xx is a
接口:设计规范,更加灵活 xx like a 可实现代码解耦(接口规范性+动态绑定)
在这里插入图片描述
接口:
参数多态
可有多态数组(like向下转型,instanceof判断)
有多态传递现象
在这里插入图片描述
在这里插入图片描述

必须明确谁的,要么super.x,或A.x

在这里插入图片描述

内部类

一个类的内部嵌套了另一个类结构,则内部这个类称为内部类
类的五大成员:属性、方法、构造器、代码块、内部类
内部类的分类
外部类局部位置(eg方法内):局部内部类,匿名内部类
外部类成员位置:成员内部类,静态内部类

局部内部类
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

匿名内部类
(非常重要)
是类,是内部类,跟局部内部类一样定义在外部类局部位置,且没有名字,同时还是个对象
一个问题:有个方法只使用一次,但是为了这个方法定义了一个类,有点浪费?
查找运行类型:xxx(实例名).getclass()

  • 到底传参给父类还是匿名类的构造器?

成员内部类
即在外部类的成员位置,且无static修饰(不需要在成员方法里面了)

  • 可加任意修饰符(相当于成员变量)
    在这里插入图片描述
    静态内部类
    即在外部类的成员位置,且有static修饰(不需要在成员方法里面了)
    差不多,就是只能访问static的

不同:方法一的前面的成员变量类需要new Outer.newInner(),有两个new
方法二的getinner可以写成static或非static

这里test是外部类不再是外部其他类,main也写在test里面 输出5 5

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值