栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Object、类关系、内部类、设计模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java Object、类关系、内部类、设计模式

1.Object 1.1是什么

 

1.2Equals
package _01_Object;


public class Equals_01 {

	public static void main(String[] args) {
		Student s1 =new Student (10086,"法外狂徒张三");
		Student s2 = new Student (10086,"法外狂徒李四");
		System.out.println(s1==s2);
		System.out.println(s1.equals(s2));
	}
}
//创建一个类 学生类
class Student {
	//定义一个私有的 整形 学号  ; 私有的   字符串类型的 名字
	private int id;
	private String name;
	@Override
	public boolean equals (Object obj){
		//需求: 规定id相同 ,就是同一个学生
		//1. 先比较地址, 地址一样 说明是同一个对象,直接返回ture
		if (this ==obj){
			return true;
		}
		//2. 不相同说明不是一个对象 ,那么需要判断是否是同类 ,不同类没有可比性
		if (obj instanceof Student){
			//向下转型, 否则会因为多态丢失子类特有的(多态的缺点),  instanceof 向下转型修饰符
		   Student s = (Student) obj;  //强制类型转换 把obj强制转换成Studnet类型 父类对象转换成子类发生多态
		   //String 中覆写了equals方法,比较的是值
		   if (this.id==s.id){
			   return true;
		   }
		}
		return false;
		
	}
	public Student (int id, String name){
		this.id=id;
		this.name=name;
	}
}

 

1.3Finalize
package _02_Finalize;


public class Finalize_01 {

	public static void main(String[] args) {
		//创建对象
		Finalize_01 f =new Finalize_01();
		//给变量f赋值为null
		f = null;
		//程序员可以"建议"垃圾回收器回收
		new Finalize_01();
		
	}
	@Override
	public void finalize(){
		System.out.println(this +": 垃圾回收");
	}
}


1.4HashCode
package _03_HashCode;


public class HashCode_01 {

	public static void main(String[] args) {
		HashCode_01 h = new HashCode_01();
		//打印输出的是这个值的地址   15db9742
		System.out.println(h);
		//打印输出的为十进制的值       366712642
		System.out.println(h.hashCode());
		// toHexString : 转换为16进制显示, 是integer类中的静态方法      366712642
		System.out.println(Integer.toHexString(366712642));
		
	}

}
1.5toString
package _04_toString;


public class TOString_01 {

	public static void main(String[] args) {
		Person person1 =new Person(1008611,"法外狂徒张三",18);
		Person person2 =new Person(1008612,"法外狂徒李四",21);
//		System.out.println("我叫"+person1.getName()+"我的编号是"+person1.getId()+"我今年"+person1.getAge()+"岁了");
//		System.out.println("我叫"+person2.getName()+"我的编号是"+person2.getId()+"我今年"+person2.getAge()+"岁了");
       //为了简化代码用toString() 方法 可以得到相同的结果
		System.out.println(person1);
		System.out.println(person2);
		
	}
}
class Person{
	private int id;
	private String name;
	private int age;
	public Person(int id, String name, int age) {
		super();
		this.id=id;
		this.name=name;
		this.age=age;
	}
	
