十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
LinkedList list= new LinkedList();
创新互联:成立于2013年为各行业开拓出企业自己的“网站建设”服务,为上1000+公司企业提供了专业的网站设计、成都网站设计、网页设计和网站推广服务, 按需搭建网站由设计师亲自精心设计,设计的效果完全按照客户的要求,并适当的提出合理的建议,拥有的视觉效果,策划师分析客户的同行竞争对手,根据客户的实际情况给出合理的网站构架,制作客户同行业具有领先地位的。
list.addFirst(dog2);
list.addLast(dog3);
你往linkedlist总共只加了2只dog,删掉2个 就没了
当用子类的构造方法创建一个子类对象时,子类的构造方法总是先调用父类的某个构造方法。
也就是说,如果子类的构造方法方法没有明显的指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。你这里的Dog子类创建实例对象时首先调用的是Animal父类的无参构造函数。你看看是不是构造函数这一块出了问题。
如果你不写这些注释掉得成员属性,那么子类和父类的构造函数都是对父类继承下来的属性进行赋值。如果写了这些注释掉得成员属性,那么子类的构造函数会对这些注释掉得属性赋值而不去管从父类继承来的属性,父类的构造函数会对父类的属性进行赋值而不会影响到子类的成员属性。
看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
对象是类的一个具体实例。类相当于对象的模板。
在Java中,有句话叫“万物皆对象”。要掌握Java编程,必须正确理解对象的概念。
在我学Java的时候,老师告诉我,Java的对象不是找对象的那个对象。
上面的比喻也可以。下面是一段伪代码,模仿你说的情况:
girlFriend myGirlFriend = new girlFriend(女朋友的属性);//初始化对象
myGirlFriend.表白(表白的属性);
不过,这个比喻不够确切:
比喻太片面,对象不一定是女朋友,也可以是其他东西
应先有女朋友再表白,否则JVM抛NullPointerException
不应该说系统给你对象,应该说JVM初始化对象,因为Java代码是运行在JVM中的,而且对象是用new关键字初始化来的
整个过程中不一定没有问题,比如现实生活中表白不一定成功
此外,Java中对象的英文是Object,翻译成中文有物体,目标等意思,供参考
不清楚的内容请自己求度娘
仅前面部分内容摘自cnblogs用户shaojian的文章,其余均为原创
代码如下:
abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void enjoy();
}
class Cat extends Animal {
private String eyesColor;
public Cat(String name) {
super(name);
}
public String getEyesColor() {
return eyesColor;
}
public void setEyesColor(String eyesColor) {
this.eyesColor = eyesColor;
}
@Override
public void enjoy() {
System.out.println("小猫" + getName() + "高兴的喵喵叫。");
}
}
class Dog extends Animal {
private String furColor;
public Dog(String name) {
super(name);
}
public String getFurColor() {
return furColor;
}
public void setFurColor(String furColor) {
this.furColor = furColor;
}
@Override
public void enjoy() {
System.out.println("狗狗" + getName() + "高兴的摇起了尾巴。");
}
}
class Lady {
private String name;
private Animal pet;
public Lady(String name, Animal pet) {
this.name = name;
this.pet = pet;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Animal getPet() {
return pet;
}
public void setPet(Animal pet) {
this.pet = pet;
}
public void myPetEnjoy() {
pet.enjoy();
}
}
public class App {
public static void main(String[] args) {
Cat cat = new Cat("Jerry");
cat.setEyesColor("蓝色");
Lady lady1 = new Lady("张女士", cat);
lady1.myPetEnjoy();
Dog dog = new Dog("旺财");
dog.setFurColor("黄色");
Lady lady2 = new Lady("王女士", dog);
lady2.myPetEnjoy();
}
}
前言
这一篇文章是对java的Object的方法的equals的描述,也包括对重写方法写的一些理解。
一、Object类的equals方法?
1. Object是什么?
首先要明确Object类中有什么,它是什么?
Object类在《java核心技术1》中是这样描述的是Java中所有类的始祖,每个类都是尤其扩展出来的。所以我们创建的类应该都会有应该有这样的表达:
public class Classname extends Object{ }
登录后复制
但其实上公司早已经考虑过这个问题了,所以每个类都是默认继承Object的。所以直接就可以就可以引用Object类中的方法,编译器是不会报错的。
2. equals方法的解析
1、 为什么需要这个方法?
因为传统的逻辑判断“ == ”,是去判断数据在内存堆中地址,基础数据在堆中内存是相同的,所以 “ ==”最后是对数据的值来进行比较的。
2、 equals方法在书上的解析
在《Java核心技术1》中对equals方法的描述是用于检查一个对象是否等于另一个对象,这两个对象是否具有相同的引用。然后接下来我会使用代码,以及代码运行的结果对这个方法进行讲解。
/*
我们创造一个Employee类来验证——一个对象是否等于另一个对象,这两个对象是否具有相同的引用
*/
public class Employee extends Person{
private int salary;
private int worktime;
public Employee(String name, String sex,int salary, int worktime) {
this.name = name;
this.sex = sex;
this.salary = salary;
this.worktime = worktime;
}
/*
现在我们目标是使用equals方法
具体实现是:
1.首先先使用Employee类来进行信息的比对
2.再使用Student类和Employee类进行比对
*/
//step1
Employee employee1 = new Employee("啊狗","男",2000,12);
Employee employee2 = new Employee("啊狗","男",2000,12);
//现在我们创造两个数据皆相同的对象我们现在进行equals方法的判断
System.out.println(employee1.equals(employee2));
登录后复制

终端会给我们输出false,我们可以开调试来看看为什么会输出flase。我们可以看到employee1和employee2地址会不同,这就能解释到《Java核心技术1》对Object类中的equals方法是对比一个对象是否等于另外一个对象。这不仅仅局限于数据的相同,也需要去判断数据存放的地址是否相同。
3. 对上公司的Object类方法的理解
深入的我们可以去看看上公司如何写Object类的equals方法。
public boolean equals(Object obj)
return (this == obj);
}
登录后复制
这里的equals方法接入的是Object类, (this == obj)这句话的意思是当前对象和传入obj地址是否相等,因为 “==”的作用就是比较两者地址是否相同。
4. 对上公司对重写的equals方法的一些理解
那么接下来我们研究方向就是如何让两个数据相同的对象相同,这一点由为之重要。上公司已经非常贴心地为我们重写好了这个方法,我们可以一起看看这个方法地实现。
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return salary == employee.salary worktime == employee.worktime;
}
登录后复制
if (this == o) return true;
登录后复制
这句话是自反性的体现,先使用this调用当前对象,然后再将对象o放入判断语句中,也就是书中所说的对于非空引用x,x.equals(x)会返回true。
if (o == null || getClass() != o.getClass()) return false;
登录后复制
这句话是将调用getClass()方法,因为两个不同的类不可以做比较,会直接返回false的。具体我们可以利用我们的Student类和Employee类来做比较。
Employee employee1 = new Employee("啊狗","男",2000,12);
Student student = new Student("啊猫","男",18,"智能科学");
//2.再使用Student类和Employee类进行比对
System.out.println(employee1.equals(student));
登录后复制
无论从直观上还是客观上来看,我们都能会觉得终端会输出false,事实如此,确实最后终端是输出了false。
Employee employee = (Employee) o;
登录后复制
这句话又是什么意思呢?这个涉及一个强制类型转化的知识,因为所有类都默认继承或者间接继承Object类,因为前面已经使用getClass方法来判断类是否相同,所以这里不需要进行instanceof来判断两个类是否相同,如果两个类不同的话,直接运行java会抛出ClassExceptionError错误。这一步就是让传入的值获得自己私有得信息,这一个点是涉及多态的缺点的缘由。
return salary == employee.salary worktime == employee.worktime;
登录后复制
这一句话我们可以通过调试来看看到底相比较的是什么?我们可以看到是将当前对象的salary和worktime的值来和传入对象的salary和worktime的值比较,这样就可以免除“==”比较地址而造成最后的结果和主观感觉不一样的预期。
总结
这篇文章是我第一次写博客,文章结合《java核心技术1》对Object类中的equals方法的一点理解的,本来想写Object类常用API的一个汇总,但是鉴于能力的不足,所以最后仅仅只是写了equals方法的理解。这一次编写博客的过程中,我明显发现自己对很多不理解的地方,本文如果有讲解错误,或者讲解不当的地方,希望大家能指正我的错误,感谢!
这类问题主要考你接口和抽象类,多态的问题。首先要了解他们的作用,然后再出发。请打好基础,学习这门语言很重要。。。。
代码1: public interface Animal
代码2:public void playSound(){
System.out.println("现在播放"+new Dog().getAnimalName()+"类的声音");
System.out.println("现在播放"+new Cat().getAnimalName()+"类的声音");
}
代码3:
public void cry(){
System.out.println("汪汪.....汪汪");
}
代码4:public String getAnimalName(){
return "狗";
}
代码5:
public void cry(){
System.out.println("喵喵.....喵喵");
}
代码6:public String getAnimalName(){
return "猫";
}