Java编程基础-面向对象(中)

本章承接Java编程基础-面向对象(上)一文。

一、static关键字

在java中,定义了一个static关键字,它用于修饰类的成员,如成员变量、成员方法以及代码块等,被static修饰的成员具备一些特性。

1、static关键字的特点:

a)随着类的加载而加载,也就是说,静态会随着类的消失而消失,说明它的生命周期最长。

b)优先于对象存在,明确一点,静态是先存在的,对象是后存在的。

c)被类的所有对象共享。

d)可以通过类名调用。

2、静态变量

在一个java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,可以使用”类名.变量名”的形式来访问。

代码示例:

[java] view plain copy

  1. public class Student {
  2. static String schoolName;//定义静态变量schoolName
  3. }
  4. public class TestStudent {
  5. public static void main(String[] args) {
  6. Student stu1=new Student();//创建学生对象
  7. Student stu2=new Student();
  8. Student.schoolName="北京科技大学";//为静态变量赋值
  9. System.out.println("我的学校是"+stu1.schoolName);
  10. System.out.println("我的学校是"+stu2.schoolName);
  11. }
  12. }

注意:static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。

什么时候定义静态变量(类变量)呢?

当对象中出现共享数据时,该数据被静态所修饰,对象中特有的数据要定义成非静态存储于堆内存中。

3、静态方法

概念:不创建对象的情况下就可以调用某个方法,换句话说,也就是使该方法不必和对象绑在一起。只需在类中定义的方法前加上static关键字即可。同静态变量一样,静态方法可以使用”类名.方法名”的方式来访问,也可以通过类的实例对象来访问。

注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象。

什么时候定义静态函数?

当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。

静态的使用注意事项:

a)静态方法只能访问静态成员(包括方法和变量),非静态方法既可以访问静态也可以访问非静态。

b)静态方法中不可以定义this,super关键字。因为静态优先于对象存在,所以静态方法中不可以出现this。

c)主函数是静态的。

静态利弊:

利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一个对象中都存储一份。可以直接被类名调用。

弊端:生命周期过长,访问出现局限性。

4、静态代码块

  1. class StaticCode {
  2. int num = 9;
  3. StaticCode() {
  4. System.out.println("b");
  5. }
  6. static // 静态代码块
  7. {
  8. System.out.println("a");
  9. }
  10. // 构造代码块
  11. {
  12. System.out.println("c" + this.num);
  13. }
  14. StaticCode(int x) {// 构造函数
  15. System.out.println("d");
  16. }
  17. public static void show() {
  18. System.out.println("show run");
  19. }
  20. }
  21. public class StaticCodeDemo {
  22. public static void main(String[] args) {
  23. new StaticCode(4);
  24. }
  25. }

运行结果为:

a

c9

d

二、内部类

1、概念:内部类顾名思义是指在一个类的内部再定义一个类。

注意:内部类是个编译时的概念,一旦编译成功后,它就与外部类属于两个完全不同的类(当然他们之间还是有联系的)。对于一个名为OuterClass的外部类和一个名为InnerClass的内部类,在编译成功后,会出现这样两个class文件:OuterClass.class和OuterClass$InnerClass.class。

2、分类:

java内部类主要分为四种:成员内部类、局部内部类、静态内部类和匿名内部类。

a)成员内部类:成员内部类是最普通的内部类,在成员内部类中可以访问外部类的所有成员,包括私有。之所以可以访问,是因为内部类中持有了一个外部类的引用,外部类名.this.外部类要访问内部类的所有成员,必须要创建内部类对象。

注意:成员内部类中不能存在任何用static修饰的变量和方法;成员内部类是依附于外部类的,所以只有先创建了外部类才能够创建内部类。

创建内部类对象的具体语法格式:外部类类型.内部类类型 变量名=new 外部类名().new 内部类名();

[java] view plain copy

  1. public class OuterClass {// 外部类
  2. private String str;// 外部类中的属性
  3. public void outerDisplay() {// 外部类中的方法
  4. System.out.println("outerClass...");
  5. }
  6. public class InnerClass {// 内部类
  7. public void innerDisplay() {// 内部类中的方法
  8. // 使用外部类的属性
  9. str = "abcd";
  10. System.out.println(str);
  11. // 调用外部类中的方法
  12. outerDisplay();
  13. }
  14. }
  15. /* 推荐使用getxxx()来获取成员内部类,尤其是该内部类的构造函数无参数时 */
  16. public InnerClass getInnerClass() {
  17. return new InnerClass();
  18. }
  19. public static void main(String[] args) {
  20. OuterClass outer = new OuterClass();
  21. OuterClass.InnerClass inner = outer.getInnerClass();
  22. inner.innerDisplay();
  23. }
  24. }

b)局部内部类:它嵌套在方法和作用域内,它只能在该方法和属性中被使用,出了方法和作用域就会失效。

定义在方法中:

