Java基础之类和对象、单例模式、继承
Java类和对象
一般的类只能是public或者default的,若是public的,类名必须和文件名一样。一般在一个文件只写一个类,故这个类一般是加上public。
内部类还可以是private和protected,一般私有化(private),因为只有当前这个类才需要。这样只有它的外部类可以直接访问。所以里面的数据也无所谓是public还是private或者default的。
public class Out {
private int d = 10;
public int add() {
// 外部类不能直接访问内部类的数据,除非new出内部类对象,如下
// Out.In abc = new Out().new In();
a = 3; // false
b = 5; // false
}
// 内部类
private class In {
private int a = 100;
int b;
public int c;
public void add() {
System.out.println(d); // true, 内部类却可以直接访问外部类的数据
}
}
public static void main(String[] args) {
Out bb = new Out();
Out.In abc = new Out().new In();
bb.d = 20; // 本类可以直接访问private,一般不这样,而是写个set函数,搭配get函数
System.out.println(aa.a); // 100
System.out.println(bb.d); // 被修改为20
}
}
- 匿名对象
new Abc().run(); // 调用一次后这个对象就销毁
new Abc().run(); // 这是另外一个Abc对象了
- 关于private
- private变量:封装数据,只给用户看方法。例如private String name不能随修改,但是提供setName()、getName()方法可调用,实现数据的封装,更安全。
- private方法:不用用户调用的函数,完成一些内部实现的细节,就可以定义成private。例如选择排序算法写成一个方法,里面有交换两个数据的过程,封装成函数。这个函数不需给用户操作(用户只需用一个sort()就行),这个swap()就定义成private的。
单例设计模式
可以保证一个类在内存中的对象唯一性,需对过个程序使用同一配置信息对象时,就需要保证对象的唯一性,这时就需要单例。
工具类中,未用到(访问)对象成员数据,则可不用创建对象。为了防止创建对象,可以将构造函数定义为private。
如何保证对象的唯一性?
- 不允许其他程序用new创建该类对象,构造函数设为private
- 在该类创建一个唯一的类实例
- 对外提供一个方法使其他程序可以获取到这个唯一对象
单例设计步骤
- 私有化(private)该类的构造函数
- 通过new在本类汇总穿件一个本类对象
- 定义一个puiblic方法,将2中创建的对象返回
饿汉模式
// 饿汉式--不管用不用得到,先new出一个再说
public class SingleDemo {
// private不能将这个实例暴露出去,只能通过getInstance()获取,另为何是static?
private static SingleDemo s = new SingleDemo();
private SingleDemo() {}
// 供外界调用来获取这个对象
public static SingleDemo getInstance() {
return s;
}
// 只有本类中可以new对象并调用add
public void add() {
System.out.println("danli");
}
public static void main(String[] args) {
// 本类可以new
SingleDemo a = new SingleDemo();
a.add();
}
}
public class Test {
public static void main(String[] args) {
// fasle, 其他类中若用到这个单例,不能new
SingleDemo aa = new SingleDemo();
// true
SingleDemo aa = SingleDemo.getInstance();
}
}
懒汉模式
// 另外一种单例设计模式--懒汉模式--用到了才new,延时加载
public class SingleDemo {
// 先设为空
private static SingleDemo s;
private SingleDemo() {}
// 供外界调用来获取这个对象
public static SingleDemo getInstance() {
if (s == null)
s = new SingleDemo();
return s;
}
Q:为何成员变量是static,方法也是static?
A:因为在其他类中,不允许new出新对象,故不能调用getInstance(),如果我们设成静态方法,就可以通过Single.getInstance()来获取而无需new对象,又静态方法里的数据也必须是static的。故这个SingleDemo对象也必须是static的。
Q:饿汉模式和懒汉模式的区别?
A:懒汉模式是延时加载的,用到了才new;在多线程时不能保证对象的唯一性,是线程不安全的。饿汉模式是随着类的加载,就new出这个对象,不管用不用得上,是线程安全的。
继承
Java一般是单继承,不能直接多继承 --> 因为多个父类可能有相同的成员,调用会导致二义性。
但是可以多层继承,如 A --> B -->C--> D,可以表示A继承自B,而B继承自C,以此类推。
- 本类成员和局部变量之间用
this区分 - 子类、父类的成员同名时用
super区分 - 派生类也不能访问基类的private成员,但是确实是继承过来了,只是不能访问而已,可以调用父类的
set、get函数来操作子类的private成员,对父类没影响。 - 若成员是protected等权限更高的,则不用
set、get就可直接访问该成员。 - 父类与子类的该成员是相互独立的,子类改变它自己的成员,父类保持原样。
package Chap1;
public class Fu {
// 父类的成员是私有的,子类继承过去了也不能直接访问
private int age;
private String name;
public Fu(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Zi extends Fu {
// 特有的job,父不能访问
private String job;
Zi(int age, String name, String job) {
super(age, name);
this.job = job;
}
public String getJob() {
return job;
}
public static void main(String[] args) {
Zi aa = new Zi(23, "Zi","Study");
Fu bb = new Fu(55, "Fu");
// 改变子类不会影响父类
aa.setAge(24);
aa.setName("zi");
// zi 24 Study
// Fu 55
System.out.println(aa.getName()+" "+aa.getAge() + " " + aa.getJob());
System.out.println(bb.getName()+" "+bb.getAge());
}
}
- 子类隐式执行super(),new一个子对象时,先调用父类的构造函数,再执行子类的构造函数。
- 默认的构造函数是无参的,有参数的构造函数会覆盖无参的。这时候需要显式使用super(args),且必须放在第一行,若不显式写super,则执行默认的super(),即无参的父类构造函数。
class Fu {
// 构造函数
Fu() {
System.out.println("father");
}
// 带参的构造函数
public Fu(int age, String name) {
this.age = age;
this.name = name;
}
}
class Zi extends Fu {
Zi() {
private String job;
// super() 会打印“father”
// 无参数时是默认构造器,这句super()可以不写。父类的构造函数默认执行,先执行
//
}
Zi(int age, String name, String job) {
// 若不写,会默认调用无参的super()打印father
super(age, name);
this.job = job;
}
}
- 类是public,构造函数也是public的。他们的修饰符是对应的。
一个对象的实例化过程
Person p = new Person();
- JVM读取Person.class文件,加载进内存;若有父类,会先加载父类。
- 在堆内存中开辟空间,分配地址。
- 在对象空间中,对对象的属性进行默认初始化,如
int age = 0; String name = null; - 显示初始化,如
private int age = 9。若是子类,则会先调用父类的构造器。 - (子)类的 构造函数进行特定的初始化。如下程序中age变成100。
- 初始化后,将地址传递给引用变量。Person p <-- new Person();
package Test;
// 先打印9
// 再打印100
public class Demo {
private int age = 9;
{
System.out.println(age);
}
Demo(int age) {
this.age = age;
}
public static void main(String[] args) {
Demo aa = new Demo(100);
System.out.println(aa.age);
}
}
by @sunhaiyu
2016.12.8
Java基础之类和对象、单例模式、继承的更多相关文章
- 第二十七节:Java基础面向对象-静态,单例模式,继承详情知识点
前言 Java基础面向对象-静态,单例模式,继承详情知识点.静态-static关键字,static变量,静态代码块,代码块(不加静态),对象创建过程,单例模式,继承. 静态-static关键字 // ...
- 第31节:Java基础-类与对象
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
随机推荐
- TIOBE:全球编程语言最新排名(Kotlin排名进入前50名)
作为coder,大家当然关心自己所使用语言的应用趋势.要是几年后所用语言变得默默无闻,那岂不是之前的知识储备与经验积累都会大打折扣.TIOBE排行榜是根据互联网上有经验的程序员.课程和第三方厂商的数量 ...
- JS性能优化之怎么加载JS文件
IE8+等实行并行下载,各JS下载不受影响,但仍阻塞其他资源下载 如: 图片 所以首要规则就是:将JS放在body底部(推荐) 加载100kb的单个文件比4个25kb的文件快(减少外链文件数量)(脚本 ...
- 关于对WEB标准以及W3C的理解与认识问题
web标准简单来说可以分为结构.表现和行为.其中结构主要是有HTML标签组成.或许通俗点说,在页面body里面我们写入的标签都是为了页面的结构.表现即指css样式表,通过css可以是页面的结构标签更具 ...
- 将angular-ui-bootstrap的弹出框定义成一个服务的实践
定义一个弹出框的服务:alert_boxdefiine(["app"],function(mainapp){ mainapp.controller('ModalInstanceCt ...
- Azure MySQL PaaS (3) 创建MySQL异地只读数据库 (Master-Slave)
<Windows Azure Platform 系列文章目录> Azure MySQL PaaS服务提供异地只读的功能,我们可以在主站点,比如Azure上海数据中心,创建MySQL主节点. ...
- Win7使用USB口连接H3C交换机的Console口
使用Console线的一端连接交换机的Console口,另一端连接电脑的USB口. 使用驱动精灵安装USB转串口驱动,我电脑上面提示安装的是: Prolific PL2303 USB转串口驱动1.16 ...
- MyEclipse2014web工程项目直接复制不能访问报错处理方案
在学习web servlet项目中,做一个项目时 , 完成到了某一阶段 实现了部分功能,有必要保存这一项目,当复制这个项目之后发现发布会报错或者不能访问. 其实复制项目主要是为了在以后的学习中如果能顺 ...
- JProfiler - Java的性能监控工具
简介 JProfiler是一款Java的性能监控工具.可以查看当前应用的对象.对象引用.内存.CPU使用情况.线程.线程运行情况(阻塞.等待等),同时可以查找应用内存使用得热点,即:哪个对象占用的内存 ...
- CSS3-loading动画(四)
图片看的效果真是不行,还是戳下面网址看吧 在线示例:http://liyunpei.xyz/loading.html 十七.效果十七 三个小球,纵向居中,间距撑开,依次改变小球的translateY的 ...
- Oracle数据迁移-系统数据合并笔记
创建临时表:execute immediate 'sql'; 通过临时表和关联查询解决循环处理效率低下,大数据操作移植时时间太长的问题. 结构相同的系统数据库表移植,案例如下: create or r ...