您的位置:首页 > 编程语言 > Java开发

Java基础_07

2015-12-13 00:00 381 查看

1:继承与构造方法



Child c = new Child();

要想创建子类,则必须先创建父类。

当创建子类的实例时,会先调用父类的构造方法,将这个类的字节码加载到内存中。

package cn.demo;
import org.junit.Test;

public class Demo01 {
@Test
public void test1(){
Grandpa g = new Child(); //父类的变量指向子类的实例 回首先调用父类的构造方法
//在此处是child—father-grandpa

}
}
class Grandpa {
public Grandpa() {
System.err.println("Grandpa..."+this);//this永远是指new的对象内存地址值,即引用
}
}

class Father extends Grandpa {
public Father() {
System.err.println("Father.."+this);
}
}

class Child extends Father {
public Child() {
System.err.println("Child.."+this);
}
}
输出:
Grandpa...cn.demo.Child@514713
Father..cn.demo.Child@514713
Child..cn.demo.Child@514713

说明:

1:实例化子类时,会先调用父类的默认的构造方法。即先会加载父类。

2:此时在任意的位置(非静态的方法)中使用的this表示的是new的那个对象。

2:Super关键字 – 与this一样只能用于非静态的方法中

用法1:

调用被隐藏的成员变量。

调用被重写的成员方法。

class Grandpa {
public String name = "Grandpa";
public void say(){
System.err.println("name is:"+name);
}
}

class Father extends Grandpa {
public String name = "Father";//如果子类的成员变量与父类的成员量重名,此时父类的成员变量叫被隐藏了 //重写
@Override
public void say() {
System.err.println("father name is:"+name);//Father name is : Father
//如果希望访问父类的成员变量则可以在非静态的方法里面使用super关键字
System.err.println("grandpa is :"+super.name);//Grandpa is Grandpa
//当然也可以调用父类被重写的方法
super.say();//name is grandpa
}
}

输出:

father name is:Father
grandpa is :Grandpa
name is:Grandpa

用法2:

在子类的构造方法的第一句调用父类的某个构造。

class One {
public One(String name) {
}
}

/**
* 当父类没有默认构造时 如果实例化子类,子类又要调用父类的默认的构造 因为父类又没有默认的构造,所以子类出错
* 此时,子类必须要手工的添加一个任意的构造,且在构造方法的第一句 显式调用父类的某个有参数的构造
*/
class Two extends One {
public Two() {//在子类的构造中,必须要调用父类的某个构造
super("Jack");//
}
public Two(String nnm){
super("Mary");
}
}

3:final关键字

修饰的对象
功能
示例:
可以修饰局部变量

当修饰局部变量
如果局部变量是数组则整个的数组不能再指向新的地址,但是里面的值是可以修改的:
这个变量不能再指向新的地址


可以修饰成员方法
当修饰非静态的方法时,说明这个方法子类不能重写。
public class Demo03 { @Test public void test1(){ ATwo t = new ATwo(); t.say();//只能调用父类的 }} class AOne{ //此方法是最后的,不能被子类重写 public final void say(){ System.err.println("ddddd"); }}class ATwo extends AOne{}
Final可以修饰类
表示这个类不能有子类


Fnal可以修饰:

成员变量

局部变量



成员方法。

[

其他的所修饰符号,能不修改局部变量,只有final可以修饰局部变量。

}

4:final与private

Final修饰的类不能有子类,但是可以被实例化。

用private修饰的构造,不能拥有子类,也不可以被实例化.

5:抽象类



抽象关键字是: abstract 。

被abstract修饰类叫抽象类。

特点:

1:抽象类不能被new实例化。

/**
* 声明一个抽象类
*/
abstract class Animal{

}

以下是错误的;
new Animal();

2:抽象类可以拥有抽象方法

[抽象方法,是使用了abstract修饰的方法]

抽象方法不能有方法体:方法后面加上{}即被视为有方法体

Public abstract void say();

3:抽象类可以有抽象方法。也可以没有抽象方法。

abstract class Animal{
//此方法是非抽象的
public void say(){

}
//抽象
public abstract void run();
}

4:抽象方法必须要在抽象类里面。

5:当一个类继承抽象类时,必须要实现(重写)所有父类中的抽象方法

abstract class Animal{
//此方法是非抽象的
public void say(){

}
//抽象
public abstract void run();
public abstract void hi();
}

class Dog extends Animal{
@Override
public void run() {
}

@Override
public void hi() {
}
}

5:抽象类可以拥有构造方法。

说明:

抽象类,就是用于让子类继承的。

要求子类必须要实现某些方法,【定义的些规范】

限制:

Abstract关键字:不能修饰成员变量。只能修饰成员方法与类。

Abstract不能与private共同使用。不能与static共同使用。不能与final共同 。

小结:

抽象类就是被abstact修饰的类。此类不能被实例化。

被abstract修饰的方法,就抽象方法,不能有方法体系,必须要在抽象类里面。

6:接口

接口是被

Interface声明的类。

interface IOne{

}

2:也不能被实例化。

New Ione();错误的。

3:接口中的所有方法,默认都是:

Public abstract的

interface IOne{
public abstract void say();
}

4:里面的所有成员变量默认都是

Public static final的 – 静态常量 ,必须要声明时或在static代码块中设置值

interface IOne{
public static final int AGE=34;
void say();
}

5:在接口中不能有任何的实现



{

…可以被执行的代码

}

6:接口位于类层次的最上层

用于让子实现实现

interface IOne{
public static final int AGE=34;
void say();
void hi();
}
//一个类实现一个接口,也可以实现多个接口
class One1 implements IOne{
public void say() {
}
public void hi() {
}
}

7:一个具体类可以实现多个接口
interface IOne{

public static final int AGE=34;
void say();
void hi();
}
interface ITwo{
public void run();
}
//class SomeClass extends 亲爹 implements 叔叔1,姑姑,....
//一个类实现一个接口,也可以实现多个接口
class One1 implements IOne,ITwo{
public void say() {
}
public void hi() {
}
@Override
public void run() {
}
}

8:接口不能有构造 – 因为不能有任意的实例体所以不能有构造
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: