博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础笔记 -------------面向对象上(三大特性)
阅读量:5735 次
发布时间:2019-06-18

本文共 3300 字,大约阅读时间需要 11 分钟。

hot3.png

面向对象三个特性:继承(Inheritence)、封装(Encapsulation)、多态(Polymorphism).

1、封装(Encapsulation):

类包含了数据与方法,将数据与方法放在一个类中就构成了封装(一般来说,将属性私有化,并且生成settergetter方法)。它指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供方法来实现对内部信息的操作和访问。把隐藏的东西隐藏,将该暴露的东西暴露.一般是通过访问控制符完成封装。

Java中的访问权限控制符有四个. 

作用域         当前类          同一package           子孙类                其他package 
public              √                    √                           √                             √ 
protected         √                    √                            √                            × 
friendly            √                    √                            ×                            × 
private             √                     ×                            ×                             × 
没有时默认为friendly,如构造函数等~
在Java语言中有4种访问修饰符:package(默认)、private、public和protected.
1。package是默认的保护模式,又叫做包访问,没有任何修饰符时就采用这种保护模式。包访问允许域和方法被同一个包内任何类的任何方法访问。(包内访问)
2。private标识的访问模式,表示私有的域和方法只能被同一个类中的其他方法访问,实现了数据隐藏;必要时,可以通过方法访问私有变量。(类内访问)
3。public修饰符用于暴露域和方法,以便在类定义的包外部能访问它们。对包和类中必要的接口元素,也需要使用这个级别;main()方法必须是public的,toString()方法也必须是public的。一般不会用public暴露一个域,除非这个域已经被声明为final。(跨包访问)
4。protected修饰符提供一个从包外部访问包(有限制)的方法。在域和方法前增加protected修饰符不会影响同一个包内其他类和方法对它们的访问。要从包外部访问包(其中含有protected成员的类),必须保证被访问的类是带有protected成员类的子类。也就是说,希望包中的一个类被包之外的类继承重用时,就可以使用这个级别。一般应该慎用。(包中类被包外类继承重用)

1.1、对象在堆中的分配:

new关键字所做的工作:

为对象开辟内存空间

调用类的构造方法
将生成的对象的地址返回

084459_FxRi_1427560.jpg

方法与属性的分配:

如果一个类包含了属性和方法,那么该类的每一个对象都有自己的属性,但是无论有多少个对象,这些对象共享一个方法。

1.2、封装中的构造方法(重载):

重载:

构造方法重载时,只需看参数即可。

使用this()

在一个构造方法中调用另外一个构造方法,可以使用this()this()中的参数根据调用的构造函数确定。this()语句必须作为构造方法的第一条语句

2、继承(Inheritence):

Java是单继承的,意味着一个类只能继承一个父类,使用extends关键字。

2.1、继承中的构造方法:

继承关系中构造方法的调用:

生成子类对象时,Java默认地首先调用父类的不带参数的构造方法,并执行该构造方法,生成父类的对象。接下来才是调用子类的构造方法,生成子类的对象。(即是想要生成子类对象,必须先生成父类的对象,没有父类的对象就没有子类的对象)

package com.blog;/** *基类 */class SuperTest {	private String age;	public SuperTest(String age) {		this.age = age;		System.out.println(this.age);	}	public String getAge() {		return age;	}	public void setAge(String age) {		this.age = age;	}}/** *导出类 */public class Test extends SuperTest{	private String name;	public Test(String age,String name) {		super(age); //调用基类的构造方法.		this.name = name;		System.out.println(this.name);	}	public static void main(String[] args) {		Test test = new Test("50", "itcast");	}}//output:50         itcast ~~//

使用super关键字:

super表示对父类对象的引用。

使用了super显示的调用父类的某个构造方法后,那么在执行的时候就寻找super()对应的构造方法而不再寻找父类的不带参数的构造方法。super必须作为构造方法的第一条执行语句。

2.2、继承中父类与子类的关系:

父类有的,子类也有

父类没有的,子类可以有
父类有的,子类可以改变

2.3、继承中需要注意的:

构造方法不能被继承

方法和属性可以被继承
子类的构造方法隐式地调用父类的无参构造方法,即java.lang.Object是被默认继承的.
当父类没有不带参数的构造方法时,子类需要使用super关键字来显示调用父类的构造方法。super指的是父类的引用
super关键字必须是构造方法中的第一句。

2.4、继承中的方法重写:

当两个方法形成重写关系时,可以在子类中通过super关键字调用父类被重写的方法。此时的super关键字不必放在第一句,而是根据逻辑决定。

3、多态(Polymorphism):

多态指的是父类型的引用可以指向子类的对象。(苹果是水果,足球是球).Java中的引用变量有两种, 一种是编译时类型由声明该变量时使用的类型决定,还有一种是运行期类型由实际赋给变量的对象决定.如果编译时和运行时类型不一致,就会出现多态. 

Parent p = new Child();

p.execute();

3.1、使用多态调用方法:

当使用多态调用方法时,首先检查父类中是否有被调用的方法,如果没有则编译出错;如果有,再去调用子类的方法。

3.2、多态中的两种类型转换:

向上类型转换(upcast):将子类型转换成父类型。对于向上类型转换,不需要显示指定:

Parent p = new Child();

向下类型转换(downcast):将父类型转换为子类型。对于向下类型转换,必须要显示指定,使用强制类型转换:

Parent p = new Child();

Child child = (Child)p;

以下的编译不会出错,运行时很有能报错(ClassCastException):

Parent p = new Parent();

Child child = (Child)p;

如果用instaceof判断一下是否属于类或者子类的一个实例.

  if(child instaceof Parent){

     Child child = (Child)p;

  }

4、继承和组合

     继承是实现类重用的重要手段,但是它会带来一个大的坏处:破环封装.相比之下,组合也是实现类重用的方式.而采用组合方式能够更好的提供类的封装.

5、Java初始化顺序

092857_HExO_1427560.png

  ps:Java中面向对象思想其实不难理解,但是有的时候又非常让人头疼.我只是总结一点常用的知识点.其实还有很多自己到现在还搞不明白.计算机将现实中的东西抽象出来的思维.自己理解的还不够透彻....

----------------------- 、、java学习型技术博客、期待与您交流! ----------------------

详情请查看:

转载于:https://my.oschina.net/codeWatching/blog/224761

你可能感兴趣的文章
OC中KVC的注意点
查看>>
JQ入门(至回调函数)
查看>>
1112: 零起点学算法19——输出特殊值
查看>>
【洛天依】几首歌的翻唱(无伴奏)
查看>>
strcspn
查看>>
OpenSSL初瞻及本系列的博文的缘由
查看>>
ISO8583接口的详细资料
查看>>
tmux不自动加载配置文件.tmux.conf
查看>>
经验分享:JavaScript小技巧
查看>>
[MOSEK] Stupid things when using mosek
查看>>
程序实例---栈的顺序实现和链式实现
查看>>
服务的使用
查看>>
Oracle 用户与模式
查看>>
MairDB 初始数据库与表 (二)
查看>>
连接数据库——java
查看>>
拥在怀里
查看>>
chm文件打开,有目录无内容
查看>>
whereis、find、which、locate的区别
查看>>
一点不懂到小白的linux系统运维经历分享
查看>>
MDT 2013 从入门到精通之软件自动化部署设置
查看>>