[java] view plain copy

  1. public class Parcel5 {
  2. public Destionation destionation(String str){
  3. class PDestionation implements Destionation{
  4. private String label;
  5. private PDestionation(String whereTo){
  6. label = whereTo;
  7. }
  8. public String readLabel(){
  9. return label;
  10. }
  11. }
  12. return new PDestionation(str);
  13. }
  14. public static void main(String[] args) {
  15. Parcel5 parcel5 = new Parcel5();
  16. Destionation d = parcel5.destionation("chenssy");
  17. }
  18. }

定义在作用域内:

[java] view plain copy

  1. public class Parcel6 {
  2. private void internalTracking(boolean b){
  3. if(b){
  4. class TrackingSlip{
  5. private String id;
  6. TrackingSlip(String s) {
  7. id = s;
  8. }
  9. String getSlip(){
  10. return id;
  11. }
  12. }
  13. TrackingSlip ts = new TrackingSlip("chenssy");
  14. String string = ts.getSlip();
  15. }
  16. }
  17. public void track(){
  18. internalTracking(true);
  19. }
  20. public static void main(String[] args) {
  21. Parcel6 parcel6 = new Parcel6();
  22. parcel6.track();
  23. }
  24. }

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类的子类。

代码示例:

[java] view plain copy

  1. class Animal {
  2. String name;
  3. public void shout() {
  4. System.out.println("动物发出叫声");
  5. }
  6. }
  7. class Cat extends Animal {
  8. public void catchFish() {
  9. System.out.println("猫在抓鱼");
  10. }
  11. }
  12. public class Demo {
  13. public static void main(String[] args) {
  14. Cat c = new Cat();
  15. c.shout();//调用父类的shout()方法
  16. }
  17. }

注意:子类只能继承父类所有非私有的成员(成员方法与成员变量);不能继承父类的构造方法,但可以通过super关键字来访问父类的构造方法;不要为了部分功能而去继承。

2、重写父类方法:

在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。需要注意的是,在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表和返回值类型。(也称方法覆盖,方法复写)

代码示例:

[java] view plain copy

  1. class Animal {
  2. String name;
  3. public void shout() {
  4. System.out.println("动物发出叫声");
  5. }
  6. }
  7. class Cat extends Animal {
  8. public void shout() {//重写父类的shout()方法
  9. System.out.println("猫咪发出叫声");
  10. }
  11. }
  12. public class Demo {
  13. public static void main(String[] args) {
  14. Cat c = new Cat();
  15. c.shout();
  16. }
  17. }

方法重写时要遵循的规则:

“三同一小一大”规则

“三同”即方法名相同,形参列表相同、返回值类型相同;

“一小”子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等;

“一大”指的子类方法的访问权限应比父类方法更大或相等;

覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

注意:

a) 子类重写父类方法时,不能使用比父类中被重写的方法更严格的访问权限。

b) 父类中的私有方法不能被重写,父类私有,子类根本无法继承。

c) 父类静态方法,子类也必须通过静态方法重写。

d) 子类重写父类方法的时候,最好声明的一模一样。

3、重写和重载的区别:

a) 方法的重写:要有继承关系,是在子父类方法中声明相同(方法名和参数列表都相同)。与返回值类型有关,覆盖时,子类方法的访问权限不能小于父类方法的访问权限,静态只能覆盖静态。

b) 方法的重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关。

五、super关键字

当子类重写父类方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,在java中专门提供了一个super关键字用于访问父类的成员。例如:访问父类的成员变量、成员方法和构造方法。

1、 使用super关键字调用父类的成员变量和成员方法。

具体格式:

super.成员变量

super.成员方法({参数1},{参数2..})

代码示例:

[java] view plain copy

  1. class Animal // 定义Animal类
  2. {
  3. String name = "动物";
  4. void shout()// 定义动物叫的方法
  5. {
  6. System.out.println("动物发出叫声");
  7. }
  8. }
  9. class Dog extends Animal// 定义Dog类继承Animal类
  10. {
  11. String name = "犬类";
  12. void shout() {
  13. super.shout();// 访问父类的成员方法
  14. }
  15. void printName() {
  16. System.out.println("name=" + super.name);// 访问父类的成员变量
  17. }
  18. }
  19. class Demo {
  20. public static void main(String[] args) {
  21. Dog dog = new Dog();// 创建Dog的实例对象
  22. dog.shout();// 调用dog重写shout()方法
  23. dog.printName();// 调用dog对象的printName()方法
  24. }
  25. }

2、
使用super关键字调用父类的构造方法。

super.([参数1],[参数2..])通过super调用父类的构造方法代码必须位于子类构造方法的第一行并且只能出现一次。

代码示例:

[java] view plain copy

  1. class Animal // 定义Animal类
  2. {
  3. String name;
  4. public Animal(String name)// 定义Animal类的构造方法
  5. {
  6. this.name = name;
  7. }
  8. }
  9. class Dog extends Animal// 定义Dog类继承Animal类
  10. {
  11. public Dog() {
  12. super("柴犬");// 调用父类有参的构造方法
  13. }
  14. public void show() {
  15. System.out.println("我是一只" + name);
  16. }
  17. }
  18. class Demo {
  19. public static void main(String[] args) {
  20. Dog dog = new Dog();// 创建Dog的实例对象
  21. dog.show();
  22. }
  23. }

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修饰。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成,单词间通过下划线连接。

