目录

类变量(静态变量)

类方法(静态方法)

Main方法public static void main(String[] arg){}

代码块

单例设计模式

final关键字

抽象类

抽象模板模式

接口

内部类

2-1:局部内部类

2-2:匿名内部类

2-3成员内部类

2-4静态内部类


类变量(静态变量)

静态变量,可以被同一个类的多个对象实例共享;

可以通过类名直接访问。【也要满足访问权限

Static变量在类加载的时候生成的;

不需要实例化就可以通过 类名.类变量 来访问

Static变量保存的在class实例的尾部,class对象在堆中;

类方法(静态方法)

当我们不希望创建实例,也可以调用某个方法【当作工具】,我们就可以做成静态方法。

  1. 类方法中,不允许使用和对象有关的关键字,(this、super)----普通方法可以。
  2. 静态方法只能访问静态的成员; 【遵守访问权限】
  3. 非静态的方法可以访问静态和非静态的成员; 【遵守访问权限】

Main方法public static void main(String[] arg){}

  1. Main方法是由Java的虚拟机调用的;
  2. Java虚拟机需要调用main方法,所以main必须是public
  3. Java虚拟机在执行main方法时,不必创建对象,所以用static
  4. 该方法接收String类型的数组参数,该数组中保存执行java命令时传递给所运行的类的参数,【案例】
  5. Java执行的程序 参数1 参数2 参数3、、、【例】

——静态方法main如果要访问非静态的成员,先创建对象,在调用!

代码块

基本介绍:

1、代码块(又称:初始化块),属于类中的成员(类的一部分),类似于方法,将逻辑语句封装在方法体中,通过 { } 包围起来。

2、和方法不同,没有方法名,没有返回,没有参数,只有方法体。

不用通过对象或类显式调用, 是加载类时或创建对象时隐式调用;

3、修饰符可以写static,静态代码块; ——或普通代码块;

[修饰符] {

代码

}

理解:

相当于另外一种形式的构造器,(对构造器的补充机制),可以做初始化操作;

Eg:

如果多个构造器中,出现重复的语句,可以抽取出来,放到初始化代码块中,提高代码的重用性;

代码块调用顺序优先于构造器

细节:

  1. Static代码块,作用是对类进行初始化,而且随着类的加载而执行并且只会执行一次,如果是普通的代码块,每创建一个对象,就执行。
  2. 类什么时候被加载:

创建对象示例时;

创建子类对象,父类也被加载;

使用类的静态成员时(静态属性,静态方法);

  1. 普通的代码块,在创建对象实例时,会被隐式的调用。

创建一次就调用一次。

如果,只是使用类的静态成员时,普通代码块并不会执行;

  1. 创建一个对象时,在一个类中的调用顺序:

·调用静态代码块和静态属性初始化,两种都按顺序调用。

·再调用普通代码块和普通属性初始化,顺序调用;

·最后,调用构造方法

  1. 构造器 的最前面其实隐含了super()和调用普通代码块。

  1. 先静态,先父类。

静态代码块只能调用静态成员;普通代码块可以调用任意成员;

Exercise:

  • 单例设计模式

共有23种设计模式;

  1. 设计模式:静态方法和属性的经典使用;
  2. 设计模式是在大量的实践中总结和理论之后优选的代码结构、编程风格、以及解决问题的思考方式

单例模式(饿汉式、懒汉式)

  1. 饿汉式:不管用不用,它都先把对象创建好了;可能造成资源浪费

第一步:将构造器私有化,保证只能有一个实例化对象

第二步:在类内部创建一个对象

第三步:提供一个static方法,这样返回一个girlfriend对象,

// 可以不需要去实例化,在main中只需要调用方法,就能返回 对象;

  1. public class SingleTom {
  2. public static void main(String[] args) {
  3. girlfriend instance = girlfriend.getInstance();
  4. System.out.println(instance);
  5. }
  6. }
  7. class girlfriend{
  8. private String name;
  9. //第二步:在类内部创建一个对象:
  10. private static girlfriend qq=new girlfriend("qq");
  11. //这里的static为了能在静态方法中返回;
  12. //第一步:将构造器私有化——》保证只能有一个实例化对象
  13. private girlfriend(String name) {
  14. this.name = name;
  15. }
  16. @Override
  17. public String toString() {
  18. return "girlfriend{" +
  19. "name='" + name + '\'' +
  20. '}';
  21. }
  22. //第三步:提供一个static方法,这样返回一个girlfriend对象,
  23. // 可以不需要去实例化,在main中只需要调用方法,就能返回qq;
  24. public static girlfriend getInstance(){
  25. return qq;
  26. }
  27. }
  1. 懒汉式:只有当用户使用getinstance()时,才返回对象;再次调用返回上一次创建的对象; 从而保证单例;

