细说java中的类
前言
最近在学习《java编程思想》 学到了内部类
类不就是class吗 天天用 还能讲出花来了不成...
其实不然,在java中,类的种类和使用方式多种多样,花样繁多。其中主要有
普通类
内部类(嵌套类)
匿名类
抽象类
静态类
密封类
就先讲这么多吧。接下来将从应用场景、定义、实例化、这3个方面入手,了解一下关于类的基本常识。
普通类
应用场景
类的由来归根于物以类聚,人以群分。将世间万物相同的特征和行为提取(属性和方法),归纳总结成一个类型。是我们编程世界最常用也是最基础的单元。
定义
public class cat { public cat(String _color){
this.color=_color;
}
//属性 public String color; //方法(行为) public void run(){ System.out.println(color+"的猫正优雅的向你走来");
} } c.run();
这是最基本的类的使用方式。
内部类
应用场景
内部类也叫嵌套类。
可以细分为 非静态内部类、静态内部类,
它的使用场景较为广泛,而且多样
定义 非静态内部类
public class InnerClassTest {
private String name;
public InnerClassTest(String name){
this.name=name;
} public class Inner{
public String getName(){
return name;
}
}
public Inner getInnerClass(){
return new Inner();
}
}
可以看到我 加粗变色的部分。它定义在一个普通类(外部类)中,它也有自己的属性和方法,它能访问到外部类的成员变量,另外为了方便,一般会在外部中定义一个方法,来对外提供引用,也能够内部使用
实例化
InnerClassTest InnerClassTest=new InnerClassTest("张三");
InnerClassTest.Inner inner=innerClassTest.new Inner();
System.out.println(inner.getName());
InnerClassTest.Inner s= innerClassTest.getInnerClass();
System.out.println(s.getName());
可以看到,如果需要访问内部类,首先需要有父类的引用。也就是第一行的外部类实例化
第2行和第4行展示了非静态内部类的2种实例化方式。 一种是.new 内部类 另一种是通过调用外部类中的方法来获取对象
静态内部类
应用场景
静态内部类使用比较少见,参见建造者模式
定义
public class InnerClassTest {
private static String name;
public InnerClassTest(String name){
name=name;
} public static class Inner{
public static String getName(){
return name;
}
}
public Inner getInnerClass(){
return new inner();
}
}
实例化
需要注意的是,内部类如果要将方法设置为静态方法,那内部类本身也得是静态的
String name= InnerClassTest.Inner.getName();
由于是静态类,所以不需要实例化外部类,直接外部类点出来就行,不过由于外部类name没有赋值,所以打印出来name是null
匿名类
匿名类被称为匿名内部类 ,也是内部类的一致
使用场景
之所以拿出来单独说,是因为使用场景极其多。简化代码,对于只有一两个小方法的接口来说,不必创建接口文件,优雅不少 先来举个栗子 定义
new DataTemplate().exectue(new IDataManager() {
@Override
public void Process() {
System.out.println("执行了接口实现方法");
}
});
从变色的部分可以看出,这是个接口,而接口正常情况下是无法new的。在类里面却可以随意使用,只要实现接口的方法即可。
这种使用方式,随处可见
new TimerTask(){
@Override
public void run() { }
}
new Runnable(){
@Override
public void run() { }
};
是不是很熟悉,做异步任务,定时任务常用到。
new Comparator() {
@Override
public int compare(Object o1, Object o2) {
return 0;
} @Override
public boolean equals(Object obj) {
return false;
}
};
是不是更熟悉了,做排序比较的时候经常用。在java中,匿名类无处不在。
这种简写的方式相当于
public class nimingTest implements Comparator { @Override
public int compare(Object o1, Object o2) {
return 0;
}
}
抽象类
抽象类顾名思义,将共同特征抽象出来,提取共同的行为, 由子类去实现。关键字 abstract
在类中加入abstract 它可以没有抽象方法。相反,一个类中如果有abstract修饰某个方法,它就叫抽象类,而且必须给类加上abstract修饰
使用场景
抽象是软件工程面向对象中很重要的概念,抽象类和接口很相似,同样可以由子类重写实现。不同点在于,接口没有方法体,而抽象类可以正常拥有属性和方法体,可以有自己的普通方法。
例如下单绑定卡,卡类就是个抽象类,子类有银行卡,信用卡,会员卡,积分卡,超市联名卡 。他们都有共同的属性,如卡号,类型,拥有共同的支付行为
常见的有抽象工厂,属于最常见的设计模式,下单业务逻辑也会有见到抽象的身影。不同类型的订单执行不同的子类逻辑(如,普通订单,夺宝,拼团,送礼)
定义
public abstract class nimingTest implements Comparator { @Override
public int compare(Object o1, Object o2) {
return 0;
}
}
这个抽象类可以继承接口,可以不需要抽象方法,不过抽象类无法实例化,因为不是具象,它需要子类继承
public class AbstractChildClassTest extends nimingTest {
}
实例化
new AbstractChildClassTest().compare(1,2);
此时之类可以访问父类所有的public方法,如果父类有抽象方法,则子类必须要实现这个方法,除非之类也是一个抽象类。
此时给抽象类加一个抽象方法,让子类来继承
public abstract class nimingTest implements Comparator { @Override
public int compare(Object o1, Object o2) {
return 0;
} public abstract String getName();
}
子类
public class AbstractChildClassTest extends nimingTest {
@Override
public String getName() {
return null;
}
}
使用
new AbstractChildClassTest().compare(1,2);
new AbstractChildClassTest().getName();
还可以绕过之类,自己写匿名类,对付接口的一招也能用于抽象类
new nimingTest() {
@Override
public String getName() {
return "";
}
};
可以看到,之前不能new的抽象类,居然能跳过被之类继承的环境,直接采用匿名的方式实现抽象方法。
使用的时候
String name= new nimingTest() {
@Override
public String getName() {
return "xss";
}
}.getName();
System.out.println(name);
静态类
静态类属于比较特殊的存在,因为在整个内存中只有一份元数据。所以不存在实例化的可能,其实静态内部类才算是静态类。
关键字 static
关键字无法修饰类(仅限外部类),只能用于成员变量和方法。凡是有方法被static修饰的类,我们叫他静态类。
静态变量,静态块,静态方法 静态内部类
使用场景
一般用于工具类或者类似枚举的成员变量比较固定的值的地方
定义
如下代码 展示了 静态变量,静态块,静态方法,静态内部类
public class StaticClassTest {
static {
System.out.println("静态块做初始化工作");
}
public static int count;
public static int getSum(int a,int b){
return a+b;
}
public static class StaticInnerClass{
public void Register(){
System.out.println("唯一注册通道");
}
}
}
实例化
静态相关的 都不需要实例化,内存中仅一份
StaticClassTest.getSum(1,2);
StaticClassTest.count=2;
密封类
密封类也叫最终类。和普通类没有区别,有属性有方法。唯一特性:无法被之类继承
关键字:final
使用场景
创造这个类的人员觉得该类以及没有扩展的必要,也不行任何人扩展它,就会将类 加上final 修饰,使它无法被继承
定义
public final class InnerTestMain {}
实例化
和正常类一样new就好啦。密封类在日常使用中见到的极少,使用场景不太广泛
总结
罗列了一圈下来,才发现,主角是内部类。
算算看,非静态内部类,匿名内部类,静态内部类,抽象内部类,抽象静态内部类。还有lamda表达式,也是用的匿名类。
关于类的知识就讲到这里。
细说java中的类的更多相关文章
- 基础知识(05) -- Java中的类
Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...
- JAVA中的类和接口
1.类: 类是具有相同属性和方法的一组对象的集合,它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和方法两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...
- java中Color类的简单总结
java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...
- Java中String类的方法及说明
String : 字符串类型 一. String sc_sub = new String(c,3,2); // String sb_copy = new String(sb) ...
- java中的类和对象
Java中的类是一个模板,它用于描述一类对象的行为和状态. 对象则是类中的一个实例,对象有状态(属性)和行为(方法).例如一条狗就是一个对象,他的状态就是他的颜色,名字,品种:他的行为就是叫,摇尾巴, ...
- java中String类学习
java中String类的相关操作如下: (1)初始化:例如,String s = “abc”; (2)length:返回字符串的长度. (3)charAT:字符操作,按照索引值获得字符串中的指定字符 ...
- 【JAVA零基础入门系列】Day11 Java中的类和对象
今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...
- 在java中String类为什么要设计成final
在java中String类为什么要设计成final? - 胖胖的回答 - 知乎 https://www.zhihu.com/question/31345592/answer/114126087
- 关于Java中基类构造器的调用问题
在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些 ...
随机推荐
- D - Maximizing Advertising
题目链接:https://cn.vjudge.net/contest/250168#problem/D 题目大意:给你一些点的坐标,这些点属于两个帮派,让你将这些点分进两个不能重叠的矩形中,问你最多两 ...
- 第2章 线性表《C#数据结构和算法》
( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...
- [转]C++赋值运算符重载函数(operator=)
写在前面: 关于C++的赋值运算符重载函数(operator=),网络以及各种教材上都有很多介绍,但可惜的是,内容大多雷同且不全面.面对这一局面,在下在整合各种资源及融入个人理解的基础上,整理出一篇较 ...
- 用struts2 s2-045漏洞拿站记录
浏览FreeBuf时发现的文章,新出的漏洞: http://www.freebuf.com/vuls/128668.html 漏洞一出,各位大神早就写出POC: http://www.reg008.c ...
- ftruncate(改变文件大小)
ftruncate(改变文件大小) 定义函数 int ftruncate(int fd,off_t length); 函数说明 ftruncate()会将参数fd指定的文件大小改为参数length指定 ...
- mysql系列九、mysql语句执行过程及运行原理(分组查询和关联查询原理)
一.背景介绍 了解一个sql语句的执行过程,了解一部分都做了什么,更有利于对sql进行优化,因为你知道它的每一个连接.where.分组.子查询是怎么运行的,都干了什么,才会知道怎么写是不合理的. 大致 ...
- oracle 回退表空间清理
1.查看已有表空间,找到回退表空间 SELECT * FROM DBA_TABLESPACES WHERE CONTENTS='UNDO' 2.创建新的回退表空间 create undo tables ...
- LVS负载均衡器DR模型的实现
概述: 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等) 一. ...
- MySQL中adddate学习
-- 修改时间:ADDDATE(date,INTERVAL expr unit) -- 含义:date时间,expr 表达式值,unit表达式对应的时间单位 -- unit : SECOND,MINU ...
- Mysql复习大全(转)
基础知识: 1.数据库的连接 mysql -u -p -h -u 用户名 -p 密码 -h host主机 2.库级知识 显示数据库: show databases; 选择数据库: use dbname ...