java面向对象学习笔记(2)

一.构造器

1.构造器最大的用处就是在创建对象时执行初始化,每个java类必须包含一个或一个以上的构造器。一般系统会提供一个无参的构造器,但是如果我们自己定义了一个构造器后它就不会再起作用了。如果我们为一个类编写了有参构造器,那么最好还是为该类提供一个无参的构造器。

2.构造器的重载

同一个类中可以包含有多个构造器,多个构造器的形参列表不同,即被称为构造器的重载。系统通过new调用构造器时,系统将根据传入的实参列表来决定调用哪个构造器。示例代码如下:

<span style="font-size:18px;">package test;

public class ConstructorOverload {

	public String name;
	public int count;
	//提供无参构造器
	public ConstructorOverload(){

	}
	//提供带两个参数的构造器
	public ConstructorOverload(String name,int count){

		this.name=name;
		this.count=count;
	}
	public static void main(String[] args){

		//通过无参构造器创建ConstructorOverload对象
		ConstructorOverload oc1 = new ConstructorOverload();
		//通过有参构造器创建ConstructorOverload对象
		ConstructorOverload oc2 = new ConstructorOverload("longkaili",21);
		System.out.println(oc1.name+" "+oc1.count);
		System.out.println(oc2.name+" "+oc2.count);
	}
}
</span>

如果一个构造器中完全包含另一个构造器的执行体,那么可以通过this关键字进行调用,这样可以增加代码的可维护性。示例代码如下:

<span style="font-size:18px;">package test;

public class Apple {

	public String name;
	public String color;
	public double weight;
	public Apple(){

	}
	public Apple(String name,String color){

		System.out.println("别的构造器调用了我(0.0)");
		this.name=name;
		this.color=color;
	}
	public Apple(String name,String color,double weight){

		//通过this调用另一个构造器的初始化代码。
		this(name,color);
		this.weight=weight;
	}
	public static void main(String[] args){
		Apple ap = new Apple("longnkaili","red",110);
		System.out.println(ap.name+" "+ap.color+" "+ap.weight);
	}
}
</span>

二.java中的继承

java的继承和C++最大的不同就是:java是单继承,每个子类只能有一个直接的父类(当然间接的父类就随便了)。

java的继承通过关键字extends实现;子类继承父类后可以获得父类的所有方法和File,但是不能获得父类的构造器。

下面从几个方向说明继承需要注意的地方。

1.重写父类的方法

如果父类的某个方法对子类是可见的(不为private),然后又在子类中定义了一个与其完全一样的方法,则称为方法的重写,也称为方法覆盖。方法的重写要遵从“两同两小一大”的原则。需要注意的是,覆盖方法和被覆盖方法必须要么都是类方法要么都是实例方法,不能一个是类方法,一个是实例方法。下面是一份示例代码:

package test;

public class Bird {

	public void fly(){
		System.out.println("我在天空自由自在的飞翔...");
	}
}
package test;

public class Ostrich extends Bird{

	public void fly(){
		System.out.println("我只能在地上奔跑....");
	}
	public static void main(String[] args){
		Ostrich Os = new Ostrich();
		Os.fly();
	}
}

2.super限定

当子类方法覆盖了父类方法后,子类对象是无法访问父类中被覆盖的方法的,当可以在子类的方法中调用父类中被覆盖的方法。如果需要在子类方法中调用父类方法,可以使用super(被覆盖的是实例方法)或父类类名(被覆盖的是类方法)作为调用者来调用父类中被覆盖的方法。

当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存空间,还会为其从父类继承的所有实例变量分配内存(不管是不是被子类覆盖)。 示例代码如下;

package test;

public class BaseClass {
     public int a = 5;
}
package test;

public class SubClass extends BaseClass{
     public int a=7;
     public void accessOwer(){
    	 System.out.println(a);
     }
     public void accessBase(){
    	 //通过super来访问父类中被覆盖的变量
    	 System.out.println(super.a);
     }
}

3.子类调用父类的构造器

可以使用super来显式调用父类的构造器,super调用的格式和this一样;super调用的时候必须放在第一行,所以super与this是不能同时出现的。如果不用super显式调用,子类也必定会在其自己的构造器执行前调用父类的无参构造器,而且一定是从其最开始的父类开始调用。示例代码如下:

package test1;

public class Creature {

	public Creature(){
		System.out.println("Creature的无参构造器");
	}
}
package test1;

public class Animal extends Creature{

	public Animal(String name){
		System.out.println("Animal带一个参数的构造器,"+
	"该动物的名字为:"+name);
	}
	public Animal(String name,int age){
		this(name);
		System.out.println("Animal带两个参数的构造器,"+
				 "其age为:"+ age);
	}
}
package test1;

public class Wolf extends Animal{
     public Wolf(){
    	 super("灰太狼",3);
    	 System.out.println("Wolf的无参构造器");
     }
     public static void main(String[] args){
    	 new Wolf();
     }
}
时间: 2024-08-05 20:59:06

java面向对象学习笔记(2)的相关文章