	@Override
	public String toString() {
		return  "我叫" + this.getName() + ",我的编号是" + this.getId() + ",我今年"
				+ this.getAge() + "岁了";
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
2.类与类之间的关系

类与类单继承

接口与接口多继承

类与接口多实现

纵向的关系: 继承,实现

横向的关系: 依赖,关联

整体和局部: 组成型整体和局部, 聚堆儿型的整体和局部

一、继承关系/泛化关系      继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字 extends明确标识,在设计时一般没有争议性。在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口。 


二、实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系。在Java中此类关系通过关键字 implements明确标识,在设计时一般没有争议性。在UML类图设计中,实现用一条带空心三角箭头的虚线表示,从类指向实现的接口。 


三、依赖关系      简单的理解,依赖就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,方法执行完,这个关系就不存在了,就是临时使用了一下功能,但是类B的变化会影响到类A。比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖。表现在代码层面,为类B作为参数被类A在某个method方法中使用。在UML类图设计中,依赖关系用由类 A指向类B的带箭头虚线表示。 

       在程序的整个流程中(程序的生命周期),某个步骤,某几个有限的步骤,需要另外一个类的功能才能完成

比如在一个方法中调用了另外一个类

说白话:就是一个类的局部变量是另一个类的对象的引用.


四、关联关系  关联体现的是两个类之间语义级别的一种强依赖关系,比如我和我的朋友,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性 的,而且双方的关系一般是平等的。关联可以是单向、双向的。表现在代码层面,为被关联类B以类的属性形式出现在关联类A中,

ClassC cc = new ClassC()

ClassC.staticVar

全局变量,就是指他的成员变量,静态变量

也可能是关联类A引用了一个类 型为被关联类B的全局变量。在UML类图设计中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标 记。 

就是一个类成员变量或者静态变量是另外一个类的引用或者是类对象的引用
五、聚合关系      聚合是关联关系的一种特例,它体现的是整体与部分的关系,即has-a的关系。此时整体与部分之间是可分离的,它们可以具有各自的生命周期,部分可以属于 多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等,比如一个航母编队包括海空母舰、驱护舰艇、舰载飞机及核动力攻击潜艇 等。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML类图设计中,聚合关系以空心菱形加实线箭头表示。 

一类中的集合元素是另外一个类的对象的引用
六、组合关系/合成关系     组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。它同样体现整体与部分间的关系,但此 时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束,比如人和人的大脑。表现在代码层面,和关联关系是一致的,只能从语义级别来区 分。在UML类图设计中,组合关系以实心菱形加实线箭头表示。 

 

一个类中的集合中的元素是另外一个类对象的引用
七、总结     对于继承、实现这两种关系没多少疑问,它们体现的是一种类和类、或者类与接口间的纵向关系。其他的四种关系体现的是类和类、或者类与接口间的引用、 横向关系,是比较难区分的,有很多事物间的关系要想准确定位是很难的。前面也提到,这四种关系都是语义级别的,所以从代码层面并不能完全区分各种关系,但 总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖。

软件开发的流程

       项目->确定需求->设计模块(模型)->编码->测试->交付和部署->后期维护

 3.内部类 3.1是什么


 类体中 还有其他的类 ,该类就叫内部类
 当一个类的内部,需要又一个完整的结构进行描述,而这个内部的完整结构又只为了外部类提供服,此时该类可以定义为内部类


 内部类的优点 : 可以访问外部类的所有属性, 包括私有化属性

 
 成员内部类 : 可以看作成员变量
 静态内部类 : 可以看作静态变量
 局部内部类: 可以看作局部变量
 匿名内部类: 可以看作实参


 3.2成员内部类
public class OuterClass_01 {
	//private 私有化 static 修饰符 修饰静态 String 字符串
	private static String s1 = "私有化静态";
	//再类中没有用static修饰的为成员方法
	private String s2 = "私有化成员";

	// 成员内部类,没有static修饰
	// 可以使用权限控制修饰符的
	// 成员内部类中可以 直接 访问外部类的所有属性
	// 在成员内部类中不能有静态声明
	// 内部类编译之后的类名为 : 外部类类名$内部类类名
	class InnerClass {
//		 static int a = 1;
//		 public static void m1(){}
		public void m2(){
			System.out.println(s1);
			System.out.println(s2);
		}
	}
	public static void main(String[] args) {
		// 外部类对象
		OuterClass_01 outerClass_01 = new OuterClass_01();
		// 通过外部类对象创建内部类对象
		InnerClass innerClass = outerClass_01.new InnerClass();
		innerClass.m2();
	}
}

3.3静态内部类
package _03_InnerClass;

public class OuterClass_02 {
	private static String s1 = "私有化静态";
	private String s2 = "私有化成员";

	// 静态内部类,使用static修饰
	// 可以使用权限控制修饰符的
	// 内部类编译之后的类名为 : 外部类类名$内部类类名
	// 在静态内部类中 成员也能声明 静态也能声明
	// 在静态内部类中,无法直接访问外部类的成员属性,需要有对象才行
	static class InnerClass {
		public void m1() {
			//访问静态方法的时候 可以直接访问
			System.out.println(s1);
			// System.out.println(s2);
			// 创建外部类对象才能调用 外部类的成员属性
			OuterClass_02 o = new OuterClass_02();
			System.out.println(o.s2);
		}

		public static void m2() {
			System.out.println(s1);
			// System.out.println(s2);
			// 创建外部类对象才能调用 外部类的成员属性
			OuterClass_02 o = new OuterClass_02();
			System.out.println(o.s2);
		}
	}
	public static void main(String[] args) {
		//创建对象 在静态类中只能通过创建对象才能访问外部类的成员属性
		OuterClass_02.InnerClass.m2();
		// 外部类类名可以省略
		//调用方法m2
		InnerClass.m2();
		// 创建对象
		InnerClass innerClass = new OuterClass_02.InnerClass();
		// 外部类类名可以省略
		innerClass = new InnerClass();
		innerClass.m1();
	}
}
3.4局部内部类
package _03_InnerClass;


public class OuterClass_03 {
	private static String s1 = "私有化静态";
	private String s2 = "私有化成员";

	public void m1() {
		final int i = 100;
		class InnerClass {
//			 static int x=2;
			public void m3() {
				System.out.println(s1);
				System.out.println(s2);
				System.out.println(i);
			}
		}
		// 不能在更改
		// i=2;
		// 局部内部类只能在方法内部使用
		// 创建内部类对象
		InnerClass innerClass = new InnerClass();
		innerClass.m3();
	}
	public static void m2() {
		final int i = 100;
		class InnerClass {
			public void m3() {
				System.out.println(s1);
				// 静态方法中的内部类,不能直接访问外部类的成员属性,需要创建外部类对象才行
				// System.out.println(s2);
				System.out.println(i);
			}
		}
		// 不能在更改
		// i=2;
		// 局部内部类只能在方法内部使用
		// 创建内部类对象
		InnerClass innerClass = new InnerClass();
		innerClass.m3();
	}
	public static void main(String[] args) {
		OuterClass_03 outerClass_03 = new OuterClass_03();
		outerClass_03.m1();
		m2();
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/327523.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号