java继承机制
1 继承 关键字:extends java没有多重继承
实例
父类:
package unit4;
public class Base {
    public int publicVarofBase=1;
    private int privateVarofBase=1;
    int defaultVarofBase=1;
    protected void methodOfBase() {
        System.out.println("执行父类的方法");
    }
}
子类:
package unit4;
public class Sub extends Base{
    public void methodOfSub() {
        System.out.println("执行子类的方法");
        publicVarofBase=2;
        defaultVarofBase=2;
        privateVarofBase=2;
        methodOfBase();
    }
    public static void main() {
        Sub sub =new Sub();
        sub.publicVarofBase=3;
        sub.privateVarofBase=3;
        sub.defaultVarofBase=3;
        sub.methodOfSub();
        sub.methodOfBase();
    }
}
继承的说明:
子类可以继承父类的东西:
1.当子类和父类在同一个包中时,子类继承父类的:public、protected、默认 访问级别的成员变量和成员方法。
2、当子类和父类在不同的包时,子类继承父类:public、protected 访问级别的成员变量和成员方法。
所有的类都直接或间接的继承了java.lang.Object类。
super关键字
super关键字代替匪类对象,通过super可以访问被子类覆盖了的方法或隐藏了的属性。
在一下情况一般会用super关键字:
1 在类的构造方法中,通过super语句调用这个类的父类的构造方法
2 在子类中访问父类的被屏蔽的方法和属性
注意:在子类的构造方法中通过super()条用父类的构造方法,则此调用必须出现在子类构造方法可执行语句的第一句。
如果没有明确地调用父类的构造方法,编译器会自动加一条调用匪类的默认构造方法,所以一般建议对每一个类都给一个默认的构造方法。
方法覆盖和属性隐藏
package unit4;
public class SuperClass {
    int a;
    public SuperClass() {
        // TODO Auto-generated constructor stub
        a=10;
    }
    public void printA() {
        // TODO Auto-generated method stub
        System.out.println("父类中的A:"+a);
    }
}
package unit4;
public class SubClass extends SuperClass {
	int a;
	public SubClass(int a) {
		// TODO Auto-generated constructor stub
		this.a=a;
	}
	public void printA(){
		System.out.println("父类中的A:"+super.a);
		System.out.println("子类中的A:"+a);
	}
}
package unit4;
public class OverrideDemo {
	 public static void main(String[] args) {
		 SuperClass c1=new SubClass(20);
		 c1.printA();
}
}
父类中的A:10
子类中的A:20
package unit4;
public class Base {
    String var ="Base's Variable";
    void method(){
        System.out.println("call Base's method");
    }
}
package unit4;
public class Sub extends Base{
String var ="Sub's variable";
	void method(){
		System.out.println("Sub's method call");
	}
	void test(){
		String var = "local variable";
		System.out.println("var is "+ var);
		System.out.println("this .var is "+ this.var);
		System.out.println("super.var is "+super.var);
		method();
		this.method();
		super.method();
	}
	public static void main(String[] args) {
		Sub sub =new Sub();
		sub.test();
	}
}
var is local variable
this .var is Sub's variable
super.var is Base's Variable
Sub's method call
Sub's method call
call Base's method
java继承中注意:
1 构造方法不能被继承
2 private类型的成员变量和成员方法不能被继承
3 覆盖方法时不能缩小父类方法的访问权限,但可以扩大
4 覆盖方法时不能抛出比父类方法更多的异常
5 不能将静态方法覆盖为非静态方法,也不能将非静态方法覆盖为静态方法
6 由于私有方法不能继承,所以不存在覆盖问题。
final关键字、abstract关键字
final关键字
修饰的类不能被继承,派生子类
修饰的方法不能被重写
修饰的变量不允许修改
abstract关键字
abstract可以修饰类和方法,分别成为抽象类和抽象方法
抽象类相当于一个半成品,需要子类继承并覆盖其中的抽象方法,这样子类才能创建实例
抽象方法没有实现代码,由子类实现。
使用规则:
1 抽象类中可以没有抽象方法。不管类定义时有没有abstract关键字修饰,只要包含了抽象方法,就自动变为抽象类。
2 没有抽象的构造方法,也没有抽象的静态方法
3 抽象类和抽象方法不能被final修饰符修饰,但是抽象类可以包含final方法
inerface关键字和接口
java的接口中只存在公有抽象的方法和公有静态的常量。
不管是否明确添加相应的修饰符,java编译器都会自动给加上相应的修饰符。
接口可以继承,并且可以多重继承。
通过implements声明自己实现了一个或多个接口
package unit4;
import com.sun.java_cup.internal.internal_error;
interface Computable {
    int M=10;
    int f(int x);
    public abstract int g(int x,int y);
}
package unit4;
import com.sun.java_cup.internal.internal_error;
public class A implements Computable {
    public int f(int x){return M+2*x;}
    public int g (int x,int y){return M*(x+y);}
}
package unit4;
public class B implements Computable{
    public int f(int x){return x*x*x;};
    public int g(int x,int y){return x*y*M;}
}
package unit4;
import sun.net.www.content.image.gif;
public class interfacedemo {
    public static void main(String[] args) {
        A a=new A();
        B b =new B();
        System.out.println(a.M);
        System.out.println(" "+a.f(20)+", "+a.g(12,2));
        System.out.println(b.M);
        System.out.println(" "+b.f(20)+" "+b.g(12,2));
    }
}
接口中所有的方法必须是抽象的,接口中的方法定义默认为public abstract类型的,接口中的成员变量的类型默认为public static final。
接口与抽象类之间的区别:
1 抽象类可有构造方法
2 抽象类中可有普通的成员变量
3 抽象类中可有非抽象的普通方法
4 抽象类中可有静态的方法
5 抽象类中的静态成员变量类型可以任意,接口中的只能是public static final型
6 一个类可以实现多个接口,但是只能继承一个抽象类
java继承机制的更多相关文章
- Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)
		
