`
zisefeiniao
  • 浏览: 168585 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

天啊,MLDN中心真让我懂得什么叫学习了.坚持,为了高薪

阅读更多
今天所讲的知识点
A 面向对象的第二特点:继承
B 子类:(实例化过程、覆写父类的方法、覆写父类的属性)
C final关键字
D 抽象类(abstract)和抽象方法
E 接口(interface)
F 面向对象的第三特点:多态性
G instanceof关键字
H Object类
I super关键字和this关键字的区别




我对知识点的分析

A 一、继承的概念
首先,回忆一下,面向对象的第一个特征是封装,即把一个类的属性和部分方法进行私有化,即封装保护起来。
当一个类的属性方法只是需要在另一个类的基础上进行扩展设计即可的时候就可以采用继承的手法,这样被继承的类叫父类或者叫做超类,而继承别人的类叫做子类或者派生类。

二、继承的特点
1、在JAVA中的继承和生活中的继承的区别在于,在JAVA中的继承是在原有基础上扩展,即没有“败家子”;
2、在java中所有的继承只是子类继承了父类中的公共操作。
更具体的来讲,是直接继承了所有的操作,只是非私有的操作是直接继承的,而私有的操作是隐含继承的(隐含继承是指通过间接的方式继承私有属性和操作,例如私有属性的继承通过继承的setter和getter方法间接访问私有属性)。
3、关于类的继承有一个限制:一个子类只能继承自一个父类,所以在Java中不支持多重继承
4、但是在Java中允许多层继承,即:一个子类可以有一个父类,一个父类还可以有其自己的父类。
5、能采用“super.”使用父类的方法、属性的尽量使用,而不要采用完全重写相同的代码

三、子类继承父类的格式
class 子类 extends 父类{}


B 一、子类的实例化过程
一个继承的子类进行实例化操作的时候,首先会先让其父类进行实例化操作,然后进行自己的实例化操作。
说明:
(1)在进行子类对象的实例化之前首先会默认调用父类中的无参构造方法,为父类中的属性进行初始化操作,之后再调用子类自己的构造方法完成子类的初始化操作;
(2)当然在子类的构造方法中可以用过super关键字指明需要调用的是那个构造方法;
(3)如果要用“super(【参数】);”语句调用父类的构造方法时,必须放在该构造方法的首行;
(4)如果没有写任何的super语句,则在子类的构造方法中的第一行默认隐含了一个“super();”
(5)如果父类没有无参构造函数(即所有构造函数都显式定义为有参的),那么在子类的构造方法中必须用“super(参数);”显式的调用父类的某个构造方法;

二、方法的覆写
在子类中声明了与父类中同名且参数个数及参数类型一致的方法,称为方法的覆写。
注意:
(1)在进行方法的覆写时必须注意被覆写的方法不能拥有比父类更严格的访问权限。
访问权限严格的关系:public > default(默认) > private
(2)必须记住的一个原则:“在使用子类对象操作的时候,调用的方法永远是被子类覆写过的方法。”
(3)如果想在子类中调用被覆写的父类的方法,则需要用“super.方法()”;
(4)如果想要覆写父类中的私有方法,那么在子类中对该方法覆写后,必须连同调用该私有方法的其他方法也一起覆写,这样的覆写才起到作用。(这点结论的分析见问题及分析解决方法A)
(5)覆写的方法必须与父类的方法返回值类型一致,否则会报错
例如:
ReWriteMethod.java:27: print() in B cannot override print() in A; attempting to
use incompatible return type
found   : java.lang.String
required: void
        public String print(){          //(aa:)
                      ^
1 error

在此需要区分方法的覆写与方法的重载的概念:
方法的重载及覆写的比较
No. 比较点 重载 覆写
1 定义 方法名称相同,参数的类型或个数不同 方法名称、参数的类型和个数完全相同
2 注意点 ----- 访问权限不能更加严格
  与返回值无关 返回值必须一致
3 范围 发生在一个类中 发生在继承关系中


三、属性的覆写(了解)
在子类中声明了与父类中同名但数据类型不一致的属性,称为属性的覆写。

C 在Java中可以使用final关键字完成以下的操作:
• 使用final关键字声明一个类,这个类不能有子类,即“不能有下一代的类”
• 使用final关键字声明一个方法,这个方法不能被子类覆写,即“不可替代的方法”
• 使用final关键字声明一个常量,常量即表示不可修改
例如:
final class A{
};
class B extends A{
};
报错信息:
ReWriteMethod.java:24: cannot inherit from final A
class B extends A{
                ^
1 error
-----------------------------------------------------------------------------------------------------------
class A{
public final void fun(){}
};
class B extends A{
public void fun(){} // 不能被覆写
};
报错信息:
ReWriteMethod.java:26: fun() in B cannot override fun() in A; overridden method
is final
        public void fun(){}     // 不能被覆写
                    ^
1 error
--------------------------------------------------------------------------------------------
class A{
public final String INFO = "MLDN" ;
public void fun(){
  INFO = "world" ;
  System.out.println(INFO) ;
}
};
报错:
ReWriteMethod.java:25: cannot assign a value to final variable INFO
                INFO = "world" ;
                ^
1 error
关于常量的补充提示:
1、 常量的命名规则是全部字母大写:INFO
2、 使用public static final声明的常量称为全局常量。public static final String INFO = "MLDN" ;
D 抽象类(abstract)和抽象方法
一、概念
用abstract关键字声明的类为抽象类。
在抽象类或者接口中只声明而未实现的方法称为抽象方法,在抽象类中抽象方法必须使用abstract关键字声明,而在接口中可以省略,因为接口中的方法只能是抽象方法。
二、特点
1、抽象类不能直接实例化
2、一个抽象类必须被子类所继承,且被继承的子类(如果不是抽象类)则必须覆写抽象类中的全部抽象方法
3、抽象类不能使用final关键字修饰,因为用final声明的类不能被继承,而抽象类确必须被继承;
4、虽然抽象类不能直接被实例化,但抽象类可以有构造方法,而且子类对象实例化的时候的流程与普通类的继承是一样的,都是要先调用父类中的构造方法(默认是无参的),之后再调用子类自己的构造方法,如果要想调用抽象类中有参的构造方法必须在子类的构造方法的第一行使用“super.(参数)”来调用。所以抽象类的对象是通过子类间接实例化的。
三、总结
1、抽象类就是普通类的一个扩展,只是实例化被受到了限制,然后在普通类的基础之上加上了抽象方法而已,除此之外与普通类是完全一致的。
2、抽象类完成的是一个模板的功能。

四、抽象类和抽象方法的定义方法
抽象类的定义方法即在class的前面加上abstract关键字
抽象方法的定义方法即在返回值类型前面加上abstract关键字,并且只是声明方法,没有具体的实现语句,即无方法的“{}”实现部分

E 接口(interface)
一、概念
如果一个类中的全部方法都是抽象方法,全部属性都是全局常量,那么就可以将这个类定义成一个接口。
接口的定义格式:
interface 接口名称{
全局常量 ;  //public static final 数据类型 全局常量名;
抽象方法 ;  //public abstract 返回值类型  方法名(【参数列表】);
}
例如:
二、特点
(1)接口中的所有方法的访问权限都是public;
(2)接口本身都是由全局常量和抽象方法组成,所以在属性的声明部分可以省略“public static final”关键字的修饰,而抽象方法的声明部分可以省略“public  abstract”关键字,而一般习惯上都只省略“abstract”;
(3)接口必须通过子类才能实现,而一个子类可以同时继承多个接口,子类继承接口采用如下的语法格式:            class 子类 implements 父接口1,父接口2….;
那么子类需要实现继承的所有接口的抽象方法
(4)一个抽象类可以继承一个或者多个接口,而一个接口不能继承一个抽象类;
(5)如果一个类即要实现接口,又要继承抽象类的话,则按照以下的格式编写即可:
class 子类 extends 父类 implements 父接口1,父接口2,…{}
那么此时,就要求此子类实现抽象类及全部接口的抽象方法
(6)一个接口可以继承一个或者多个接口,那么此时,就要求此接口的子类要实现全部接口的抽象方法
(7)接口的主要作用在于定义标准。
F 面向对象的第三特点:多态性
对象多态性分为两种:一种属于方法的重载与覆写,另外一种就是对象多态性。
对象多态性,是从子类和父类对象类型的相互转换而来的:
• 向上转型:将子类实例变为父类实例
|- 格式:父类 父类对象 = 子类实例 ; 自动完成
|- 以基本数据类型操作为例:int i = 'c' ;  因为c的容量比int小,所以可以自动完成
|- 向上转型可以自动完成,完成之后调用的方法是被子类覆写过的方法。
• 向下转型:将父类实例变为子类实例
|- 格式:子类 子类对象 = (子类)父类实例 ; 强制完成
  |- 以基本数据类型操作为例:char c = (char)98 ;  因为整型的容量比char大,所以强制完成
注意:在相互转型的时候,一定要注意类型的匹配,否则会报ClassCastException: A cannot be cast to B的异常,即两个没有任何关系的对象是不能进行相互的转型操作;
如果一个对象要想进行向下转型之前,必须之前发生过向上转型操作。只有这样才能建立关系。

G instanceof关键字
如果要想判断某个对象是否是指定类的实例,则可以使用instanceof关键字完成。
判断的语法格式如下:
实例化对象 instanceof 类  此操作返回boolean类型的数据
H Object类
Object类是所有类的父类,如果一个类没有明确的继承某一个具体的类,则将默认继承Object类。
Object类中的三个重要方法:
• 得到对象信息:public String toString()
• 进行对象比较:public boolean equals(Object obj)
• 得到对象的hash码:public int hashCode()
1、在对象打印的时候将默认调用toString()方法,但是这样调用toString()方法的返回信息并不明确,如果希望返回一个具体类的信息,则必须在子类中覆写toString()方法。
2、如果一个类需要进行对象比较,那么就可以覆写equals()方法
3、使用Object可以接收任意的引用数据类型
4、可变参数中如果使用了Object作为类型,则任何类型都可以接收
I super关键字和this关键字的区别
this与super的比较
No. 比较点 this super
1 属性 调用本类中的属性,如果本类中没有此属性,将从父类中继续查找 直接表示调用的属性是父类中的属性
2 方法 调用本类中的方法 调用父类中的方法,一般在方法被覆写之后
3 构造 调用本类中的其他构造方法 调用父类中的其他构造方法
4 使用 必须放在构造方法的首行 必须放在子类构造方法的首行
  this和super无法同时出现,但是在类中至少有一个构造方法是没有使用this()调用的,那么这个构造方法一般都会去使用super调用父类中的构造方法
5 特殊点 表示当前对象 无此概念

J
今天的问题
A
解决方法:
一一验证
//1、父类中的方法为默认的,子类中的覆写方法是默认的或public,都能覆写成功




//2、父类中的方法为私有的,子类中的覆写方法是默认的或public或private,都不能覆写成功





//3、父类中的方法为私有的,子类中的覆写方法是私有的,
//但是覆写访问父类中的这个私有方法的方法,可以使得私有方法的覆写起作用

问题描述:
思考?
如果在父类中使用private关键字修饰了一个方法,子类中使用default或者public修饰方法,那么此方法是否称为覆写呢?

B class A{
public void print(){
  System.out.println("父类中的方法");
}
}
class B extends A{
public String print(){        
  return "子类中的方法";
}
}

解决方法:方法覆写,返回值类型必须一致
报错:ReWriteMethod.java:27: print() in B cannot override print() in A; attempting to
use incompatible return type
found   : java.lang.String
required: void
        public String print(){          //(aa:)
                      ^
1 error




今天再次看了mldn的课程介绍的时候,忽然对后面即将要学习那么多那么多的知识产生了害怕的心理,开始怀疑自己能不能学好?
我知道自己的学习弱点在于没有超强的毅力,所以这次连续高强度的4个月的学习是对我的极大挑战。
希望自己能坚持!!
坚持4个月,一切都会好转的!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics