JAVA基础-面向对象07
一、代码块
1. 含义: 就是使用大括号括起来的一段代码
格式
{
代码;
}
2.静态代码块
格式
static{
代码;
}
书写位置:
直接书写在类中成员位置;
怎么执行呢?
在类加载的最后一步,自动执行;
类加载,会把类的成员加载到方法区,其中非静态成员加载到非静态区域,静态成员加载到静态区域;
静态成员加载的顺序:
a、首先加载所有静态成员;
b、按顺序给所有静态成员变量赋默认值;
c、按顺序给所有静态成员变量显示赋值和执行静态代码块;
执行完静态代码块,类才算加载完成;
为什么创建对象两次,而静态的东西只执行一遍?
静态代码块在类加载的时候就执行完毕,而类只加载一次;
一般为了保证执行顺序不出错,会把静态代码块写在静态成员变量下边;
静态代码块的作用:
有些工作需要在程序执行之前,在类加载的时候就做,这些工作就可以放到静态代码块中;比如一些数据加载的共工作;
3. 构造代码块
格式:
{
代码;
}
书写的位置:
直接写在类中;
执行时间:
每创建一次对象,都会执行一次构造代码块,而且是在构造函数的代码执行之前;
创建对象时,调用构造函数进栈,执行构造函数中方法体之前,有个隐式三步:
1、执行super();
2、给对象的成员变量显示赋值;
3、执行构造代码块
隐式三步执行结束,才执行构造函数中的代码;
构造代码块的作用:
因为在构造代码块中的代码,在构造函数中都会执行到,所以,可以将所有构造函数中都会执行的代码抽出来,放到构造代码块中;
3. 局部代码块
书写位置:写在函数中;
格式:
{
代码;
}
作用: 限制变量的范围的;
二、类加载额对象创建的过程
1. 类中成员位置能书写的成员
2. 类加载过程
三、单例设计模式
1.单例设计模式介绍
设计模式:就是对一些常见问题进行总结,并针对具体问题给出一套通用的解决办法(强调的是解决问题的思想);在开发中,只要遇到这类问题,就可以直接使用这些设计模式解决问题;
最早起源于建筑领域,在建筑领域把一些问题和经验进行归纳总结,形成一套可以用来在建筑领域解决大多数问题的方案;
后来计算机领域借鉴了建筑领域的设计模式,把计算机领域中经常遇到的问题进行归纳和总结,形成计算机领域23种设计模式;
单例(单态、原子)设计模式:
它主要用来保证一个类在程序从启动到最后结束,这个类的对象只有一个。单例就是保证一个类的对象是唯一的。
生活中的单例:
比如月亮:所有人看到的都是同一个月亮;
总结单例实现的步骤:
1、私有化构造函数;
2、在本类中自己创建本类的唯一实例,为了安全,需要把保存这个实例对象的变量封装起来;
3、要提供一个公开的方法,供别人获取这个实例;
2.单例设计模式的代码实现
饿汉式:
弊端:在类加载的时候,就会创建这个类的唯一实例对象;
如果只是想使用这个类,而非使用这个类的对象,此时要加载这个类,在加载的时候就会创建对象,就会造成内存浪费;
有没有办法,在第一次需要使用这个类的对象的时候,才去创建它的对象呢?
要实现这个目的,可就不能在类加载的时候创建对象;
懒汉式的弊端:在多线程环境不能保证对象的唯一性;
单例设计模式小结:
设计模式:
就是前人总结的针对同一类问题的解决方案;强调的是解决问题的思路;
单例设计模式:
解决一个类在程序中只能有一个唯一实例对象的问题的解决方案;
单例设计模式的实现方式:
1、私有化构造函数;
2、在本类中创建自己的唯一实例对象;
3、提供一个公开的方法供人获取这个唯一实例;
四、面向对象:继承
生活中的继承:继承财产;子承父业;继承爵位;
继承,一般发生在两方之间,其中一方可以拥有另一方的东西;
1. 继承的引入
案例:使用java代码描述人和学生的信息;
思考:如果可以在学生类中直接使用人类中的属性和方法,就不需要自己在写一遍重复的代码了;
如果可以在人和学生类之间建立一个继承的关系,就好了;
2. JAVA中的继承
在java中,使用关键字extends,可以在两个类之间建立一种关系,就是继承;
这种关系,可以让一方拥有另一方的成员;
写法:
class A{}
class B extends A{}
表示在类A和B之间建立了继承的关系,其中,B类继承了A类;
继承其他类的类叫做子类(派生类);被其他类继承的类,叫做父类(超类、基类);
子类可以拥有父类的成员;
继承实例:
继承的使用限制:
a、继承中,子类只能拥有父类非私有的成员;私有成员和构造函数不参与继承;
b、在开发中,虽然在语法上,可以使用extends关键字在任意两个类之间建立继承的关系,
但是开发中一般只在两个类表示的事物具有某种关系时才能使用继承,这种关系就是:
子类描述的事物是父类描述事物的一个特例;如果要描述的事物之间不具有这种关系,要想使用继承来减少代码量,就要分别从这两类事物向上找,找他们共同所属的事物,然后将共同的东西抽出来,放到这个共同的事物中;
3. JAVA的单继承 & 多继承
a. 单一继承
就是一个类,只能直接继承一个父类;
一个父类可以有多个子类;
b。多重继承:
就是一个类可以继承一个父类,这个父类,又可以继承其他父类;
4. 继承中的成员变量
a. 子类直接拥有父类非私有成员变量
b. 子类中可以定义和父类中同名的成员变量
如果子类中定义了和父类中同名的成员变量,在子类对象中使用的是子类的成员变量;
一般在开发中,如果父类定义了成员变量,子类中都不要再重复定义;
5. 继承中的成员方法 & 方法的重写(overRide)
a. 子类直接拥有父类非私有成员方法
b. 子类中可以定义和父类同样的成员方法
父类中定义了成员函数,一般在子类中,根据需要都会在定义一遍;
c. 方法的重写
如果在子类中定义了和父类中一样的成员函数,在子类对象中使用的就是子类中定义的函数,这种情况叫做方法的重写(覆写);
d. 重写的应用
/*
需求:描述手机这类事物。原始的手机和现代的手机
*/
class OldPhone
{
//打电话
void call(String num){
System.out.println("给"+num+"打电话");
}
//发短信
void sendMsg(String num,String msg){
System.out.println("给"+num+"发短信:"+msg);
}
} //现代手机
class NewPhone extends OldPhone
{
//打电话
void call(String num){
System.out.println("来电显示:"+num);
System.out.println("显示图片:"+num);
super.call(num);
} //发短信 //玩游戏
void playGame(){
System.out.println("玩游戏");
}
} class PhoneTest
{
public static void main(String[] args)
{
NewPhone np = new NewPhone();
np.call("18888881688"); }
}
问题:为什么需要重写?
因为父类的功能不一定适合子类的要求,所以要在子类中对父类的功能进行重写;
如果在子类对象中重写了父类的方法,然后要使用父类的方法,就需要使用super关键字;
e.重写注意事项
在子类中写父类中方法时,为了避免格式上的错误,最安全的办法,是直接将父类的方法复制粘贴到子类中,然后修改方法体代码;
f. overload 和override的区别
方法重载(overload):
在同一个类中,可以定义多个名称相同、参数列表不同的函数,叫做方法的重载(和方法的返回值类型无关)
方法重写(override):
在继承中,子类可以定义和父类一样的方法,在子类对象中使用的是子类中定义的方法,这叫做方法的重写;
6. 继承中构造方法的调用
7. 子类实例化的过程
子类创建对象时,会调用子类构造函数,在构造函数执行的时候,会先去调用父类的构造函数;
在父类的构造函数执行后,子类构造函数继续执行隐士三部的后两步,然后执行构造函数的代码
8.子类构造函数的注意事项
a. 为什么任何一个类(不包含Object)的构造函数中都需要一个super() 语句?
因为任何一个类(不包括 OBJECT)都要继承一个类,在继承中,子类可以直接使用父类的私有成员变量,而父类的成员变量的初始化,需要通过父类的构造函数来进行。
所以在子类的构造函数中都要限制性父类的构造函数。
b. 类构造函数中,this() 和 super() 能否同时存在?
不能,因为this()和super()在一个构造函数中必须处于第一行位置
如果一个构造函数中有this(),就没有隐式三步,隐式三步在this语句嗲用的那个构造函数中。
c.如果父类中没有无参构造函数,子类如何实例化?
调用super(),但是父类没有无参构造
解决:1.在父类中添加无参构造2.在子类中手动嗲用有参构造
d.如果一个类的构造函数全部私有了,还可以有子类吗?
不能,因为私有的构造函数,只能咋本类中自己使用,子类如果继承该类,那么子类的构造函数就无法调用父类的构造函数,即报错
JAVA基础-面向对象07的更多相关文章
- java基础面向对象之类与对象
java基础面向对象之类与对象 2017-01-14 1.面向对象的基本概念 以一种组建化的形式进行代码设计 1)在面向对象程序设计中包含有如下几种特性 •封装性:保护内部结构的安全性 •继承性:在已 ...
- 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点
前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...
- Java基础-面向对象第三大特性之多态(polymorphism)
Java基础-面向对象第三大特性之多态(polymorphism) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多态概述 多态是继封装,继承之后,面向对象的第三大特性,多态的 ...
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- Java基础-面向对象第一特性之封装(Encapsulation)
Java基础-面向对象第一特性之封装(Encapsulation) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.理解什么是面向过程和面向对象 面向过程与面向对象都是我们编程中 ...
- 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用
062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...
- JAVA(一)JAVA基础/面向对象基础/高级面向对象
成鹏致远 | lcw.cnblog.com |2014-01-23 JAVA基础 1.开发环境搭建 JAVA程序的执行流程 JAVA命令->要使用一个*.class文件(类文件)->通过c ...
- Java基础——面向对象
Hello 大家好,我又来啦,今天我们来说说Java的面向对象. 还记得之前去面试几家公司的实习生职位,大部分面试官都问过我有关面向对象 的问题,不知道以后还会不会问,估计是不会了吧...(:3[▓▓ ...
- 【JAVA基础】07 面向对象2
1. 代码块的概述和分类 面试的时候会问,开发不用或者很少用 代码块概述 在Java中,使用 {} 括起来的代码被称为代码块. 代码块分类 根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态 ...
随机推荐
- 基于Lua插件化的Pcap流量监听代理
1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的 ...
- [转]java类 对象 和构造方法
github地址:https://github.com/lily1010/java_learn/tree/master/dog java中对象和类 java中万物皆对象,比如说动物,里面有猫,狗,鱼等 ...
- poj 1659 Frogs' Neighborhood 度序列可图化 贪心
题意: 对一个无向图给出一个度序列,问他是否可简单图化. 分析: 依据Havel定理,直接贪心就可以. 代码: //poj 1659 //sep9 #include <iostream> ...
- PAT 1003 Sharing (25)
题目描写叙述 To store English words, one method is to use linked lists and store a word letter by letter. ...
- JNI——访问数组
JNI在处理基本类型数组和对象数组上面是不同的.对象数组里面是一些指向对象实例或者其它数组的引用. 因为速度的原因,先通过GetXXXArrayElements函数把简单类型的数组转化成本地类型的数组 ...
- nc和telnet配合使用
nc -l 9932 -c 用nc监听9932端口 telnet 180.150.184.115 29933 telnet 29932 端口
- Cocoa root class
问题来源: 常见面试问题之: NSObject和NSObject protocol有什么区别,为什么要有NSObject protocol, 有没有不继承自NSObject的类? 虽然在iOS开发过程 ...
- 高仿美团iOS版,版本5.7
高仿美团iOS版,版本:5.7 iOS技术交流群:112365317 github链接:https://github.com/lookingstars/meituan 假设你认为不错.欢迎star 哦 ...
- 基于PHP函数的alert弹框
可以设置弹出信息,跳转地址,跳转的时间,跳转的信息标题提示: 手机端加上<meta name='viewport' content='width=device-width, initial-sc ...
- dsp端编译异常之max和min未定义
(1)在函数之前 声明__stdcall 时 在linux 端或dsp端 linux 之前的加上宏定义 __stdcall是MS的编译器使用的只需要#define __stdcall定义一个宏就可以 ...