文档章节

java - 类

KuangCaibao
 KuangCaibao
发布于 2015/04/24 15:21
字数 890
阅读 24
收藏 0
package tdx;

class C1 {
	public int c1;
	public C2 c2;
	
	public C1(int c1, C2 c2) {
		this.c1 = c1;
		this.c2 = c2;
	}
	
	public void Print() {
		System.out.println(this.c1);
	}
}

class C2 {
	public int c2;
	public C1 c1;
	
	public C2(int c2, C1 c1) {
		this.c1 = c1;
		this.c2 = c2;
	}
	
	public void Print() {
		System.out.println(this.c2);
	}
}

public class ClassTest {

	public static void main(String[] args) {
		
		C1 c1 = null;
		C2 c2 = new C2(2, c1);
		c1 = new C1(1, c2);
		
		c2.Print();
		c1.Print();
		c1.c2.Print();
		c2.c1 = c1;
		c2.c1.Print();
	}
}

// output
2
1
2
1

像C++中变量的定义一样,关键字 class 定义一个类,然后 C1 c1 = null;   在内存中应该和C++中类似。变量 c1 占据了一个4B大小的空间,它的值存放的是null值,就是空值。但是 c1 的类型为类C1。所以在 C2 的构造函数中入参c1没有问题。

类分为抽象类和一般类。

抽象类与一般类的区别:

  1. 抽象类中有抽象方法,就是没有被实现的方法,类似与接口。普通类中的所有方法都必须实现。

  2. 抽象类不能被单独实例化。

抽象类定义:

// 抽象类
public abstract class AbsCls {
  
  // 可以定义静态变量和方法
  // 这里的静态变量和方法都必须是非抽象的
  public static final int num = 0;       // 也可以定义成 private 类型
  // public static abstract void Print();   //error 不能定义静态的抽象方法
  
  // 可以不用在抽象类中定义抽象方法
  // 如果没有定义抽象方法,这时这个抽象类就和普通类一样,但是不能被单独实例化
  public abstract void aPrint();
}

2015-05-29

关于抽象类不能被单独实例化,但是在代码中经常可以看到这样的用法。

package test.abs;

abstract class abs {
	public abstract void Print();
}

public class AbstractClassTest {

	public static void main(String[] args) {
		
		abs a = new abs() {
			@Override
			public void Print() {
				System.out.println("hello world");
			}
		};
		
		a.Print();
	}
}

这里可以看到,程序不会报错。同时也会输入: hello world

接口

接口的作用是什么,是抽象。抽象出统一的方法,然后让具体的类去实现。

接口和抽象类的区别: 

1. 接口和抽象类都可以自己实现函数,对于接口,实现的函数必须加 static 关键字,即将方法声明为静态方法;抽象类则不用 static 关键字。

package test.cls;

interface its {
	
	public static void uPrint() {
		System.out.println("its uPrint");
	}
	
	public void iPrint();
}

abstract class abs {
	
	public static void sPrint() {
		System.out.println("abs sPrint");
	}
	
	public void uPrint() {
		System.out.println("abs uPrint");
	}
	
	public abstract void iPrint();
}

class cls1 extends abs {
	
	public void iPrint() {
		System.out.println("abs iPrint");
	}
}

class cls2 implements its {
	
	public void iPrint() {
		System.out.println("its iPrint");
	}
}

public class ClassTest {
	
	public static void main(String[] args) {
		
		cls1 c1 = new cls1();
		cls2 c2 = new cls2();
		
		c1.iPrint();
		c2.iPrint();
		
		c1.uPrint();
//		try {
//			c2.uPrint();
//		} catch(Exception e) {
//			e.printStackTrace();
//		}
		
		c1.sPrint();
	}
}

/*
  输出:
  abs iPrint
  its iPrint
  abs uPrint
  abs sPrint
  其中 c2.uPrint(); 这句话会有语法错误
*/

可以看到,抽象类定义实现的方法(不管是 static 还是 public 方法),都可以在子类中使用。而对于接口来说,其只能实现静态方法,并且不能被其实现类使用。

接口和抽象类的共同点:

  1. 他们中定义的接口方法或者是抽象方法都必须在子类中实现,不能只实现一部分。

所以理想的模型是这样的:

接口抽象方法 --> 抽象类去实现接口  --> 一个默认实现类  --> 你的实现类

package test.cls;

interface its {
	
	public void iPrint();
	public void uPrint();
}

abstract class abs implements its {
	
	public void iPrint() {
		System.out.println("this is abs iPrint");
	}
	
	public abstract void uPrint();
}

class dfcls extends abs {
	
	public void uPrint() {
		System.out.println("this is a default uPrint");
	}
}

class cls extends dfcls {
	
	@Override
	public void uPrint() {
		System.out.println("this is a redefined uPrint");
	}
}

public class ClassTest {
	
	public static void main(String[] args) {
		
		cls c = new cls();
		c.iPrint();
		c.uPrint();
	}
}

/*
  输出:
  this is abs iPrint
  this is a redefined uPrint
*/


© 著作权归作者所有

KuangCaibao
粉丝 2
博文 21
码字总数 10699
作品 0
武汉
程序员
私信 提问
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
什么是Java语言?java语言简介

Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的W...

阿秀a
2010/10/19
0
0
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
2018/08/29
0
0
1-Java基础语法-Java初识

欢迎大家来到java世界 带领大家领略编程的奥秘。 人与人沟通需要语言。计算机世界的沟通语言。 Java语法结构,使用循环和选择流控制结构,了解方法和数组的使用。 Java简介 Java是一门编程语...

天涯明月笙
2018/07/29
0
0
Java虚拟机JVM内部体系结构

Java虚拟机JVM内部体系结构 易百教程移动端:请扫描本页面底部(右侧)二维码并关注微信公众号,回复:"教程" 选择相关教程阅读或直接访问:http://m.yiibai.com 。 JVM(Java虚拟机)是一个抽象...

LYQ1990
2018/07/18
250
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
今天
9
0
Qt程序各个平台打包发布及安装程序大全

本文链接:https://blog.csdn.net/zhengtianzuo06/article/details/78468111 通用: 1.准备图标 图标可以直接使用一般格式的图片制作, 比如jpg, png等 推荐使用Photoshop制作原始图 推荐使用I...

shzwork
今天
12
0
springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
22
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
26
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部