类和对象
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类对象b1,B类下创建了C类对象c1
2.包2中,C类下创建了B类对象b2、C类对象c2.
请问b1,b2,c1,c2的访问范围各是多少?
解析:
B类是包内继承
b1是包内继承、包内创建,查表得知能访问a、b、c.
b2是包内继承、包外创建,查表得知只能访问a.
类B是包内继承,相当于继承了a,b,c。即相当于B是一个有公有属性a,保护属性b,默认属性c的类。
类C包外继承B。
c1是包外继承、包外创建,但不知道为什么也能访问a、b,所以,涉及孙类的,暂时不能用我们的相对继承法则。
C2是包外继承,类内创建。故能访问a、b.
七、静态修饰符
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的值,分别是1,2,3.
注意:静态变量可以被子类访问(访问修饰符允许),静态方法可以被子类和子类对象访问(访问修饰符允许)但无法被覆盖。
八、终态修饰符
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关键字。
同名的成员方法也可以有多个(参数列表需不同),这被称为函数的重载,调用的时候自然是根据提供的参数选择最匹配的方法。
以上是关于类和对象的主要内容,如果未能解决你的问题,请参考以下文章