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)
- main方法是虚拟机调用的,必须public(虚拟机根本不在这个类)
- 虚拟机调用时不必创建对象,必须static
- args数组是保存执行java命令时传递给运行类的参数(在cmd中 javac 类名.java xx1,xx2,xx3)xx1、2、3即被传入args
- main的语法:可调用main中的静态成员,但不能调用非静态成员(相当于看成这只是一个叫main的静态方法!)
- 扩展3—在idea中传入参数见下图
代码块
没接触过,还要看看
如构造器重载时,可将相同语句放入代码块,比构造器先调用!
单例设计模式
饿汉式
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