继承(inheritance)背后的核心思想是: bonus = b; } } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...
 - C++ 和Java继承机制的比较
		
摘要: C++支持类的多继承,而Java采用类的单继承.C++中的继承成分只有类(模板属于带参数的类,结构和联合是特殊的类),Java中除了类还有接口的继承,而且允许接口的多继承,可以间接地实现类多继 ...
 - java的继承机制
		
这次我想深入探究以下java里类的继承机制. 我们知道,继承是java设计里的一个失败的地方.高司令说过:如果让他重新设计java的话,他会把继承去掉.而java里继承到底怎么了,会这么不 ...
 - 第28章 java反射机制
		
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
 - java基础知识(十一)java反射机制(上)
		
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
 - java基础知识(十一)java反射机制(下)
		
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
 - Javascript 构造函数原型继承机制
		
我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...
 - Java继承与组合
		
Java继承与组合 继承 java 中使用extends关键字表示继承关系,当创建一个类时,如果没有明确指出要继承的类,则是隐式地从根类Object进行继承. 子类继承父类的成员变量 子类能够继承父类 ...
 - javascript继承机制的设计思想(ryf)
		
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
 
随机推荐
- python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作
			
阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...
 - [CF468D]Tree
			
[CF468D]Tree 题目大意:  一棵\(n(n\le10^5)\)个编号为\(1\sim n\)的点的带边权的树,求一个排列\(p_{1\sim n}\),使\(\sum dis(i,p_i ...
 - Java高级架构师(一)第26节:测试并调整登录的业务功能
			
主Index的处理Java: package com.sishuok.architecture1; import org.springframework.beans.factory.annotatio ...
 - IO流--FileReader&&FileWriter
			
(一)FileReader (1)第一种读取方式 package com.songyan.fileReader; import java.io.FileNotFoundException; impor ...
 - Maven设置snapshot无法在远程仓库下载的问题解决
			
检查步骤如下: 1.检查nexus是否纳入public版本中: 2.配置中是否启用snapshots功能.以下方法两种设置都可以,任选一个即可. 一种是在项目pom.xml使用: <reposi ...
 - C# 6.0语法新特性体验(二)
			
之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性,现在随着Visual Studio 14 CTP3的发布,又陆续可以体验一些新的特性了,这里简单的介绍一下之前没 ...
 - javascript如何写一个for循环
			
一个非常简单的for循环,也有不少的学问.假如,我们的目标是要遍历一个dom结点的所有孩子结点,然后打印结点的内容. 在javascript下,我刚学习的时间,我会这样写. for(var i = 0 ...
 - leetcode练习之No.1------ 两数之和Two Sum
			
github地址:git@github.com:ZQCard/leetcode.git 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能 ...
 - python的dict如何排序
			
Python的内置dictionary数据类型是无序的,通过key来获取对应的value.可是有时我们需要对dictionary中 的item进行排序输出,可能根据key,也可能根据value来排 # ...
 - unity backbuffer
			
拿unity backbuffer的方法 var backbuffer = new RenderTargetIdentifier(BuiltinRenderTextureType.None); 这个 ...