可能存在线程安全问题;

  1. //懒汉式的单例模式;
  2. public class SingleTom2 {
  3. public static void main(String[] args) {
  4. Cat instance = Cat.getInstance();
  5. System.out.println(instance);
  6. }
  7. }
  8. class Cat{
  9. private String name;
  10. //第二步:在类内部创建一个对象:
  11. private static Cat cat;
  12. //这里的static为了能在静态方法中返回;
  13. //第一步:将构造器私有化——》保证只能有一个实例化对象
  14. private Cat(String name) {
  15. this.name = name;
  16. }
  17. @Override
  18. public String toString() {
  19. return "Cat{" +
  20. "name='" + name + '\'' +
  21. '}';
  22. }
  23. //第三步:提供一个static方法,这样返回一个Cat对象,
  24. // 可以不需要去实例化,在main中只需要调用方法,就能返回qq;
  25. public static  Cat getInstance(){
  26. if (cat == null) {
  27. cat=new Cat("xx");
  28. }
  29. return cat;
  30. }
  31. }

3、小结

  • final关键字

  1. 不希望某个类被继承,可以用final修饰类;——>final class A{}
  2. 不希望父类的某个方法被重写,可以用final修饰方法。
  3. 不希望类的某个属性被修改,可以用final修饰属性。
  4. 不希望某个局部变量被修改,也可也用final修饰变量;

  • 抽象类

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法,这个方法就是抽象方法,用abstract来修饰该类就是抽象类;

一般来说,抽象类会被子类继承,由子类来实现抽象方法;

细节:

注释:static修饰的方法必须有方法体,抽象方法没有。

抽象模板模式

D:\IDEAproject\basis2\src\com\cc\Abstract\exercise2

  • 接口

1、接口,就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,在根据具体情况把这些方法写出来。写法:

2、难的是,如何去使用;

[D:\IDEAproject\basis2\src\com\cc\Interface]

3、实现接口继承类的区别,联系;

当子类继承父类,就自动继承了父类的功能;

如果子类需要扩展功能,可以通过实现接口的方式来扩展;

可以理解为【接口,是对java的单继承机制的一种补充

D:\IDEAproject\basis2\src\com\cc\extends_interface\extends_interface.java

4、

  1. public class InterfacePolyParameter {
  2. public static void main(String[] args) {
  3. //接口的多态体现
  4. USBinterface phone = new phone();
  5. phone=new car();
  6. }
  7. }
  8. interface USBinterface{}
  9. class phone implements USBinterface{}
  10. class car implements USBinterface{}

数组:

  1. public class InterfacePolyArr {
  2. public static void main(String[] args) {
  3. //接口类型的 多态数组
  4. USB[] usb = new USB[2];
  5. usb[0] =new Iphone();
  6. usb[1]=new Icar();
  7. for (int i = 0; i < usb.length; i++) {
  8. usb[i].work();//动态绑定。
  9. //向下转型;
  10. if (usb[i] instanceof Iphone) {//判断运行类型;
  11. ((Iphone) usb[i]).call();
  12. }
  13. }
  14. }
  15. }
  16. interface USB{
  17. void work();
  18. }
  19. class Iphone implements USB{
  20. void call(){
  21. System.out.println("myphone lllllllll");
  22. }
  23. @Override
  24. public void work() {
  25. System.out.println("phone working ---");
  26. }
  27. }
  28. class Icar implements USB{
  29. @Override
  30. public void work() {
  31. System.out.println("car working ---");
  32. }
  33. }

多态传递:


  1. public class InterfacePolyPass {
  2. public static void main(String[] args) {
  3. ia a = new C(); //如果 ib 没有extends ia无法创建
  4. ib b=new C();
  5. }
  6. }
  7. interface ia{}
  8. interface ib extends ia{}
  9. class C implements ib{}

Tip:

普通的类实现一个接口时,可以用alt+shift+enter或alt+enter快速创建抽象类的所有方法;

  • 内部类

  1. 介绍:

一个类的内部有完整的嵌套了另一个类结构。被嵌套的叫内部类(inner class)

嵌套其他类的类叫外部类(outer class)。

内部类的最大特点:能直接访问私有属性,并且可以体现类与类之间的包含关系;

类的五大成员:【属性,方法,构造器,代码块,内部类】

  1. 内部类的分类

2-1:局部内部类

在外部类的局部位置;

  1. 可以直接访问外部类的所有成员
  2. 不能添加访问修饰符,但可以final修饰;
  3. 作用域在方法体或代码块中
  4. 本质仍然是一个类;

2-2:匿名内部类

同样在外部类的局部位置,但是没有类名

Dog是普通方法;

Tiger是用匿名内部类的方法;

  1. /** AnonymousInnerClass(匿名 内部 类)
  2. * 演示
  3. */
  4. public class AnonymousInnerClass {
  5. public static void main(String[] args) {
  6. Outer04 outer04 = new Outer04();
  7. outer04.method();
  8. }
  9. }
  10. class Outer04 {
  11. private int n1 = 1;
  12. public void method() {
  13. dog dog1 = new dog();
  14. dog1.cry();
  15. //匿名内部类tiger1
  16. A tiger1 = new A() {
  17. @Override
  18. public void cry() {
  19. System.out.println("hu ku  ");
  20. }
  21. };
  22. tiger1.cry();
  23. }
  24. }
  25. interface A {
  26. public void cry();
  27. }
  28. class dog implements A {
  29. @Override
  30. public void cry() {
  31. System.out.println("gou ku  ");
  32. }
  33. }

匿名内部类使用细节

可以把匿名内部类当做实参,来进行传递:

练习:

  1. public class AnonymousInnerClassExercise_2 {
  2. public static void main(String[] args) {
  3. Cellphone cellphone = new Cellphone();
  4. //匿名内部类当做实参
  5. cellphone.alarmclock(new Bell() {
  6. @Override
  7. public void ring() {
  8. System.out.println("pig getup");
  9. }
  10. });
  11. cellphone.alarmclock(new Bell() {
  12. @Override
  13. public void ring() {
  14. System.out.println("gays study");
  15. }
  16. });
  17. }
  18. }
  19. //铃声接口
  20. interface Bell{
  21. void ring();
  22. }
  23. class Cellphone{
  24. void alarmclock(Bell bell){
  25. bell.ring();
  26. }
  27. }

2-3成员内部类

说明:成员内部类是定义在外部类的成员位置,并且没有static修饰。

  1. 可以直接访问外部类的所有成员;
  2. 可以添加任意访问修饰符,因为它也相当于一个成员;

访问方法:

  1. public class MemberInnerClass_ {
  2. public static void main(String[] args) {
  3. Outer outer = new Outer();
  4. //第一种方式:
  5. //用外部类的对象,outer来new一个内部类Inner;
  6. Outer.Inner inner = outer.new Inner();
  7. //第二种,外部类中返回一个inner
  8. Outer.Inner inner = outer.getInner();
  9. }
  10. }
  11. class Outer{
  12. class Inner{    }
  13. //第二种,外部类中返回一个inner
  14. public Inner getInner(){
  15. return new Inner();
  16. }
  17. }

2-4静态内部类

访问方法跟成员内部类相似;

韩顺平Java学习 面向对象【高级】(笔记)相关推荐

  1. 韩顺平Java学习 泛型

    目录 一.泛型的语法 1.传统的方法遍历集合存在的问题 2.使用泛型来解决传统集合添加元素带来的问题 3.泛型使用介绍 4.泛型的使用细节 5.泛型课堂练习 二.自定义泛型 1.自定义泛型类的规范 ​ ...

  2. B站韩顺平java学习笔记(六)--面向对象编程章节

    目录 一.类和对象 1.定义及区别 2.对象内存布局 3.属性/成员变量 (1)基本介绍 (2)注意事项和细节说明 (3)访问属性 4.对象 (1)创建对象 (2)对象分配机制 ​(3)Java创建对 ...

  3. B站韩顺平java学习笔记(三)--运算符章节

    目录 一.算术运算符 1.  表格 2.  练习题: 二. 关系运算符 1.  表格 三.逻辑运算符 1.  表格 2.  练习题 四.赋值运算符 1.  介绍 2.细节特点 五.三元运算符 1.  ...

  4. 韩顺平Java学习笔记_IO流专题

    目录 一 文件 1.文件的概念: 文件是保存数据的地方 2.文件流:文件在程序中是以流的形式来操作的 2.1.输入流指数据从数据源(文件)到程序(内存)的路径 2.2.输出流指数据从程序(内存)到数据 ...

  5. 韩顺平Java学习笔记P245对象创建流程分析P246this关键字-P250

    P245对象创建流程分析 //1.先在方法区加载方法类 //2.在堆里开空间一个存放age,一个存放name //3.(先默认初始化有默认值age=0,name=null,再显示初始化age=90,n ...

  6. B站韩顺平java学习笔记(十六)-- 多线程基础章节

    目录 一  线程介绍 1  线程相关概念 (1)程序 (2)进程 (3)什么是线程 (4)其他相关概念 (5)查看电脑有多少个cpu核 二  线程的使用 1  线程的创建 (1)继承Thread类,重 ...

  7. B站韩顺平java学习笔记(八)-- 房屋出租系统(项目)章节

    目录 一 项目需求说明 1 项目界面 二  房屋租赁程序框架图 ​三  系统实现 1  完成House类 2  显示主菜单和完成退出软件的功能 3  完成显示房屋列表的功能 4  添加房屋信息的功能 ...

  8. B站韩顺平java学习笔记(二十五)-- 正则表达式章节

    目录 一  正则表达式入门 1  极速体验正则表达式威力 二  为什么要学正则表达式 三  正则表达式基本介绍 1  介绍 2  正则表达式底层实现

  9. 韩顺平Java学习【枚举、注解】(笔记)

    枚举[enumeration] 枚举是一组常量的集合: 属于一种特殊的类,里面只包含一组有限的特定的对象: 自定义类实现枚举--应用 不需要提供 setxxx 方法,因为枚举对象值通常为只读: 对枚举 ...

  10. B站韩顺平java学习笔记(二十三)-- MYSQL基础篇 章节

    目录 一  数据库 1  数据库简单原理图 2  使用命令行窗口连接MYSQL数据库 3  MySQL三层结构 4  数据在数据库中的存储方式 5  SQL语句分类 6  创建数据库 7  查看.删除 ...

最新文章

  1. Android WebView开发问题汇总
  2. c++ 将输入存储到数组,然后反转数组,最后输出
  3. python字典内存分析_python--序列,字符串,列表,元组,字典,集合内存分析
  4. 中商惠民李超:500,000+ 便利店背后的精细化管理
  5. Python入门,从19个语法开始!
  6. Java黑皮书课后题第5章:**5.22(金融应用:显示分期还贷时间表)对于给定的贷款额,月支付额包括偿还本金及利息。编写一个程序,让用户输入贷款总额年限利率,然后显示分期还贷时间表
  7. LeetCode每日一题 24. 两两交换链表中的节点
  8. Angular sort interactively test
  9. python 生成图片_python生成带有表格的图片
  10. 用srand时间数种子来生成随机数
  11. 活动地推怎么做最有效?
  12. Socket编程入门
  13. Centos7 使用 chronyd 进行时钟同步
  14. LoadRunner学习笔记
  15. 放置江湖html5源码,「放置江湖」——经典文字类放置武侠手游
  16. 微信小程序傻瓜制作_从15款工具中精选出4款,最靠谱的微信小程序制作软件!...
  17. WinSCP显示隐藏文件
  18. 7年老Android一次操蛋的面试经历
  19. 主流芯片解决方案Ambarella的高清网络摄像机、德州仪器和控制海思
  20. MySQL 使用profile分析慢sql,group left join效率高于子查询

热门文章

  1. 50个app帮你手机大换血!
  2. Gantt甘特图如何实现数据加载
  3. 计算机组成原理考研笔记
  4. 有一种VR电影比爱情动作片更“爽”
  5. 单片机蜂鸣器奏乐代码例子
  6. java环境安装菜鸟教程,window系统安装Java 配置环境变量 | 菜鸟教程 JDK配置
  7. 获取和分析Dump的几种工具简介
  8. 移远EC20开发环境搭建
  9. (环境搭建+复现)ZZZCMS模版注入+文件包含getshell
  10. cmd代码表白_python表白神器你值得拥有