时间: 2024-11-03 22:03:40

Java编程基础-面向对象(中)的相关文章

Java编程基础-面向对象(上)

一.面向对象的概念 1.概念:面向对象是把解决的问题按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.当然,一个应用程序会包含多个对象,通过多个对象的相互配合来实现应用程序的功能.这样当应用程序功能发生变动时,只需要修改个别对象就可以了,从而使代码更容易得到维护.面向对象强调的是对象,它使复杂的内容简单化了,让我们从执行者变成了指挥者. 2.特点:面向对象的特点概括起来就是继承性.封装性和多态性. 3. 封装性:封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界

Java 入门基础——面向对象的特征

计算机软件系统是现实生活中的业务在计算机中的映射,而现实生活中的业务其实就是一个个对象协作的过程.面向对象编程就是按现实业务一样的方式将程序代码按一个个对象进行组织和编写,让计算机系统能够识别和理解用对象方式组织和编写的程序代码,这样就可以把现实生活中的业务对象映射到计算机系统中. 面向对象的编程语言有封装.继承 .抽象.多态等4个主要的特征. 封装: 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的"高内聚.低耦合",防止程序相互依赖性而带来的变动影响.在面向

Java面试求职之Java编程基础

Java编程基础 小编目前大三在读,专业电子系.由于对编程感兴趣还有就是对本专业前途的不乐观,还是勇敢的加入所谓的码农之路.学习Java也有一段时间了,快要放假了,想找家公司实习一下.至目前为止,已经面试了好几家公司了,大的有像腾讯.百度.联想这样的大公司:小的也有只有10几个员工的创业型公司.拿到过offer.也有碰壁连面试机会都没得到的. 下面就是一些对面试官面试时问的问题做的一些总结和自己搜集的一些知识点. Java概述和开发环境 Java开发包的总类            随着Java语

Java大神推荐,java编程基础必备(必看)

在没有以前的操作习惯的错误情况下,反而容易接受新知识,所以不要因为自己对java一无所知而自卑,相反,这是菜鸟们的优势,但是如何才能从一个菜鸟历练成大神呢,当然是需要学习了,不学习就想成为大神,就是在做白日梦,所以如果你想改变自己,那么你可以来我们这个交流群来学习521595826,在这里每天都能学到新鲜的知识,想不进步都难,但是如果你是一个不思进取的人,一边凉快去就行.下面来介绍下java编程基础必备知识: 第一步:下载并安装JDK 6.0,安装路径为: C:\java\jdk1.6 . 第二

Java入门——(1)Java编程基础

Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符:在程序中定义的一些名称. 比如:类名 a-z 0-9 _ $ 数字不可以开头,不可以使用关键字,一般首字母大写. 2.3注释:注解说明程序的文字. 作用:1.对程序进行说明. 2.调试程序. 注意:多行注释可嵌单行注释,但不能嵌套多行注释. /*多行注释*/ /**文档注释*/ //单行注释 /* 需求:写一个

java编程基础(一)

Java编程基础(一) 1. java基本语法 1.1 Java基本格式 修饰符 class 类名 { 程序代码 } Java严格区分大小写,例如不能将class关键字写成Class, java编译器将不能识别. Java程序中连续的字符串不能分行写:如果想分行写,可以写成两个字符串,中间用+号连接即可. 每一语句以分号结尾. 1.2 java注释 1.2.1 功能: 增加代码可读性,方便阅读,它只在源文件中有效,编译时编译器会忽略这些信息,不会将其编译到class文件中. 1.2.2 分类 注

第二十五节:Java语言基础-面向对象基础

面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基于面向过程的.以前是主要以面向过程为思想,现在是将功能装进对象中,如果要用到功能时,就调用该对象即可. 面向对象是入门思想的进步,适用于人类的思考,将复杂的东西进行了简单化,将我们程序员从执行者变化成指挥者.由以前面向功能(面向过程)转变为面向对象(封装的功能). **** 面向对象设计思想 设计思

java 编程基础

临近毕业,准备复习一些java的基础,顺便整理一下知识 编程基础 1.Java的特性和优势:简单.面向对象可移植( write once ,run anywhere ).高性能 ,分布式.动态性多线程安全健壮. 2.Java的运行机制, 计算高级编程语言类型有:编译型.解释型. Java语言是这两种类型的结合,利用编辑器写 Java源程序 -- 源文件名 :主类名.java,利用编译器(javac )将源程序编译 成字节码 -- 字节码文件名 :源文件名.class,再利用虚拟机 (解释器,即

Java编程基础篇第一章

计算机语言 人与计算机交流的方式. 计算机语言有很多种如:C语言,c++,Java等 人机交互 软件的出现实现了人与计算机之间的更好的交流(交互) 交互方式 图形化界面:便于交互,容易操作,简单直观,使用者容易上手. 命令行:需要一个控制台,需要输入特定指令,让计算机完成操作,同时还需要你记住一些命令. Java语言概述: 1. Java语言是SUN公司(Stanford University Network,斯坦福大学网络公司)1995年推出的一门高级编程语言. 2. Java语言是一门面向I