1、继承的问题

子类是父类的一个扩展,子类可以利用父类的属性与行为,这种情况子类会破坏父类的封装

为了保持父类良好的封装性,设计父类有以下规则:

如果要把某类设计为最终类则需要添加final修饰符,或将此类的构造器声明为private

2、利用组合实现复用

组合就是把旧类的对象当做新类的属性嵌入,并用private修饰

public class Animals
{
public Animals()
{
System.out.println("Animals");
}
public void breathe()
{
System.out.println("ha-hu");
}
} public class Wolf
{
private Animals a;
public Wolf(Animals a)
{
this.a=a;
}
public void run()
{
System.out.println("run");
} public static void main(String[]args)
{
Animals b=new Animals();
Wolf a=new Wolf(b);
a.run();
}
}

3、初始化块

前面定义的初始化块先执行,后面的后执行

syntax:

[修饰符]{
//...
}

只能使用sattic修饰,称作静态初始化块

当创建一个对象是先调用初始化块

静态初始化块对整个类进行初始化

系统会首先执行静态初始化块,并会一直回溯到基类再一步一步执行静态初始化,再执行其他

4、基本数据类型的包装类

为什么要用包装类?

解决8个基本类型变量不能变成Object类型变量的问题,为8个基本类型变量定义了应用类型的包装类。

JDK1.5后提供了自动装箱与自动拆箱,就可以直接来了,不用这么复杂了

基本类型变量与字符串之间的转换关系

5、toString

toString 是Object 类定义的一个方法,用以描述对象的状态信息

返回值:对象类的实现类名+@+hashCode

可以依据实际情况重写toString

6、==与equals

==比较是一种基本类型的比较符,当要对引用类型进行比较时,比较的是是否指向同一个对象,不是值相等

要实现值相等的比较,就要重写equals

Object提供的equals与==是一样的,没有用的,一定要重写

重写后有规定:

1)自反性;

2)传递性;

3)对称性;

4)一致性。

Example:

public boolean equals(Object obj)
{
if(this==obj)
return true;
if(obj!=null&&obj.getClass()==SomeClass.class)
{
SomeClass sc=(SomeClass)obj;
if(compare)
return true;
}
return false;
}

7、类成员

类中只能包含属性、方法、构造器、初始化块、内部类、枚举类

static不修饰构造器

类成员不能访问实例成员

8、单例类Singleton

一个类只能创建一个实例

把构造器用private修饰

需要一个public方法作为这个类的访问点,同时要将其定义为static

该类还需缓存已创建的对象

class Singleton
{
//使用一个变量来缓存曾经创建的实例
private static Singleton instance;
//隐藏构造器
private Singleton(){}
//提供一个静态方法,用于返回Singleton实例
//可加入自定义的控制,保证只产生一个Singleton
public static Singleton getInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}

9、final

final修饰的变量赋值后不可改变

final修饰的成员变量必须在类中赋初值

类属性:在静态初始化块中、在声明该属性时指定初始值

实例属性:在非静态初始化块、声明属性、构造器中指定初始值

系统不会对final修饰成员进行隐式初始化

final修饰的引用变量只是保证它所指向的地址不改变,而该引用的内容是可以改变的

final修饰的方法不可被重写,但可以重载

final修饰的类不可继承

10、不可变类

创建该类的实例后,实例的属性不可改变

8个包装类、java.lang.String都是不可变类

hashcode返回的是对象地址

final修饰的引用类型变量不符合不可变,那么我们在设计类的时候必须将此变量保护起来。

11、缓存实例的不可变类

如果程序需要经常使用某些实例,则应把其缓存

Example:

利用数组作为缓存池

public class CacheImmutale
{
private final String name;
private static CacheImmutale[]a=new CacheImmutale[10];
private static int pos=0;
public CacheImmutale(String name)
{
this.name=name;
}
public String getName()
{
return name;
} //利用valueOf创建对象,而不用构造器
public static CacheImmutale valueOf(String name)
{
for(int i=0;i<10;i++)
{
if(a[i]!=null&&a[i].getName().equals(name))
return a[i];
}
if(pos==10)
{
a[0]=new CacheImmutale(name);
pos=1;
return a[0];
}
else
{
a[pos++]=new CacheImmutale(name);
return a[pos-1];
}
} //重写equals
public boolean equals(Object obj)
{
if(obj instanceof CacheImmutale)
{
CacheImmutale aa=(CacheImmutale)obj;
if(name.equals(aa.getName()))
{
return true;
}
return false;
}
} //重写hashCode
public int hashCode()
{
return name.hashCode();
}
}

12、抽象类

抽象方法与抽象类的规则:

利用抽象类就是利用一种模板模式

抽象父类中提供多个子类的通用方法,子类再进行具体的实现补充。

13、接口

接口中所有的方法都是抽象方法

接口规定类中应具体提供的方法,但不管具体实现

syntax:

[修饰符] interface  Name extends 父接口1, 父接口2...
{ }

接口中可以包含属性(只能是常量),方法(只能是抽象实例),内部类(包括内部接口)和枚举类的定义

只能是public 、static、final(系统默认)

方法、内部类、枚举类 自动用public static 修饰

使用接口:

类必须实现接口内的所有方法,只能用public

模拟多继承

interface and abstract class

Java 4的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

  10. c#与java的区别

    经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...

随机推荐

  1. c++ 常见问题之string

    string初始化: 拷贝初始化: = 初始化变量,编译器把等号右侧的初始值拷贝到新创建的对象  string s = "stduent";    string s = s1; 直 ...

  2. SqlParameter 中 top 的使用

    public DataTable GetAdminTopDCSCheckReport(int top) { StringBuilder strSql = new StringBuilder(); st ...

  3. pack://application:,,,/

    FrameworkElementFactory gridFactory = new FrameworkElementFactory(typeof(Grid)); gridFactory.SetValu ...

  4. seajs +gruntjs 合作开发

    nodejs的出现 让服务器端能运行 js commonjs规范 规范服务器端开发按照什么写法去写 包括模块化开发 ( 不同点 请求在本地 js加载) AMD规范 浏览器端开发的规范 (不同点: 浏览 ...

  5. Java Socket编程基础(1)

    参考资料: <Java网络编程精解> 孙卫琴 一.socket通信简介 什么是socket,简单来说,在linux系统上,进程与进程之间的通信称为IPC,在同一台计算机中,进程与进程之间通 ...

  6. 通过反射获取所有的Action 一般用于权限管理

    public IList<ActionPermission> GetAllActionByAssembly() { var result = new List<ActionPermi ...

  7. Gentoo网络管理方法总结

    OpenRC/netifrc Netifrc is a collection of modules created to configure and manage network interfaces ...

  8. ASP.NET Calendar(日历控件)

    定义和用法 Calendar 控件用于在浏览器中显示日历. 该控件可显示某个月的日历,允许用户选择日期,也可以跳到前一个或下一个月. 属性 属性 描述 .NET Caption 日历的标题. 2.0 ...

  9. cmd 进入mysql

    从cmd中进入MySQL的命令界面 1.开始中找出运行:输入cmd2.查找appserv所在盘,我的在D盘,所以接着输入:d:3.在d盘中查找mysql所在目录:cd appserv\mysql\bi ...

  10. Android打开某个activity时自动弹出输入法键盘

    最近在做一个可以让用户修改自己账户资料的activity,具体是打开后有一个EditText,然后用户可以在这里输入相关信息,但是做好后发现,进入这个activity时系统并没有自动弹出输入法键盘,于 ...