疯狂JAVA——第五章 面向对象(上)
5.1类和对象
构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。通过new关键字来调用构造器,从而返回该类的实例。
类名:每个单词首字母大写,其他字母小写,单词之间不要有分隔符。
成员变量名:第一个单词的首字母小写,后边的每个单词的首字母大写,其他字母全部小写,单词之间不要有分隔符。
构造器没有返回值,这是java语法的规定,如果构造器定义了返回值类型(包括void),编译时不会出错,但java会把这个所谓的构造器当成普通方法使用。
类和数组一样,类也是一种引用类型,分成两部分,一部分在栈内存中,一部分在堆内存中。java程序不允许直接访问堆内存中的对象,只能通过该对象的引用来操作对象。
类定义里边也可以生成自己的对象,比如下边的:
public class Dog
{
public void jump()
{
System.out.println("正在执行jump方法");
}
public void run()
{
Dog d=new Dog();
d.jump();
System.out.println("正在执行run方法");
}
}
为什么类定义里边还可以在生成自己的对象?
答:类定义只是声明这个类而已,就是对类的行为的一个描述,而不是去执行它。new只是生成对象,调用的构造函数,而不会调用其他的函数。所以只能在类定义的成员函数中生成自己的对象,而不能new一个成员变量,因为这样会造成无限循环,如果想生成一个成员变量,可以在外边声明一个,然后再函数里边new然后赋值。
一个没有使用static修饰的成员变量和方法都必须要用对象来调用,所以上边要先生Dog的一个对象,然后调用jump,我们也可以直接用自己的这个对象调用jump,就是用this来调用,当然这个this也可以省略掉。
5.2.2方法的参数传递机制
java里边的参数传递方式只有一种:值传递。所谓值传递就是将实际参数的副本传给方法。java对引用类型的参数传递,一样采用的是值传递方式。但是这个时候的改变会保留下来,因为虽然是值传递,但是传递进去的副本是地址,对堆内存地址里边的内容修改,这样就会改变我们的操作。
5.4隐藏和封装
private——当前类访问权限
default——包访问权限——————即没有修饰符
protected——子类访问权限
public——公共访问权限
如果一个java类的每个实例变量都被使用private修饰,并为每个市里边来那个都提供了public修饰的setter和getter方法,那么这个类就是符合JavaBean规范的类,因此,JavaBean总是一个封装良好的类。
import可以省略包名;而使用import static则可以连类名都省略。
5.5深入构造器
构造器最大的用处就是在创建对象的时候执行初始化。当创建一个对象的时候,系统为这个对象的实例变量进行默认初始化,这种默认初始化把所有的基本类型的实例变量都设为0或false,把所有引用类型的实例变量设为null。
构造器的调用只能用new关键字,但使用new就会重新创建一个新的对象,所以当我们想用自己的构造器的时候可以使用this关键字来调用相应的构造器。
5.6.2重写父类的方法
“两同两小一大”——
两同:方法名相同,形参列表相同
两小:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等
一大:子类方法的访问权限应比父类方法大的访问权限更大或相等。
解释一下一大:这是因为向上转型及java程序设计维护的原因
例:假设一个父类A的方法public void set(),这个方法被子类B重写以后变成了void set()。假设其他包中的对象c调用方法为
get (A a)
{
a.set();
}
如果此时传入的是B类的对象,但权限不够,这将造成错误,所以——子类方法的权限应比父类方法的访问权限更大或相等。
子类中定义与父类中同名的实例变量并不会完全覆盖父类中定义的实例变量,它只是简单的隐藏父类中的实例变量,所以在分配内存的时候,父类和子类中的实例变量都会分配内存空间。
this和super都不能出现在static修饰的方法中。this和super不会同时出现(因为二者在构造器中都会要求出现在第一行)
5.7多态
java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时实用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
instanceof——用于判断前面的对象是否是后面的类,或者子类、实现类的实例。如果是,返回true,如果不是,返回false。
5.9初始化块
初始化块是java类里出现的第四种成员(前面依次是成员变量、方法和构造器)。
初始化块的修饰符只能是static,使用static修饰的初始化块被称为静态初始化块。
先执行初始化块或者实例变量时指定的初始值,再执行构造器里指定的初始值。
实际上初始化块是一个假象,使用javac命令编译java类后,该java类中的初始化块会消失——初始化块中的代码会被“还原”到每个构造器中,且位于构造器所有代码的前面。
疯狂JAVA——第五章 面向对象(上)的更多相关文章
- 疯狂JAVA——第六章 面向对象(下)
6.1包装类 java为了照顾程序员的传统习惯,所以提供了八种基本数据类型.但也带来不方便,例如所有引用类型都继承自Object类,都可当做Object类型变量使用.但基本数据类型的变量就不可以.如果 ...
- java 第五章
java 第五章 while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行. while 的执行步骤 (1) 声明 ...
- [Effective Java]第五章 泛型
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 疯狂java学习笔记之面向对象(八) - static和final
一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Fie ...
- 自学Java第五章——《面向对象的基本特征》
面向对象的基本特征: 1.封装 2.继承 3.多态 6.1 封装 1.好处: (1)隐藏实现细节,方便使用者使用 (2)安全,可以控制可见范围 2.如何实现封装? 通过权限修饰符 面试题:请按照可见范 ...
- 疯狂java学习笔记之面向对象(五) - 封装、继承、多态
一.封装: 封装的概念: - 合理的隐藏:隐藏不想被外界操作的Field.方法.构造器 - 合理的暴露:一般就是希望给别人调用的方法 e.g:显示器(按键暴露出来操作,但实际的东西/细节方法被隐藏起来 ...
- 自学Java第五章——《面向对象基础》
5.1 类与对象 1.类:一类具有相同特性的事物的抽象描述. 对象:类的一个个体,实例,具体的存在. 类是对象的设计模板. 2.如何声明类? [修饰符] class 类名{ 成员列表:属性.方法 ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- Java基础学习(三)—面向对象(上)
一.理解面向对象 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...
随机推荐
- Win10 UEFI +Ghost +intel快速启动 新法完美安装
http://tieba.baidu.com/p/4767004289?qq-pf-to=pcqq.c2c Win10 如果主板不用Bios 而用UEFI引导启动,速度快,界面好.现在一般都用win1 ...
- HDU 1269 迷宫城堡(向量)(Tarjan模版题)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- python selenium-9 grid模式
grid是进行分布式测试的工具,由一个hub主节点和若干个node代理节点组成 1.下载Selenium Standalone Server 下载地址:https://www.seleniumhq.o ...
- $.meta ? $.extend({}, opts, $this.data()) : opts 是什么
问:$.meta ? $.extend({}, opts, $this.data()) : opts 是什么 答:这应该是一个jQuery扩展插件中的代码,其中运用了三目运算符,以及jQuery的ex ...
- ie6、7下button添加背景和边框,内边距会出现1px的边框
ie6.7下button添加背景和边框,内边距会出现1px的空白边框 解决办法:在input外面加上一个标签,把背景和边框都写在标签的样式上面,input的 background和border都non ...
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...
- CGLib缺少jar出现 java.lang.ClassNotFoundException: org.objectweb.asm.Type
CGLib实现动态代理区别于JDK动态代理,不需要目标类实现任何接口,是通过生成代理类子类的方式,而且据说速度要快于JDK动态代理.所以我想要试验一下CGlib的动态代理,网上找了些例子,自己动手写了 ...
- CCKS 2018 | 最佳论文:南京大学提出DSKG,将多层RNN用于知识图谱补全
作者:Lingbing Guo.Qingheng Zhang.Weiyi Ge.Wei Hu.Yuzhong Qu 2018 年 8 月 14-17 日,主题为「知识计算与语言理解」的 2018 全国 ...
- leetcode83
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...
- java Export Excel POI 转
最终选择用POI成功导出excel.总之很有用. http://www.cnblogs.com/xwdreamer/archive/2011/07/20/2296975.html http://poi ...