static关键字和继承

一、static关键字

为了实现对象之间重复属性的数据共享,主要用于修饰类的成员

1. 成员变量

1)非静态成员变量:需要创建对象来访问

2)静态成员变量:使用类名直接调用,也可以通过对象访问

2. 成员方法

可以使用类名直接调用

2.1 静态函数:

1)静态函数中不能访问非静态成员变量,只能访问静态变量

2)静态方法不可以定义this、super关键字

3)静态优先于对象存在,静态方法中不可有this

2.2 非静态函数:非静态函数中可以访问静态成员变量

3.特点

1)静态会随着类的加载而加载,随着类的消失而消失

2)优先于对象存在,即静态先存在,对象后存在

3)被所有实例(对象)所共享

4)可以直接被类名调用

例子

[[email protected] java]# cat Demo.java

class Person {

String name;

int age;

String gender;

//静态成员变量

static String country = "CN";

static {

System.out.println("这是静态代码块");

}

{

System.out.println("这是构造代码块");

}

Person() {

System.out.println("这是无参数构造");

}

Person(String name, int age, String gender) {

this.name = name;

this.age = age;

this.gender = gender;

System.out.println("有参构造");

}

//静态方法

static void run() {

//静态方法只能访问静态成员变量

System.out.println("country:" +country);

}

}

//非静态方法

void speak() {

//非静态方法可以访问静态成员

System.out.println("name:" +name +"age:" +age +"gender:" +gender +"country:" +country +":heihei!");

//非静态方法可以调用静态方法

run();

}

public class Demo {

public static void main(String[] args) {

//直接通过类名来调用访问静态成员

String country = Person.country;

System.out.println(country);

//通过对象.成员的形式来访问

Person p1 = new Person("tom", 28 ,"男");

p1.country = "US";

p1.speak();

}

}

//运行结果

[[email protected] java]# java Demo

这是静态代码块

CN

这是构造代码块

有参构造

name:tomage:28gender:男country:US:heihei!

country:US

[[email protected] java]# cat Demo6.java

class Arrays {

private Arrays() {

}

//定义一个遍历数组的函数

public static void print(int[] arr) {

for (int x = 0; x < arr.length; x++) {

if (x != (arr.length - 1)) {

System.out.print(arr[x] + ",");

} else {

System.out.print(arr[x]);

}

}

}

//定义一个求数组和的功能函数

public static int getSum(int[] arr) {

int sum = 0;

for (int x = 0; x < arr.length; x++) {

sum += arr[x];

}

return sum;

}

//定义一个获取数组最大值的功能函数

public static int getMax(int[] arr) {

int max = 0;

for (int x = 0; x < arr.length; x++) {

if (arr[max] < arr[x]) {

max = x;

}

}

return arr[max];

}

//定义一个获取数组最大值角标的功能函数

public static int getIndexMax(int[] arr) {

int max = 0;

for (int x = 0; x < arr.length; x++) {

if (arr[max] < arr[x]) {

max = x;

}

}

return max;

}

//定义一个返回 指定数在指定数组中包含的角标的功能函数

public static int getIndex(int[] arr, int src) {

int index = -1;

for (int x = 0; x < arr.length; x++) {

if (arr[x] == src) {

index = x;

}

}

return index;

}

//冒泡法排序

public static void test(int[] arr) {

for (int x = 0; x < arr.length - 1; x++) {

if (arr[x] > arr[x + 1]) {

int temp = arr[x + 1];

arr[x + 1] = arr[x];

arr[x] = temp;

}

}

}

//选择法排序

public static void selectSort(int[] arr) {

for (int x = 0; x < arr.length - 1; x++) {

for (int y = 1 + x; y < arr.length; y++) {

if (arr[x] > arr[y]) {

int temp = arr[y];

arr[y] = arr[x];

arr[x] = temp;

}

}

}

}

//反序排序

public static void reverseSort(int[] arr) {

int start = 0;

int end = arr.length - 1;

for (int x = 0; x < arr.length; x++) {

if (start < end) {

int tem = arr[start];

arr[start] = arr[end];

arr[end] = tem;

}

start++;

end--;

}

}

//折半法查找

public static int halfSearch(int key, int[] arr) {

int min = 0;

int max = arr.length - 1;

int mid = 0;

while (min < max) {

mid = (min + max) / 2;

if (key > arr[mid]) {

min = mid + 1;

} else if (key < arr[mid]) {

max = mid - 1;

} else {

return mid;

}

}

return -1;

}

}

class Demo6 {

public static void main(String[] args) {

int[] arr = { 3, 4, 5, 2, 1, 7, 6 };

System.out.print("遍历数组排序:");

Arrays.print(arr);

System.out.println();

System.out.print("选择法后排序:");

Arrays.selectSort(arr);

Arrays.print(arr);

System.out.println();

System.out.print("反序后的排序:");

Arrays.reverseSort(arr);

Arrays.print(arr);

System.out.println();

System.out.print("冒泡法后排序:");

Arrays.selectSort(arr);

Arrays.print(arr);

System.out.println();

System.out.print("数组元素之和:");

System.out.println(Arrays.getSum(arr));

System.out.print("数组最大元素:");

System.out.println(Arrays.getMax(arr));

System.out.print("最大元素角标:");

System.out.println(Arrays.getIndexMax(arr));

System.out.print("遍历查找指定元素6的角标:");

System.out.println(Arrays.getIndex(arr,6));

System.out.print("折半查找指定元素6的角标:");

System.out.println(Arrays.halfSearch(6,arr));

}

}

//运行结果

[[email protected] java]# java Demo6

遍历数组排序:3,4,5,2,1,7,6

选择法后排序:1,2,3,4,5,6,7

反序后的排序:7,6,5,4,3,2,1

冒泡法后排序:1,2,3,4,5,6,7

数组元素之和:28

数组最大元素:7

最大元素角标:6

遍历查找指定元素6的角标:5

折半查找指定元素6的角标:5

二、main方法

主函数是一个特殊的函数,作为程序的入口,可以被jvm识别,是静态的,格式:

public static void main(String[] args){

}

定义:

public:表示该函数的访问权限最大

static:表示主函数随着类的加载,就已存在

void:主函数没有具体返回值

main:不是关键字,是一个特殊的单词可以被jvm识别

(String[] args):函数的参数,类型为数组,元素为字符串,即字符串类型的数组,jvm在调用函数时,传入的是new String[0]

例子:

[[email protected] java]# cat Maintest.java

class Demo {

public static void main(String[] args) {

System.out.println(args.length);

for (int x = 0; x<args.length ;x++) {

System.out.println(args[x]);

}

}

}

public class Maintest {

public static void main(String[] args) {

String [] arr = {"ni","hao","world"};

Demo.main(arr);

}

}

//运行结果

[[email protected] java]# java Maintest

3

ni

hao

world

三、java中的类与类关系

1)is a关系(学生是人)

2)has a 整体与部分

例子

[[email protected] java]# cat Demo3.java

class Person{

String name;

int age;

Address add;

Person(){

}

Person(String name,int age,Address add){

this.name=name;

this.age=age;

this.add=add;

}

void speak(){

System.out.println("姓名:"+name+" 年龄:"+age+" "+add.print());

}

}

class Address{

String country;

String city;

String street;

Address(){

}

Address(String country,String city,String street){

this.country = country;

this.city = city;

this.street = street;

}

String print(){

return "地址:"+country+" "+"城市:"+city+"  街道;"+street;

}

}

class Demo3{

public static void main(String[] args){

Address addr = new Address("中国","深圳","南山大道");

Person p = new Person("jack",27,addr);

p.speak();

}

}

//运行结果

[[email protected] java]# java Demo3

姓名:jack 年龄:27 地址:中国 城市:深圳  街道;南山大道

四、继承

降低对象和对象之间的代码重复性,使用静态变量;而降低类和类之间的代码重复性,就使用就继承

1.特点:

1)类名的设定,被继承的类称之为父类(基类),继承的类称之为子类

2)子类并不能继承父类中所有的成员:

A.父类定义完整的成员,包括静态成员、非静态、构造方法。静态变量和静态方法都可以通过子类名.父类静态成员的形式调用成功

B. 所有的私有成员不能继承,即private修饰的成员

C. 构造函数不能被继承

2.extends关键字

继承使用extends关键字实现

例子

[[email protected] java]# cat Demo1.java

class Person {

String name;

int age;

//静态变量(类变量)对象和对象之间的代码重复使用静态变量

static String country = "CN";

Person() {

}

void speak() {

System.out.println(name + ":哈哈,我是人!!!");

}

}

//学生类和人类产生关系,使用继承

class Student extends Person {

Student() {

}

void study() {

System.out.println("姓名:" + name + "年纪:" + age + ":好好学习");

}

}

class Worker extends Person {

void work() {

System.out.println(name + ":好好工作,好好挣钱。");

}

}

class Demo1 {

public static void main(String[] args) {

Student stu = new Student();

stu.name = "tom";

stu.age = 28;

stu.study();

stu.speak();

System.out.println(stu.country);

System.out.println(Student.country);

Worker worker = new Worker();

worker.name = "joy";

System.out.println(worker.country);

worker.work();

worker.speak();

}

}

//运行结果

[[email protected] java]# java Demo1

姓名:tom年纪:28:好好学习

tom:哈哈,我是人!!!

CN

CN

CN

joy:好好工作,好好挣钱。

joy:哈哈,我是人!!!

3.super关键字

特点:

1)主要存在于子类方法中,用于指向子类对象中父类对象

2)访问父类的属性

3)访问父类的函数

4)访问父类的构造函数

5)this和super类似,this指向的是当前对象的调用,super指向的是当前调用对象的父类

6)子类的构造函数第一行会默认调用父类无参的构造函数,隐式语句;如父类无参构造函数不存在,编译报错

例子

[[email protected] java]# cat Demo6.java

class Father {

int x = 1;

Father() {

System.out.println("这是父类无参构造");

}

Father(int x) {

this.x = x;

System.out.println("这是父类有参构造");

}

void speak() {

System.out.println("我是父亲");

}

}

class Son extends Father {

int y = 1;

Son() {

System.out.println("这是子类的无参构造");

}

Son(int y) {

this.y = y + x;

System.out.println("这是子类的有参构造");

}

void run() {

super.speak();

}

}

class Demo6 {

public static void main(String[] args) {

Son s = new Son(3);

System.out.println(s.y);

s.run();

System.out.println("**************");

s.speak();

}

}

//运行结果

[[email protected] java]# java Demo6

这是父类无参构造

这是子类的有参构造

4

我是父亲

**************

我是父亲

4.重载和重写

重载(overload)

1)所有的重载函数必须在同一个类中

2)函数名相同,参数列表不同,与其他的无关(访问控制符、返回值类型)

3)个数不同 、 顺序不同、 类型不同

重写(override):

1)继承

2)函数名必须相同、参数列表必须相同

3)子类的返回值类型要等于或者小于父类的返回值

例子

class Father {

String name;

void eat() {

System.out.println("吃窝窝");

}

}

class Son extends Father {

public void eat() {

System.out.println("来俩小菜");

System.out.println("来两杯");

}

}

class Demo8 {

public static void main(String[] args) {

Son s = new Son();

s.eat();

}

}

[[email protected] java]# java Demo8

来俩小菜

来两杯

5.instanceof 关键字

1)属于比较运算符

2)用来判断一个对象是否是指定类的对象

3)返回的结果是boolea类型true|false

4)做判断时,两个类之间必须有关系

5)用法:

Person p=new Person();

System.out.println( p instanceof Person);  //对象  instanceof 类;

例子

class Animal {

String name;

void eat() {

System.out.println("吃东西");

}

void shout() {

System.out.println("我是动物");

}

}

class Dog extends Animal {

void eat() {

System.out.println("啃骨头");

}

void shout() {

System.out.println("旺旺");

}

}

class Cat extends Animal {

void eat() {

System.out.println("吃老鼠");

}

void shout() {

System.out.println("喵喵");

}

}

class Demo1 {

public static void main(String[] args) {

Demo11 d = new Demo1();

//对象 instanceof 类;

System.out.println(d instanceof Demo1);

d.doSomething(new Dog());

d.doSomething(new Cat());

}

void doSomething(Animal a) {

if (a instanceof Dog) {

a.eat();

a.shout();

System.out.println("小狗看家");

} else if (a instanceof Cat) {

a.eat();

a.shout();

System.out.println("抓老鼠");

}

}

}

