类和对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类和对象相关的知识,希望对你有一定的参考价值。

JavaSE(六)

--类和对象

一、类和对象的基础

类是抽象的,概念的,代表一类事物,比如人类,猫类

对象是具体的,比如郭德纲(是一个具体的事物)

类是对象的模板,对象是类的一个实例个体(郭德纲是属于人类的,而且是具体的事物)

 

二、类的结构

Package包名;

Class 类名 extends 父类 implements 接口名{

成员变量;

构造方法;

成员方法;

}

 

 

三、对象的创建

1.声明:类名 对象名;   Cat cat1;

2.创建: 对象名=new 类名();   cat1=new Cat();

3.也可以直接声明+创建: 类名 对象名=new 类名(); Cat cat1=new Cat();

 

四、成员变量(成员属性)

四种访问修饰符

访问级别

访问修饰符

同类

同包

子类

不同包

公开

Public

受保护

protected

×

默认

没有修饰符

×

×

私有

Private

×

×

×

 

 

同一个包

另一个包

 

本类

子类

普通类

子类

普通类

Public

protected

 

默认

 

 

Private

 

 

 

 

 

个人认为这个表不够精确,于是测试出了几个更精确的:

 

 

访问级别

访问修饰符

A类中创建的A类对象

同包非A类中创建的A类对象

不同包下创建的A类对象

A类的公开变量或方法

Public

能够访问

能够访问

能够访问

A类的受保护变量或方法

protected

能够访问

能够访问

不能访问

×

A类的默认变量或方法

没有修饰符

能够访问

能够访问

不能访问

×

A类的私有变量或方法

Private

能够访问

不能访问

×

不能访问

×

 

总结:

A类的对象能访问的权限跟对象定义的位置有关:

A类中定义的能访问所有的变量和方法。

同包但不是A类中定义的不能访问A类的私有变量和方法,其他的可以。

不同包下定义的仅能访问A类的公有方法

 

 

 

B于A类中继承A

B于同包非A类中继承A

B于不同包下继承A

B类中定义B的对象

Public、protected、

默认

Public、protected、

默认

Public、protected

同B的包B外定义B的对象

无法实例化

Public、protected、

默认

Public

B的包外定义B的对象

无法实例化

Public

Public

 

(B继承A)

包(A类所在的包)内类内继承

也叫类内继承

包内类外继承

也叫包内继承

包外继承

包(B类所在的包)内类内创建

即类内创建

Public、protected、

默认

Public、protected、

默认

Public、protected

包内类外定义

即包内创建

无法实例化

Public、protected、

默认

Public

包外创建

 

无法实例化

Public

Public

 

 

五、方法的覆盖

相对继承法则:

①子类在其本类中定义的对象能访问父类哪些变量,就表明子类继承了父类的哪些成员属性。

②子类在其本类中定义的对象能访问父类哪些方法,就表明我们能在这个子类中重写父类的哪些方法。

子类可以重写父类的方法,但是要求方法名、参数列表、返回类型都相同。这被称为方法的覆盖。

方法名、参数列表、返回类型都相同。访问修饰符是可以不相同的,但是子类的方法访问范围不允许小于父类的方法范围。

范围Public>protected>默认(无修饰符)>private

例如父类有一个protected方法叫Hello,那子类要重写这个方法就必须是protected或者public

 

六、例子

如果包1中有:

A(含公有属性a,保护属性b,默认属性c,私有属性d)

B(继承了A)

在包2中:

C(继承了B)

 

1.1中,A类下创建了B类对象b1B类下创建了C类对象c1

2.2中,C类下创建了B类对象b2C类对象c2.

 

请问b1,b2,c1,c2的访问范围各是多少?

 

解析:

B类是包内继承

b1是包内继承、包内创建,查表得知能访问abc.

b2是包内继承、包外创建,查表得知只能访问a.

 

B是包内继承,相当于继承了a,b,c。即相当于B是一个有公有属性a,保护属性b,默认属性c的类。

C包外继承B

c1是包外继承、包外创建,但不知道为什么也能访问ab,所以,涉及孙类的,暂时不能用我们的相对继承法则。

C2是包外继承,类内创建。故能访问ab.

 

七、静态修饰符

Static修饰变量a表示公共变量:所有对象访问到的变量a都是同一个变量a。可以用对象名和类名点出来,但是一般用类名点出来。

 

Static 修饰方法表示静态方法,方法里面不能使用非静态变量。同样可以用对象名和类名点出来,一般用类名点。

 

Static{

}

表示静态代码块,里面也无法使用非静态变量,只会被执行一次,就是被定义的类编译的时候。静态代码块的是否执行不依赖是否有对象被创建。

public class Test {

static int a=0;

static{

a++;

}

public Test() {

// TODO 自动生成的构造函数存根

a++;

}

public static void main(String[] args) {

System.out.println("a="+a);

Test test1=new Test();

System.out.println("a="+a);

Test test2=new Test();

System.out.println("a="+a);

}

}

这便会输出三个a的值,分别是123.

注意:静态变量可以被子类访问(访问修饰符允许),静态方法可以被子类和子类对象访问(访问修饰符允许)但无法被覆盖。

 

八、终态修饰符

Final为终态修饰符,修饰变量表明成员变量不可以被修改,修饰函数表明函数不可以被重写,修饰类表明类不可以被继承。

所以静态的、终态的方法都无法被重写。

我们希望创建一个变量,所有人都能访问,所有人访问的是同一个,但所有人都无法修改的时候,一般就使用

public static final int BODY_SIZE=45;

public final static int BODY_SIZE=45;

static final public int BODY_SIZE=45;

final static public  int BODY_SIZE=45;

之类的定义方法(三个修饰符无顺序),终态的变量名取名也有规范,一般是大写加下划线,例如BOX_HEIGHT,CELL_SIZE.

终态的

九、构造方法

每个类默认有一个无参构造方法(不写也有),每个类可以有多个构造方法(参数列表需不同)

方法中常用到this关键字,这表示当前对象的。

public class Test {

int a=0;

public Test(int a) {

// TODO 自动生成的构造函数存根

this.a=a;

}

 

}

//这个构造方法表示将传过来的a(传参)赋值给当前对象的a。因为这个构造函数被调用的时候肯定会有一个当前对象。静态的变量不属于任何一个对象,所以this是点不出来的。

同理静态方法中也不会出现this关键字。

同名的成员方法也可以有多个(参数列表需不同),这被称为函数的重载,调用的时候自然是根据提供的参数选择最匹配的方法。

 

以上是关于类和对象的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE:类和对象

类和对象

Python的类和对象入门

类和对象

类和对象的使用

第1章 类和对象——定义类和创建对象