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

证明接口中量和方法的默认访问修饰符及其信息

2017-07-29 23:35 218 查看

访问权限

四大访问权限:private,default,protected,public(从小到大)

针对的对象:类,方法,属性

详细介绍:针对的对象都是类的成员(包括属性和方法)

private:

类级别访问:只有同一个类中才可以访问,其他的类无法直接访问。

访问方式:类级别的属性无法直接访问,如果想要进行访问。必须在该属性所在的类中重写写一个getXxx()的方法,然后通过访问器间接进行访问。

地位:通过private与包实现了面向对象中的封装。

default:

默认访问控制权限:类与类的成员不写访问修饰符的时候,则称作默认访问控制权限。

包访问级别:相同数据包里的可以访问,也就是只能被本包的其他类访问。

protected:

子类访问级别:同包+不同包的子类进行访问。

public:

公共访问级别:所有类都可以访问,不论是否在同一个包下。

注意:四大访问修饰符中修饰类的只有默认和public,作用域与类的成员一致。

抽象类

概念:用关键字abstract修饰的类称为抽象类。

语法:

1>抽象类中可以含0个或者1个或者多个抽象方法。

2>抽象类中也可以含0个或者1个或者多个普通的方法。

注意点:抽象类内含构造器,但是不可以被实例化。

使用:通过继承,然后实现抽象类中的抽象方法。

注意:如果子类没有实现所有的抽象方法:

1>要么将子类定义成抽象类,然后通过孙子类的建立将未实现的抽象方法进行实现。

2>在子类中将所有抽象方法进行重写。

注意抽象类的继承也只能是单继承。

接口

概念:用interface关键字定义的纯虚的抽象类,叫做接口。

本质:拥有的方法全部都是抽象方法的半个类

语法:无论你写不写都是以下默认,证明方法在后文贴出。

1>属性默认为:public static final

2>方法默认为:public abstract

使用:

1>接口与接口之间为继承,可单也可多继承。关键字用extends。

2>接口与实体类之间为实现,可单也可多实现。关键字用implements。

3>抽象类与接口直接只能是实现,实现接口中的部分抽象方法也可以。

4>一个类可以在继承一个类的同时实现多个接口,但是继承写前,实现写后,用逗号隔开。

注意点:接口无构造器,也不可实例化。

证明接口中的访问修饰符

无关知识:最初并没有想证明默认的访问修饰符。具体的原因还是因为老师一直说不写就是默认的,并不是public。而且在我再三坚持下他仍然坚持他自己的想法的时候,我才想要证明是public的。我的老师知识很渊博,可能是西安最近的天气太热了。因为我自己知道我看过的书记住的知识。下面是证明的过程。

类加载的部分知识。(具体类加载后期介绍)

1>Class对象:用来创建类的所有的常规对象。

2>Class对象载入内存时就可以用来创建这个类所有的对象。

3>类加载器工作:可以获取操控对象的引用。

相关方法的介绍

Class.forName(String str)

介绍:返回一个Class对象的引用,参数str是目标类的文本名。

证明接口中默认的访问修饰符是public

首先:定义一个接口,注意看接口中成员的访问修饰符。

package com.test4_5;

public interface Measurement {
Person person = new Person();
String name = "陈晨";
int age = 120;
double money = 100.00;
int shite();
void fuck();
}


很惊讶我在Measurement类中的第一行吧。不要急,看下文。

原因:本来我定义的只有基本数据类型,例如int,double之类的,但是突然奇想也想定义一个引用类型变量,所以定义了一个String类型的引用变量name。但是总觉得哪里不对劲,后来才想起来String类本来就是一个final类。可能对结果产生偏差。于是就有了第一行。

然后我们看看Person类中有什么,其实就只有一个属性。哦不,Sorry,居然忘掉了一个大事儿。应该是13个方法,1个属性。Object的1个构造器 + Object的11个方法 +Person的一个构造器。然后自己预定义的一个name属性。

package com.test4_5;
public class Person {
String name = "大圣";
}


好,测试类需要的一大半东西都写好了,下来就开始测试了。别急,看main方法。

package com.test4_5.measurement;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class MeasurementTest {
public static void main(String[] args) throws ClassNotFoundException {
//通过静态方法获得Class对象的引用。
Class<?> c = Class.forName("com.test4_5.Measurement");
//获取类中的方法信息至数组中
Method[] methods = c.getDeclaredMethods();
//分别遍历输出方法和属性的具体信息。
System.out.println("遍历后,方法的信息为:");
System.out.println();
for(Method mm: methods ) {
System.out.println(mm.getName() + "()方法的信息是:");
System.out.println(mm);
System.out.println();
}
System.out.print("========================================================================");
System.out.println();
System.out.println("遍历后属性的信息为:");
System.out.println();
Field[] fields = c.getDeclaredFields();
for(Field ff: fields) {
System.out.println(ff.getName() + "属性的信息为:");
System.out.println(ff.toString());
System.out.println();
}
}
}


首先:得到Class对象的引用。

然后:将成员信息分别放置两个数组中。

最后:遍历输出各自的信息。

结果:如下。

遍历后,方法的信息为:

shite()方法的信息是:
public abstract int com.test4_5.Measurement.shite()

fuck()方法的信息是:
public abstract void com.test4_5.Measurement.fuck()

========================================================================
遍历后属性的信息为:

person属性的信息为:
public static final com.test4_5.Person com.test4_5.Measurement.person

name属性的信息为:
public static final java.lang.String com.test4_5.Measurement.name

age属性的信息为:
public static final int com.test4_5.Measurement.age

money属性的信息为:
public static final double com.test4_5.Measurement.money


对照我在接口中写的成员属性和成员方法的访问修饰符与运行结果来看。直接证明了在接口中:

成员属性:public static final。包括基本类型和引用类型。

成员方法:public abstract。

后话:很痛心的是,一个班那么多人,老师质疑我的时候本来还很高兴的是还有个女生跟我一样一口咬定是public,但是遗憾的是老师在跟我强调很多遍的时候那女孩退缩了。可能这个世界就是这样吧。很可惜。真的很可惜。其实有的时候就只是希望有个人跟我有一样的想法,觉得正确的时候坚持下去。其实写这个测试类并不想说明我对了,我的老师错了。做人可以不那么强势,对错都是小事儿,只要不伤和气,况且输了对错有时还赢了人心。毕竟懂得这个道理还是以失去了那么重要的一个人为代价的。但是对技术,应该有自己的要求,错就是错,对就是对。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  对象 java class