Java编程基础-面向对象(中)
本章承接Java编程基础-面向对象(上)一文。
一、static关键字
在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量、成员方法以及代码块等,被static修饰的成员具备一些特性。
1、static关键字的特点:
a)随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长。
b)优先于对象存在,明确一点,静态是先存在的,对象是后存在的。
c)被类的所有对象共享。
d)可以通过类名调用。
2、静态变量
在一个java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,可以使用”类名.变量名”的形式来访问。
代码示例:
- public class Student {
- static String schoolName;//定义静态变量schoolName
- }
- public class TestStudent {
- public static void main(String[] args) {
- Student stu1=new Student();//创建学生对象
- Student stu2=new Student();
- Student.schoolName="北京科技大学";//为静态变量赋值
- System.out.println("我的学校是"+stu1.schoolName);
- System.out.println("我的学校是"+stu2.schoolName);
- }
- }
注意:static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。
什么时候定义静态变量(类变量)呢?
当对象中出现共享数据时,该数据被静态所修饰,对象中特有的数据要定义成非静态存储于堆内存中。
3、静态方法
概念:不创建对象的情况下就可以调用某个方法,换句话说,也就是使该方法不必和对象绑在一起。只需在类中定义的方法前加上static关键字即可。同静态变量一样,静态方法可以使用”类名.方法名”的方式来访问,也可以通过类的实例对象来访问。
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。
什么时候定义静态函数?
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
静态的使用注意事项:
a)静态方法只能访问静态成员(包括方法和变量),非静态方法既可以访问静态也可以访问非静态。
b)静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this。
c)主函数是静态的。
静态利弊:
利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。可以直接被类名调用。
弊端:生命周期过长,访问出现局限性。
4、静态代码块
- class StaticCode {
- int num = 9;
- StaticCode() {
- System.out.println("b");
- }
- static // 静态代码块
- {
- System.out.println("a");
- }
- // 构造代码块
- {
- System.out.println("c" + this.num);
- }
- StaticCode(int x) {// 构造函数
- System.out.println("d");
- }
- public static void show() {
- System.out.println("show run");
- }
- }
- public class StaticCodeDemo {
- public static void main(String[] args) {
- new StaticCode(4);
- }
- }
运行结果为:
a
c9
d
二、内部类
1、概念:内部类顾名思义是指在一个类的内部再定义一个类。
注意:内部类是个编译时的概念,一旦编译成功后,它就与外部类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外部类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。
2、分类:
java内部类主要分为四种:成员内部类、局部内部类、静态内部类和匿名内部类。
a)成员内部类:成员内部类是最普通的内部类,在成员内部类中可以访问外部类的所有成员,包括私有。之所以可以访问,是因为内部类中持有了一个外部类的引用,外部类名.this.外部类要访问内部类的所有成员,必须要创建内部类对象。
注意:成员内部类中不能存在任何用static修饰的变量和方法;成员内部类是依附于外部类的,所以只有先创建了外部类才能够创建内部类。
创建内部类对象的具体语法格式:外部类类型.内部类类型 变量名=new 外部类名().new 内部类名();
- public class OuterClass {// 外部类
- private String str;// 外部类中的属性
- public void outerDisplay() {// 外部类中的方法
- System.out.println("outerClass...");
- }
- public class InnerClass {// 内部类
- public void innerDisplay() {// 内部类中的方法
- // 使用外部类的属性
- str = "abcd";
- System.out.println(str);
- // 调用外部类中的方法
- outerDisplay();
- }
- }
- /* 推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 */
- public InnerClass getInnerClass() {
- return new InnerClass();
- }
- public static void main(String[] args) {
- OuterClass outer = new OuterClass();
- OuterClass.InnerClass inner = outer.getInnerClass();
- inner.innerDisplay();
- }
- }
b)局部内部类:它嵌套在方法和作用域内,它只能在该方法和属性中被使用,出了方法和作用域就会失效。
定义在方法中:
- public class Parcel5 {
- public Destionation destionation(String str){
- class PDestionation implements Destionation{
- private String label;
- private PDestionation(String whereTo){
- label = whereTo;
- }
- public String readLabel(){
- return label;
- }
- }
- return new PDestionation(str);
- }
- public static void main(String[] args) {
- Parcel5 parcel5 = new Parcel5();
- Destionation d = parcel5.destionation("chenssy");
- }
- }
定义在作用域内:
- public class Parcel6 {
- private void internalTracking(boolean b){
- if(b){
- class TrackingSlip{
- private String id;
- TrackingSlip(String s) {
- id = s;
- }
- String getSlip(){
- return id;
- }
- }
- TrackingSlip ts = new TrackingSlip("chenssy");
- String string = ts.getSlip();
- }
- }
- public void track(){
- internalTracking(true);
- }
- public static void main(String[] args) {
- Parcel6 parcel6 = new Parcel6();
- parcel6.track();
- }
- }
c)静态内部类:可以使用static关键字来修饰一个成员内部类,该内部类被称作静态内部类,它可以在不创建外部类对象的情况下被实例化。
注意:在静态内部类中只能访问外部类的静态成员。在静态内部类中可以定义静态成员,而在非静态的内部类中不允许定义静态的成员。
d)匿名内部类:在做swing编程时,我们常用匿名内部类的方式来绑定事件。
注意几点:
a)匿名内部类是没有访问修饰符的。
b)new 匿名内部类,这个类首先是要存在的。
c)当所在方法的形参需要被匿名内部类使用,那么这个形参就必须为final。
d) 匿名内部类是没有构造方法的。因为它连名字都没有何来构造方法。
三、匿名对象
1、匿名对象:没有名字的实体,也就是该实体没有对应的变量名引用。
2、匿名对象的用途:
当对象对方法进行一次调用的时候,可以使用匿名对象对代码进行简化。调用完之后,该对象不再使用,并被回收。为什么只对方法,而不调用属性呢?因为匿名对象调用属性没意义。如果对象要多成员进行多次调用,必须给对象起个名字。不能在使用匿名对象。匿名对象可以实际参数进行传递。
3、匿名对象的简单演示
new 类名().方法名();
注意:
a)匿名对象设置的属性永远无法获取? 没有引用变量指向那个对象。
b)任何两个匿名对象使用==比较,永远返回false。
c)匿名对象主要应用于实参。
四、类的继承
1、继承概念:在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。在java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有的类被称作父类,子类会自动拥有父类所有可继承的属性和方法。在程序中,如果想声明一个类继承另一个类,需要使用extends关键字。
格式: class 子类名 extends 父类名{}
继承的好处:提高了代码的复用性,提高了代码的维护性,让类与类之间产生了关系,是多态的前提。
在类的继承中,需要注意的问题:
a)在java中,类只支持单继承,不允许多重继承,也就是说一个类只能有一个直接父类。因为多继承容易带来安全隐患:当多个父类中定义了相同功能,当功能内容不同时,子类对象不确定要运行哪一个。例如:C类不能同时继承A类和B类。
b)多个类可以继承一个父类。
c)在java中,多层继承是可以的,即一个类的父类可以再去继承另外的父类,例如:C类继承自B类,而B类又可以去继承自A类,这时,C类也可以称作A类的子类。
代码示例:
- class Animal {
- String name;
- public void shout() {
- System.out.println("动物发出叫声");
- }
- }
- class Cat extends Animal {
- public void catchFish() {
- System.out.println("猫在抓鱼");
- }
- }
- public class Demo {
- public static void main(String[] args) {
- Cat c = new Cat();
- c.shout();//调用父类的shout()方法
- }
- }
注意:子类只能继承父类所有非私有的成员(成员方法与成员变量);不能继承父类的构造方法,但可以通过super关键字来访问父类的构造方法;不要为了部分功能而去继承。
2、重写父类方法:
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表和返回值类型。(也称方法覆盖,方法复写)
代码示例:
- class Animal {
- String name;
- public void shout() {
- System.out.println("动物发出叫声");
- }
- }
- class Cat extends Animal {
- public void shout() {//重写父类的shout()方法
- System.out.println("猫咪发出叫声");
- }
- }
- public class Demo {
- public static void main(String[] args) {
- Cat c = new Cat();
- c.shout();
- }
- }
方法重写时要遵循的规则:
“三同一小一大”规则
“三同”即方法名相同,形参列表相同、返回值类型相同;
“一小”子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;
“一大”指的子类方法的访问权限应比父类方法更大或相等;
覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
注意:
a) 子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限。
b) 父类中的私有方法不能被重写,父类私有,子类根本无法继承。
c) 父类静态方法,子类也必须通过静态方法重写。
d) 子类重写父类方法的时候,最好声明的一模一样。
3、重写和重载的区别:
a) 方法的重写:要有继承关系,是在子父类方法中声明相同(方法名和参数列表都相同)。与返回值类型有关,覆盖时,子类方法的访问权限不能小于父类方法的访问权限,静态只能覆盖静态。
b) 方法的重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关。
五、super关键字
当子类重写父类方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在java中专门提供了一个super关键字用于访问父类的成员。例如:访问父类的成员变量、成员方法和构造方法。
1、 使用super关键字调用父类的成员变量和成员方法。
具体格式:
super.成员变量
super.成员方法({参数1},{参数2..})
代码示例:
- class Animal // 定义Animal类
- {
- String name = "动物";
- void shout()// 定义动物叫的方法
- {
- System.out.println("动物发出叫声");
- }
- }
- class Dog extends Animal// 定义Dog类继承Animal类
- {
- String name = "犬类";
- void shout() {
- super.shout();// 访问父类的成员方法
- }
- void printName() {
- System.out.println("name=" + super.name);// 访问父类的成员变量
- }
- }
- class Demo {
- public static void main(String[] args) {
- Dog dog = new Dog();// 创建Dog的实例对象
- dog.shout();// 调用dog重写shout()方法
- dog.printName();// 调用dog对象的printName()方法
- }
- }
2、
使用super关键字调用父类的构造方法。
super.([参数1],[参数2..])通过super调用父类的构造方法代码必须位于子类构造方法的第一行并且只能出现一次。
代码示例:
- class Animal // 定义Animal类
- {
- String name;
- public Animal(String name)// 定义Animal类的构造方法
- {
- this.name = name;
- }
- }
- class Dog extends Animal// 定义Dog类继承Animal类
- {
- public Dog() {
- super("柴犬");// 调用父类有参的构造方法
- }
- public void show() {
- System.out.println("我是一只" + name);
- }
- }
- class Demo {
- public static void main(String[] args) {
- Dog dog = new Dog();// 创建Dog的实例对象
- dog.show();
- }
- }
3、this和super的区别:
a) 调用成员变量:this调用本类的成员变量,super调用父类的成员变量。
b) 调用构造方法:this()调用本类的构造方法,super()调用父类的构造方法。
c) 调用成员方法:this调用本类的成员方法,super调用父类的成员方法。
d) 构造函数没有覆盖,this和super不能同时存在。
六、final关键字
final关键字可以用于修饰类、变量和方法。它有“这是无法改变的”或者“最终”的含义,因此被final修饰的类、变量和方法具有以下特性:
a)final修饰的类不能被继承。也就是不能够派生子类,为最终类。
b)final修饰的方法不能被子类重写。被final修饰的方法为最终方法。
c)final修饰的变量(成员变量和局部变量)是常量(自定义常量),只能赋值一次。当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,方便阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过下划线连接。
Java编程基础-面向对象(中)的更多相关文章
- Java编程基础-面向对象(下)
一.抽象类 1.引入:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的.Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用 ...
- Java编程基础-面向对象(上)
一.面向对象的概念 1.概念:面向对象是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能.这 ...
- 大数据技术之_16_Scala学习_04_函数式编程-基础+面向对象编程-基础
第五章 函数式编程-基础5.1 函数式编程内容说明5.1.1 函数式编程内容5.1.2 函数式编程授课顺序5.2 函数式编程介绍5.2.1 几个概念的说明5.2.2 方法.函数.函数式编程和面向对象编 ...
- Java入门——(1)Java编程基础
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- 第二十五节:Java语言基础-面向对象基础
面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...
- java编程基础二进制
0.java编程基础 01.二进制(原码,反码,补码) 02.位运算 03.移位运算符 二进制 原码,反码,补码 1.基本概念 二进制是逢2进位的进位制,0,1是基本算符. 现在的电子计算机技术全部使 ...
- Java编程基础——数组和二维数组
Java编程基础——数组和二维数组 摘要:本文主要对数组和二维数组进行简要介绍. 数组 定义 数组可以理解成保存一组数的容器,而变量可以理解为保存一个数的容器. 数组是一种引用类型,用于保存一组相同类 ...
- Java编程基础——流程控制
Java编程基础——流程控制 摘要:本文主要介绍Java编程中的流程控制语句. 分类 流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下三种: 顺序结构:从上到下依次执行每条语句操作 ...
随机推荐
- Jmeter 施压 SQL server数据库的时候,如何设置?
1. 在应用Jmeter进行施压之前,有个重要的端口需要手动查找出来.该端口在第三部要使用.开始——程序——microsoft SQL Server 2008R2——配置工具——SQL Server ...
- ubuntu bcompare 安装
Terminal Install wget http://www.scootersoftware.com/bcompare-4.2.8.23479_amd64.deb sudo apt-get upd ...
- bzoj 4711 小奇挖矿 ——“承诺”类树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4711 对“承诺”有了更深的了解. 向外和向内要区分,所以 f [ i ][ j ] 表示根向 ...
- FFmpeg+FFserver流媒体服务器介绍
ffmpeg和ffserver配合使用可以实现实时的流媒体服务. 一.理解 里边主要有如下四个东西,搞清楚他们之间的关系就差不多明白了. 1. ffmpeg 2. ffserver 3. ...
- JAVA 内部类 (三)实例
为什么要用内部类:控制框架 一个“应用程序框架”是指一个或一系列类,它们专门设计用来解决特定类型的问题.为应用应用程序框架,我们可从一个或多个类继承,并覆盖其中的部分方法.我们在覆盖方法中编写的代码用 ...
- bzoj2718
二分图匹配 首先有个定理:最长反链=最小链覆盖 最小链覆盖可以重复经过点 所以我们不能直接建图 那么我们用floyd判断是否相连 然后建图就行了 #include<bits/stdc++.h&g ...
- ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128
ERROR (UnicodeEncodeError): 'ascii' codec can't encode characters in position 0-1: ordinal not in ra ...
- ORM框架SQLAlchemy学习
一.基本介绍 以下介绍来自维基百科,自由的百科全书. SQLAlchemy是Python编程语言下的一款开源软件.提供了SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行. SQLAlch ...
- Flutter实战视频-移动电商-27.列表页_现有Bug修复和完善
27.列表页_现有Bug修复和完善 小解决小bug 默认右侧的小类没有被加载 数据加载完成后,就list的第一个子对象传递给provide进行赋值,这样右侧的小类就刷新了数据 默认加载了第一个类别 调 ...
- Identity Server 4 原理和实战(完结)_----选看 OAuth 2.0 简介(上)
https://www.yuque.com/yuejiangliu/dotnet/cg95ni 代表资源所有者的凭据 授权 Authorization Grant 授权是一个代表着资源所有者权限的凭据 ...