前言

Java基础面向对象-静态,单例模式,继承详情知识点。静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承。

静态-static关键字

// 定义类
class Person {// 定义name,age属性private String name;private int age;// 定义有参数的构造方法
Person(String name, int age){this.name = name;this.age = age;}// 定义方法public void speak(){System.out.println("name="+this.name+",age="+this.age);}
}// 定义方法
public void sleep(){System.out.println("睡觉");}
}class PersonDemo{public static void main(String[] args){// 实例化对象Person p = new Person("dashucoding",12);// 调用功能p.speak();p.sleep();}
}

在以上的代码中,我们会遇到这种情况,创建了一个对象,但是调用功能时,没有调用到对象中的数据,那么为啥还要调用呢?创建对象不就是为了封装数据的吗?

对象的创建为了产生实例,进行实例化对象进行调用,那么如果调用功能没有调用到对象中的数据,那么如果实例化很多对象时,不是浪费了堆内存中的空间了吗?这个问题值得我们深入研究。

问题解决

创建对象就会浪费内存,那就加入static使用,这个是修饰符,为静态,被static修饰的为静态方法,可以直接被类名调用,当然也是可以被对象调用的。

 // 定义方法
public static void sleep(){System.out.println("睡觉");}
}class PersonDemo{public static void main(String[] args){// 类的调用Person.sleep();}
}

static修饰成员变量,即为静态成员变量;修饰方法,为静态方法,修饰类,为静态类。静态方法只能访问静态变量,不能访问非静态的。

 // 定义方法,给添加个staticpublic static void speak(){System.out.println("name="+this.name+",age="+this.age);}
}
// 结果报错
错误:无法从静态上下文中引用非静态 变量

static解决了不用创建对象的问题,将方法改为静态,可让功能不需要访问类中定义的成员变量,就不用创建对象来浪费空间了。所以在Java中静态的添加就是为了解决这些问题。

静态方法是注意事项

在静态方法中随着类的加载而加载,随着类的消失而消失;我们可知静态方法不能访问非静态的,可被类名直接调用,而且在静态方法中不能出现thissuper的关键字。

我们如何去记住呢?this,super关键字为啥呢?

因为静态先存在内存中,此时对象有可能不存在,所以证名了,静态方法被类名直接调用,如果对象不存在;thissuper关键字也一样,没有对象,哪来的this,super啊!

public static void main

class Person{public static void main(String[] args){System.out.println("hello");new Person.run();}
}
void run(){Sytem.out.println("run);
}

static修饰中,不需要对象,直接用类名就可以访问函数。在静态方法中可以调用非静态方法,一创建对象,而调用类名。

static变量

private static double pi = 3.14;

用静态修饰变量的值,每个对象需要用时,就可改为静态。

变量:静态变量,成员变量,局部变量

静态变量 成员变量
静态变量属于类 成员变量属于对象
静态变量,类变量 成员变量,实例变量
可对象或类调用 对象调用
存储在方法区中 存储在堆内存中

内存

内存:方法区,栈,堆。

静态代码块

class Demo{// 静态变量,先加载静态变量,默认初始化,显示初始化static int x = 3;// 静态代码块,静态变量显示初始化后执行static{System.out.println("类加载的静态代码块"+x);}// 静态方法static void show(){System.out.println("show");}
}class StaticDemo{public static void main(String[] args){Demo.show();Demo.show();}
}// 结果
类加载的静态代码块3
show
show

静态代码块是随着类的加载而加载,只加载一次,给类进行初始化的作用。

代码块(不加静态)

class Demo{int x = 3;{System.out.println("run"+x);}Demo(){System.out.println("demo run");}Demo(int x){System.out.println("demo run int "+x);}
}class NoDemo{public static void main(String[] args){new Demo();new Demo(4);}
}
// 称为构造代码块
{...
}

在构造代码块中,只要创建对象就会被调用,构造代码块为所有对象进行初始化,构造函数只针对对应的对象进行初始化。当调用对象时,构造代码块都会被调用。

{int x = 5;System.out.println("局部代码块"+x);
}

对于局部代码块可以控制局部变量,当代码块调用完后,局部变量就被释放。

对象创建过程

class Demo{// 定义静态变量static int x=2;// 定义变量int y =3;// 静态代码块static {System.out.println("static code"+x);}// 构造代码块{System.out.println("code"+y);}// 构造函数Demo(){System.out.println("demo"+y);}
}
class CreateDemo{public static void mian(String[] args){// 实例对象Demo demo = new Demo();}
}

调用对象时,先显示静态的代码块,在显示构造的代码块,接着显示构造函数内的代码,按照顺序打印。静态代码块执行,仅执行一次,不管调用多少次对象,都是一次。
****

单例模式

什么是设计模式,这是软件工程师为了解决某一问题提出的解决想法,设计模式共有23种,也可自己多想出来几种,学习其中一种单例模式。

单例模式:多个程序要使用同一个配置文件,实现数据共享等,就需要将数据封装到一个对象中,然后进行操作。

单例设计模式就是在某一个类中,在整个应用中,有且只有一个实例(对象),即是一个类中只有一个对象实例。

class Singleton{// 对象static Singleton s = new  Singleton();// 私有化构造器private Singleton(){}// 返回该对象static Singleton getInstance(){return s; }
}

步骤:
1): 私有化构造器;
2): 自身事先提供好一个对象(private static final)
3): 向外暴露一个公共的静态方法,用于返回该对象。

