目录
this关键字(隐式参数)
继承
基本概念
小结
方法的重写(override)
Object类
super关键字
组合
this关键字(隐式参数)
1.普通方法中,this总是指向调用该方法的对象
2.构造方法中,this总是指向正要初始化的对象
3.通过this调用其他构造方法(必须位于第一句)
this不能用于 static方法
在类中的方法中为默认传参,即当前对象
eg1:
public class Student {
public void study(){
this.name = "张三";
System.out.println(name+"在学习");
}
}
当运行对象的study方法时该对象的name属性为张三
eg2:
public class Student {
String name;
int id;
public Student(String name,int id){
this.name = name;
this.id = id;
}
}
与name,id区分,若不加this会被当做参数的变量等于没执行任何操作
public void setName(String name){
this.name = name;
}
同上
eg3:
public class Student {
String name;
int id;
public Student(String name,int id){
this();
this.name = name;
this.id = id;
}
public Student(){
System.out.println("构造一个对象");
}
}
继承
基本概念
类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模
提高代码的复用性
extands的意思是“扩展”。子类是父类的扩展
eg:
原代码:
public class Animal {
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
}
class Human{
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public void taiSheng(){
System.out.println("胎生");
}
}
class Bird{
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public void eggSheng(){
System.out.println("卵生");
}
}
各类之间有共同代码或方法,使用 extends关键字继承:
public class Animal {
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
}
class Human extends Animal{
public void taiSheng(){
System.out.println("胎生");
}
}
class Bird extends Animal{
public void eggSheng(){
System.out.println("卵生");
}
}
小结
子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法)
java中只有单继承,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。多继承,就是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。(一个类只能有一个直接父类)
java中的多继承,可以通过接口来实现
如果定义一个类时,没有调用 extends,则它的父类是:
java.lang.object
不同的叫法:超类、父类、基类、子类、派生类
方法的重写(override)
在子类中可以根据需要对从基类中继承来的方法进行重写。
重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型
重写方法不能使用比被重写方法更严格的访问权限。(由于多态)
eg:
Animal.java
public class Animal {
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
}
class Bird extends Animal{
public void run(){//重写run方法
System.out.println("飞");
}
public void eggSheng(){
System.out.println("卵生");
}
}
Test.java
public class Test {
public static void main(String[] args) {
Bird b = new Bird();
b.run();
}
}
实现的方法为重写后的
若重写后需调用父类:super
class Bird extends Animal{
public void run(){//重写run方法
super.run();
System.out.println("飞");
}
public void eggSheng(){
System.out.println("卵生");
}
}
Object类
Object类是所有Java类的根基类
如果在类的声明中末使用 extends关键字指明其基类,则默认基类为 object类
重写:toString方法:
默认返回:包名+类名+@+哈希码
可以重写
哈希码:根据对象内存位置生成,唯一不重复
super关键字
super是直接父类对象的引用。可以通过 super来访问父类中被子类覆盖的方法或属性。
普通方法:
没有顺序限制。可以随便调用。
每个方法都默认有两个参数:this和super
构造函数中:
任何类的构造函数中,若是构造函数的第一行代码没有显式的调用super(···);那么Java默认都会调用 super();作为父类的初始化函数。所以 super();加不加都无所谓。
组合
“is-a”关系使用继承
“has-a”关系使用组合
eg:继承中的例子:
public class Animal2 {
String eye;
public void run(){
System.out.println("跑");
}
public void eat(){
System.out.println("吃");
}
public Animal2(){
System.out.println("创建一个动物");
}
public static void main(String[] args) {
Bird2 b = new Bird2();
b.run();
}
}
class Human2{
Animal2 animal2 = new Animal2();;
public void taiSheng(){
System.out.println("胎生");
}
}
class Bird2{
Animal2 animal2 = new Animal2();
public void run(){
animal2.run();
System.out.println("飞");
}
public void eggSheng(){
System.out.println("卵生");
}
public Bird2(){
System.out.println("创建一个鸟对象");
}
}
运行结果:
创建一个动物
创建一个鸟对象
跑
飞
作用与继承相同