java面向对象学习笔记(1)

此笔记用于记录java面向对象部分学习的心得体会. 一.对象的this指针引用 java提供了一个this关键字,this关键字总是指向调用该方法的对象.根据this出现的位置不同,this作为对象的默认引用有两种情况: 1.构造器中引用该构造器正在初始化的对象. 2.在方法中引用调用该方法的对象. this关键字的最大作用就是让类中的一个方法去访问另一个方法或File.下面通过一段代码来进行说明. package test; public class Dog { public void Jum

Java面向对象学习笔记 -- 1(类、对象、构造器)

1. 类 1)是同类型东西的概念,是对现实生活中事物的描述,映射到Java中描述就是class定义的类. 2)其实定义类,就是在描述事物,就是在定义属性(变量)和方法(函数). 3)类中可以声明:属性,方法,构造器: 属性就是实例变量,用于声明对象的结构的,在创建对象时候分配内存,每个对象有一份! 实例变量(对象属性)在堆中分配,并作用于整个类中,实例变量有默认值,不初始化也能参与运算. 4)类与类之间的关系: ① 关联:一个类作为另一个类的成员变量 public class A { pulic

Java面向对象学习笔记 -- 7(GC)

1. 垃圾回收机制(GC) 1)Java内存分配    在JAVA程序中,无论代码还是数据,都需要存储在内存中,而java程序所需内存均由JVM进行管理分配,JVM会将申请的内存从逻辑上划分为三个区域:堆.栈.方法区.这三个区域分别用于存储不同的数据. 堆用来存放创建出来的对象,jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,每个对象都包含一个与之对应的class的信息(class的目的是得到操作指令): 栈中只保存基本数据类型和对堆空间的对象的引用变

Java面向对象学习笔记 -- 3(继承、向上造型、重写)

1. 继承 1)extends关键字 ,使用继承可以实现代码的重用,在java语言中,需要通过extends关键字实现类的继承.继承完成后,子类(Sub class)可以继承父类(Super class)的成员变量及成员方法,同时子类也可以定义自己的成员变量和成员方法.届时,子类将具有父类的成员及本类的成员. 需要注意的是,Java语言不支持多重继承,即:一个类只能继承一个父类,但一个父类可以有多个子类. 2)使用继承的好处: ① 继承是在一些比较一般的类的基础上构造.建立和扩充新类的最有效的手

Java面向对象学习笔记 -- 5(抽象类、接口)

1. 抽象类 抽象就是将拥有共同方法和属性的对象提取出来,提取后,重新设计一个更加通用.更加大众化的类,就叫抽象类. 1)抽象方法:由abstract修饰,只有方法的定义,没有方法的实现: 2)包含抽象方法的类必须是抽象类: 3)抽象类:由abstract修饰,不能被实例化,可以包含抽象方法和非抽象方法: 4)抽象类都是需要被继承的,子类继承后再实现以下操作: 4.1)子类中重写父类的抽象方法 4.2)子类也声明为抽象类 5)抽象类的意义: 5.1)封装子类共有的变量和方法--代码的重用 5.2

Java面向对象学习笔记 -- 2(访问控制修饰符)

1. 访问控制修饰符(封装) 封装:将数据封装到类的内部,将算法封装到方法中. 1)封装原则:将不需要对外提供的内容都隐藏起来,把属性都隐藏,提供公共方法对其访问,通常有两种访问方式:set 设置,get 获取. 2)封装结果:存在但是不可见. 3)public:任何位置可见,可以修饰:类.成员属性.成员方法.内部类.跨包访问类(需要使用import语句导入),成员属性 = = 成员变量. 4)protected:当前包中可见,子类中可见.可以修饰:成员属性.成员方法.内部类(只能在类体中使用,

Java面向对象学习笔记 -- 6(内部类、Timer)

1. 内部类 内部类就是在一个类的内部定义的类,有:静态内部类.成员内部类,局部内部类.匿名内部类. -1) 静态内部类:使用static修饰,声明在类体中, 静态内部类中可以访问外部类的静态成员,开发很少用 -2) 成员内部类:声明在类体中,不使用static,具有类的成员特征,也就是,必须有类的实例才能创建内部类实例,内部类实例可以访问共享外部类的成员变量 -3) 局部内部类:把类声明在方法中,就是局部内部类,作用域类似局部变量,出了方法就不能使用该类. -4) 匿名内部类:非常常见,可以写

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

面向对象学习笔记

abstract:抽象类或方法的关键字注意事项:一个类中至少有一个抽象方法不允许有大括号主要意义就是规范方法,要求必须按照抽象中的方法来写继承抽象类的类,必须重载完全抽象类的方法抽象类是不能被实例化的,因为本身没有意义 extends 继承的关键字 类中常用的关键字:final 被定义的类不能被继承,该类的方法不能被继承,相当于一个锁的功能self self::静态成员,相当于类名称::静态成员,和this是有区别的,$this访问类中的内容必须实例化,而self是直接可以访问类中的内容的,多用