饿汉式,一上来就吃
class Single{private static final Single s = new Single(0;private Single(){}public static Single getInstance(){return s;}
}
// 懒汉式,延迟加载方式
class Single2{private static Single2 s2 = null;private Single2(){}public static Single2 getInstance(){if(s2==null){s2 = new Single2();}else{return s2;}}
}

实例:

class Man{private String name;Man(String name){this.name = name;}public void setName(String name){this.name = name;}public String getName(){return this.name;}public void fly(){System.out.println(this.name+"fly");}
}
class Test{public static void main(String[] args){// 唯一Man man = new Man("dashu");man.fly();}
}

个类中只有一个对象实例

class Man{private String name;// 单例模式private static Man man = new Man("dashu");private Man(String name){this.name = name;}public static Man getInstance(){return man;}// 模式public void setName(String name){this.name = name;}public String getName(){return this.name;}public void fly(){System.out.println(this.name+"fly");}
}
class Test{public static void main(String[] args){// 唯一Man man = new Man("dashu");man.fly();}
}
// 模式
Man man1 = Man.getInstance();
Man man2 = Man.getInstance();
man1.setName("dashucoding");
man2.fly();

继承

继承提高了代码的复用性,给类和类提供了关系。在Java中允许单继承,不能多继承,单继承,一个子类只能有一个父类。但Java中支持多重继承。

class Student{String name;int age;void study(){System.out.println("study");}
}
class Worker{String name;int age;void work(){System.out.println("work");}
}

继承案例:

class Person{String name;int age;
}class Student extends Person{void study(){System.out.println("study");}
}
class Worker extends Person{void work(){System.out.println("work");}
}

多重继承

class A{}
cass B extends A{}
class C extends B{}

结语

  • 本文主要讲解 Java基础面向对象-静态,单例模式,继承详情知识点
  • 下面我将继续对Java、 Android中的其他知识 深入讲解 ,有兴趣可以继续关注
  • 小礼物走一走 or 点赞

转载于:https://www.cnblogs.com/dashucoding/p/9466075.html

第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点相关推荐

  1. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  2. Python编程基础:第二十七节 format输出Format

    第二十七节 format输出Format 前言 实践 前言 在前面的学习中我们已经接触过str.format()的输出格式,本节中我们将进一步学习字符串打印输出的相关内容,并通过一系列的小例子感受使用 ...

  3. 《Java和Android开发实战详解》——1.2节Java基础知识

    本节书摘来自异步社区<Java和Android开发实战详解>一书中的第1章,第1.2节Java基础知识,作者 陈会安,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  4. Java 基础 - 面向对象(不错N多教程集合)

    著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...

  5. 基于Java基础-面向对象实现植物大战僵尸简易版

    基于Java基础-面向对象实现植物大战僵尸简易版 前言 游戏设计 游戏对象 游戏内容 游戏优化 放置植物的优化 移除植物的优化 游戏可玩性的优化 添加游戏背景音乐 后续优化 源码分享 前言 从零开始学 ...

  6. (20)Java基础 --面向对象(1)

    目录 面向对象 一.概述 二.生活举例 三.类与对象的关系 四.类的构成 五.类的定义 类的属性 类的方法 创建实例(对象) 内存分配图 六.对象的基本使用 七.局部变量与成员变量的区别 八.面向对象 ...

  7. Java基础-----面向对象

    文章目录 面向对象 类与对象 匿名对象 创建对象的内存分析 栈(stack) 堆(heap) 方法区 PC寄存器 本地方法栈 内部类 成员内部类 局部内部类 匿名内部类 静态内部类 包装类 拆箱和装箱 ...

  8. java基础面向对象_Java基础面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该 ...

  9. 黑马程序员——java基础--面向对象(篇一)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 第一章 1.面向对象     2.成员变量      3.匿名对象     4.封装       ...

  10. 黑马程序员 JAVA基础 -面向对象(四)

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ 在此,分享一下自己学习JAVA的学习心得.有不对的地方请帮忙改正,也希望对想学j ...

最新文章

  1. 预备作业02-20162314王译潇 黑客帝国之路1.1
  2. java如何从方法返回多个值
  3. mvc 怎么把后台拼接好的div写到前台_MVC 从后台页面 取前台页面传递过来的值的几种取法...
  4. Vue路由 --登录状态的判断
  5. 大屏监控系统实战(2)-后台工程搭建
  6. iOS-使用添加的花样字体
  7. 开发接口文档_产品经理必懂的接口文档撰写方式
  8. Luogu P3373 【模板】线段树 2
  9. 手机网页宽度自动适应屏幕宽度的方…
  10. 语音识别方案设计书.doc
  11. log4j容器初始化探究
  12. 在 MacBook 中如何将外置屏幕设置为主屏幕?
  13. 电磁场与波 matlab,电磁场数值计算法与MATLAB实现
  14. android 系统重装,手机系统重装教程[多图]
  15. 黑马程序员---MYSQL数据库---01
  16. 调用泛微OA接口的一些基本常识
  17. Qt程序移植到ARM
  18. intval的绕过和chr的利用
  19. Credit Card Fraud Detection(信用卡欺诈检测相关数据集)
  20. MIT 6.824学习-GFS

热门文章

  1. inDesign 教程,如何调整布局元素的大小?
  2. 冰点还原精灵Deep Freeze for mac 系统还原工具
  3. 新手教程:Mac电脑如何设置自动隐藏菜单栏?
  4. Mac系统怎么设置文件夹显示在前面?
  5. keepalived 非抢占模式
  6. Java三月春招面试经历分享(没offer不是我的锅)
  7. 看雪CTF.TSRC 2018 团队赛 第十一题『伊甸园』 解题思路
  8. Check Point截获JavaScript文件隐形攻击
  9. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——第1章网络功能
  10. jquery基础使用!