//运行结果

[[email protected] java]# java Demo1

true

啃骨头

旺旺

小狗看家

吃老鼠

喵喵

抓老鼠

6. final关键字

1)它指的是“这是不可变的”

2)final关键字主要用于成员属性、类成员、修饰类、方法、以及方法的形参

A.成员属性是常量,不能被修改:

public static final double PI=3.14;

public:访问权限最大

static:内存中只有一份

final:是一个常量

常量名大写

必须初赋值

B.final修饰类成员:

1)基本数据类型,final使值不变

2)对象引用,final使其引用恒定不变,让其无法指向一个新的对象,但对象自身可以被修改

3)一般和static关键字结合使用:常量可以优先加载,无需等创建对象时再初始化

4)final和static可以互换位置

5)常量一般被修饰为final

C.final修饰类:

1)该类是最终类,不能被继承

2)String、Integer类是final:为了防止代码功能被重写,该类没有必要进行扩展

D.final修饰方法:

1)该方法是最终方法,不能被重写

2)当一个类被继承,那么所有的非私有函数都将被继承,如果函数不想被子类继承并重写可以将该函数final修饰

3)当一个类中的函数都被修饰为final时,可以将类定义为final

例子

class Demo12 {

public static final double PI = 3.14; // 静态常量

public static double getArea(double r) {

return PI * r * r;

}

public static double getLength(double r) {

return PI * r * 2;

}

public static void main(String[] args) {

// Demo12.PI=300; 无法为最终变量 PI 指定值

System.out.println(Demo12.PI);

}

}

原文地址:http://blog.51cto.com/huangzp/2108268

时间: 2024-10-15 04:47:19

static关键字和继承的相关文章

Java继承和多态-Static关键字

1. 什么是Static 关键字? Static 能够与变量,方法和类一起使用,称为静态变量,静态方法.如果在一个类中使用static修饰变量或者方法的话,它们可以直接通过类访问,不需要创建一个类的对象来访问成员. 实例: package com.java.JavaStatic; /** * Understand Java Static * @author Jeff * @date 2016/03/17 * http://www.weixueyuan.net/view/6003.html */

(转)Java中的static关键字解析

转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途." 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键

PHP延迟静态绑定:static关键字

PHP5.3中引入了延迟静态绑定的概念.该特性最明显的标志就是新关键字static.static类似于self,但它指的是被调用的类而不是包含类.在本例中,它的意思是调用Document::create()将生成一个新的Document对象,而不是试图实例化一个DomainObject对象. 因此,现在在静态上下文中使用继承关系. abstract class DomainObject{ public static function create(){ return new static();

Java中的static关键字解析

http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途.” 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句

java中static关键字解析

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

Java中static关键字用法总结

1.     静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法 声明为static的方法有以下几条限制: · 它们仅能调用其他的static 方法. · 它们只能访问static数据. · 它们不能以任何方式引用this 或super. class Simple { static void go() { System.out.println("Welcome"); } } public class Cal { public static vo

【转】Java中的static关键字解析

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有thi

关于java的static关键字

通常来说,当你创建类时,就是在描述那个类的对象的外观与行为.除非你用new创建那个类的对象,否则,你实际上并未获得任何东西.当你用new来创建对象时,数据存储空间才被分配,其方法才供外界调用. 但是有两种情形,用上述方法是无法解决的.一种情形是,你只需要为某特定数据分配一份存储空间,而不去考虑究竟要创建对少个对象,还是甚至根本就不需要创建任何对象.另一种情形是,你希望某个方法不与包含它的类的任何对象关联在一起.也就是说,即使没有创建对象,也能够调用这个方法. 通过static关键字,可以满足这两

Java中final和static关键字总结

1.final: final关键字可用于类.方法.变量前. final修饰的类不可被继承,例如java.lang.Math就是一个 final类,不可被继承. final修饰变量,在显示初始化后不可改变变量值,用于常量定义.如果final变量是引用变量,则不可以改变它的引用对象,但可以改变对象的数据(属性). final修饰的方法不可被重写. 错误案例) package com.sp; public final class Fish {        final String name = "鱼