Java学习第四周(1)--面向对象的多态性
来源:互联网 发布:语音视频聊天软件 编辑:程序博客网 时间:2024/05/21 06:30
1. Object类的toString()与equals(Object obj)方法
2. 面向对象的多态性
3. 抽象类与接口
一:Object类
1.toString()方法
public String toString()方法,其返回值是String类型,描述当前对象的有关信息。
如果直接打印某对象的引用,则默认会调用这个对象的toString()方法,默认打印的内容中包含这个引用所指向的内存地址。
可以根据需要在用户自定义类中重写toString()方法。
实例:
public class Student{
private String name;
private int age;
private double score;
构造方法
getXXX
setXXX
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score+ "]";
public class ToStringDemo {
public static void main(String[] args) {
Student stu=new Student("张三",20,83.5);
System.out.println(stu);
}
}
个人理解:在Student 类中,对toString()进行了重写,若不对toString方法进行重写,则会默认打印出stu对象的地址信息,得不到实例化后的结果。
2.equals()方法
public boolean equals(Object obj) 方法,提供定义对象是否“相等”的逻辑。
Object的equals方法定义为:x.equals(y),当x和y指向同一个地址时返回true,否则返回false。
String类中已经重写了equals(Object obj)方法,重写后的方法比较的是两个字符串的”内容”是否一样(注意:==比较对象的引用)。
可以根据需要在用户自定义类型中重写equals方法。
实例:
和上一个例子一样使用Student类
public class EqualsDemo {
public static void main(String[] args) {
Student stu1=new Student("哈哈",16,84);
Student stu2=new Student("哈哈",16,84);
System.out.println("stu1与stu2相等吗?"+stu1.equals(stu2));
}
}
个人理解:在对Student类实例化了两个对象后,虽然其中的变量赋值一样,但是使用equals()方法后还是会被认为是不相同的,因为此时比较的是两个对象在内存中的地址,明显不同,这时需要对其进行重写。
二:多态性
是由封装性和继承性引出的面向对象程序设计语言的另一特征
1.多态的体现
(1)方法的重载与重写
(2)对象的多态性主要分为两种:
向上转型: 子类对象->父类对象 (程序会自动完成)
格式:父类 父类对象=子类实例
向上转型后,因为操作的是父类对象,所以无法找到在子类中定义的新方法;但如果子类重写了父类的某个方法,则调用的是重写后的方法。
实例:
public class Person {
private String name;
private int age;
构造方法 getXXX setXXX
public void say() {
System.out.println("父类,姓名:" + this.name + ";年龄:" + this.age);
}
public void learn(){
System.out.println("父类的学习...");
}
}
public class Student extends Person {
private double score;
构造方法 getXXX setXXX
public void learn() {
System.out.println("子类:学习...");
}
}
public static void main(String[] args) {
Student stu=new Student("哈哈",16,84);
Person per=stu;
per.say();
per.learn();
}
个人理解:在此例中,Student类继承了Person 类的方法,并重写了learn方法,所以在实例化后调用的是重写后的方法,而say方法没有被重写,所以调用的是原方法
向下转型:父类对象->子类对象 (必须明确的指明要转型的子类类型)
格式:子类 子类对象=(子类)父类实例
注意:向下转型前先要向上转型。
实例:
和上一个例子一样使用Person类和Student类
public static void main(String[] args) {Person per=new Student("哈哈",16,84);
Student stu=(Student)per;
stu.learn();
}
2.几个关键字(instanceof,final)
(1)使用instanceof关键字判断一个对象是否属于一个类的实例
格式: 对象 instanceof 类名(返回boolean类型)
(2)使用final来修饰,在声明类、属性和方法时
注意:
[1]final修饰变量(成员变量或局部变量),则成为常量,只能赋值一次
修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。
[2]final修饰方法,则该方法不能被子类重写
final 返回值类型 方法名(参数列表) { … }
[3]final修饰类,则类不能被继承
final class 类名{ … }
三:抽象类
1.抽象类:用abstract修饰的类即为抽象类
格式:abstract class 抽象类名{ }
抽象类不能被实例化,必须被继承
2.抽象方法:由abstract修饰的方法就是抽象方法,抽象方法没有方法体。
抽象方法必须被重写,生成它的子类。
抽象类不一定要包含抽象方法,若类中包含了抽象方法,则该类必须被定义为抽象类
如果一个子类没有实现抽象父类中所有的抽象方法,则子类也成为一个抽象类。
构造方法、静态方法、私有方法、final方法不能被声明为抽象的方法。
实例:
public abstract class Person{
private String name;
构造方法 getXXX setXXX
public abstract void work();
}
public class Lawyer extends Person{
private int age;
构造方法 getXXX setXXX
public void work() {
System.out.println("律师在法院上班");
}
}
public static void main(String[] args) {
Person per=new Lawyer();
per.work();
}
个人理解:Person类的抽象方法只声明,不实现,Lawyer继承了Person类的方法并重写,先由Lawyer对象向Lawyer对象转型,再进行调用。
四:接口
接口(interface)是抽象方法和常量值的定义的集合。
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只能包含常量和方法的定义,而没有变量和方法的实现。
1.接口的声明语法
[public] interface 接口名称[extends 父接口列表] { 接口体 }
接口体:包括常量定义和方法定义
常量定义: 类型 名称=赋值; 该常量被实现该接口的多个类共享; 具有public ,final, static的属性(默认).
方法定义:具有 public,abstract属性(默认)
2.接口实现
接口的使用要通过子类,子类通过implements关键字实现接口。
一个类可以实现多个接口,在implements子句中用逗号分开。非抽象子类必须实现接口中定义的所有方法。
格式:class 子类 implements 接口A,接口B…{ }
3.使用规则
在接口中声明方法时,不能使用static,final,synchronized,private,protected等修饰符。
一个接口可以继承自另一个接口,且允许接口的多继承。
4.接口的用途
(1)通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系.
(2)通过接口指明多个类需要实现的方法
(3)通过接口了解对象的交互界面,而无需了解对象所对应的类
实例:
public interface Fly {
public static final int SPEED=200; 声明了一个常量
public abstract void fly();
}
public class Bird implements Fly{
public void fly() {
System.out.println("小鸟飞翔...");
}
}
public static void main(String[] args) {
Fly f=new Bird();
f.fly();
}
- Java学习第四周(1)--面向对象的多态性
- java 面向对象的多态性
- JAVA面向对象的多态性
- Java学习第四周(2)--面向对象第四天
- Java面向对象高级--对象的多态性
- Java面向对象--对象的多态性
- 面向对象JAVA多态性
- Java面向对象多态性
- Java面向对象多态性
- Java面向对象多态性的应用
- 面向对象的多态性
- 面向对象的多态性
- 面向对象的多态性(1)
- 面向对象--对象的多态性
- java面向对象(十四) 多态性
- JAVA面向对象之多态性
- Java面向对象多态性应用
- Java面向对象中的多态性
- 还原点
- java 中 Iterator 和 Iterable 区别
- 培训第十四天 线程
- 知识学习——Hadoop InputFormat
- freemarker自定义指令(七)
- Java学习第四周(1)--面向对象的多态性
- python 判断列表中每个元素有几个
- (十六)Map
- poj 2542 题解
- 【tensorflow】在不同层上设置不同的学习率,fine-tuning
- 无穷小微积分与考研实践
- ASP ViewState对象,完成客户端状态保持
- 林轩田之机器学习课程笔记(why can machines learn之training versus testing)(32之5)
- HTML textarea value赋值