java this,static,package等关键字与相关练习

时间:2022-10-17 00:42:55

学习心得

一、专业课

1面向对象

1this关键字

(1)this调用本类中的属性,也就是类中的成员变量;

 (2)this调用本类中的其他方法;
(3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。2static

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象

(1)、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用thissuper关键字,不能直接访问所属类的实例变量和实例方法 (就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法

(2)static代码块

  static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一.

3)类内存图分析



publicclassChinese{

Stringname;

intage;

staticStringcountry;

/*

*构造代码块可以有多个每次生成类时都会执行

*可以访问静态方法变量

*/

{

System.out.println("构造代码块2"+country);

}

voidspeak(){

System.out.println(this.name+ "说:");

}

/*

* static不能访问非静态成员属性,方法

*用于初始化静态变量

* static构造代码快可以有多个

* static构造代码块,先于main方法执行,而且不管类有几个,都执行一次

*/

static{

country= "中国";

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

}

{

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

}

static{

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

}

publicstatic void main(String[] args) {

Chinesechinese =new Chinese();

Chinesechinese2 =new Chinese();

/*

*静态属性可以用类名引用,也可以用引用变量引用

*/

System.out.println(Chinese.country);

}

}

执行结果

静态代码块2

静态代码块1

构造代码块2中国

构造代码块1

构造代码块2中国

构造代码块1

中国


3package

1、提供多层的命名空间,解决命名冲突;(处于不同package中的类可以拥有相同的名字)

2、对类按功能进行分类,使得项目的组织更加清楚

3、结合访问修饰,有安全机制



4java访问修饰符

1public:用public修饰的类、类属变量及方法,包内及包外的任何类(包括子类和普通类)均可以访问;

  2protected:用protected修饰的类、类属变量及方法,包内的任何类及包外那些继承了该类的子类才能访问(此处稍后解释protected重点突出继承;

  3default:如果一个类、类属变量及方法没有用任何修饰符(即没有 publicprotectedprivate中任何一种修饰),则其访问权限为default(默认访问权限)。默认访问权限的类、类属变量及方法,包内的任何类(包括继承了此类的子类)都可以访问它,而对于包外的任何类都不能访问它(包括包外继承了此类的子类)。default重点突出包

4private:用private修饰的类、类属变量及方法,只有本类可以访问,而包内包外的任何类均不能访问它

访问级别

访问控制修饰符

同类

同包不同类(不含子类)

同包子类

不同包不同类

(不含子类)

不同包子类

公开

public

受保护

protected

--

√(注意)

默认

没有访问控制修饰符

--

--

私有

private

---

---

--

--



5)面向对象的三大特性

1.封装

封装的定义:

  • 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系

为什么需要封装:

  • 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现

  • 阻止外部的非法操作

二、小组PK

1题目

1.以下程序能否运行

如果不能请指出错在那里,

如果可以请输出程序结果:

//('A'acsii码是65)

publicclass Test {

publicstatic void main(String[] args) {


char[]ch = new char[]{65,66,67,68,65,65,68,69,65};

for(inti = 0; i < (ch.length/2);i++){

if(ch[i]!= ch[ch.length-1-i])

System.out.print(ch[i++]);

System.out.print(ch[ch.length-1-i]);


}

}

答案

ABDDA

2.请找出下面程序的错误,可能有几处(请在错误语句后面打星*):

publicclass Question {

staticint i,j,k;

Question(inti, int j,int k){

this.i= i;

this.j= j;

this.k= k;

}

voidtest(int i) {

System.out.println(i);

}

staticvoid test(int i){ *//这个test方法与上一个非静态的test冲突

System.out.println(i);

}

{

i++;

}

static{

j++;

}

publicvoid fun(int k){

Questionq1 = new Question(); *//没有不带参的构造参数

k+=(++i)+(j++);

}

publicstatic void main(String[] args) {

Questionq1 = new Question(1,1,1);

System.out.println(q1.i+","+q1.j+","+q1.k);

System.out.println(fun(2)); *//main不能直接调用非静态方法

}

}

3,请找出下面程序的错误,可能有几处(请在错误语句后面打星*):

publicclass TestC {

inta=b=2; *//b没有定义

publicstatic void fun(float f) {

System.out.println(f);

}

publicstatic void main(String[] args) {

inta=1,b=2,c=3,p=4;

System.out.println(Math.sqrt(p*(p-a)(p-b)(p-c))); *//*

fun(2.2); *//2.2默认是double,不能传float

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

}

}

4.以下程序能否运行

如果不能请指出错在那里,

如果可以请输出程序结果:

publicclass TestD {

inti;

staticint a;

staticint b;

publicTestD(int i) {

this.i= i;

System.out.println(i);

}

static{

a= a^b;

}

{

System.out.println(i);

a= a^b;

}

static{

b= a^b;

}

publicstatic void main(String[] args) {

inti = 2;

TestDtestd = new TestD(i++);

TestD.a= 6;

TestD.b= 8;

System.out.println(TestD.a);

System.out.println(TestD.b);

}

}

答案:

0

2

6

8

5.以下程序能否运行

如果不能请指出错在那里,

如果可以请输出程序结果:

publicclass Test {

intn ;

intarr[][];

publicTest(int n) {

this.n+= n++;

this.arr= new int[n][n];

}

{

n++;

}

public void test(int n){

for(inti = 0;i < n;i++){

for(intj = 0;j <= i;j++){

if(j== 0){

arr[i][j]= 1;

System.out.print(arr[i][j]+"");

}elseif(i == j){

arr[i][j]= 1;

System.out.print(arr[i][j]+"");

}else{

System.out.print(arr[i-1][j-1]+arr[i-1][j]+"");

}

}

System.out.println();

}

}


publicstatic void main(String[] args) {

Testy = new Test (4);

y.test(y.n);

}

}

答案:

1

11

12 1

11 1 1

11 0 1 1

2、对方题目

1.程序是否有错误,有则指出错误,没有则写出程序输出结果

privateclass Test { //类名不可用private修饰

Stringname;

staticint i;

static{

i++;

}

{

System.out.println("我的名字是:"+name);

}

publicTest(String name){

this.name= name;

}

publicstatic void main(String[] args) {

newTest("宁年");

}

}


2.程序是否有错误,有则指出错误,没有则写出程序输出结果

publicclass T1 {


publicstatic void main(String[] args) {

PPp1=new PP();

System.out.println(p1.a); //aprivate属性不能直接访问

}

}

classPP{

staticprivate int a=10;

static{

a++;

}

publicPP(){

this.a++;

}

}

有错误//aprivate属性不能直接访问


3输出程序运行结果

classPer {

Stringname;

intage;

staticdouble gread;

Per(Stringn,int a){

name= n;

age= a;

}

{

print();

}

static{

gread= 88.5;

inta = 11;

System.out.println(a);

}

voidprint(){

System.out.println("name:"+ name + " age:" + age + " gread:" + gread);

}

}

classDemo1 {

publicstatic void main(String[] args) {

Perp = new Per("mary", 11);

p.print();

}

}

11

name:nullage:0 gread:88.5

name:maryage:11 gread:88.5


4:写出程序运行结果

publicclass Demo1 {

floata = 0.0F;

staticint b=1;

static{

b++;

}

{

if(a == 0) {

a+= 1;

}

if(a > 0.00f) {

a+= 2;

}

System.out.println(a);

}


publicstatic void main(String[] args) {

System.out.println(newDemo1().a);

System.out.println(Demo1.b);

}

}

5.写出程序运行结果

publicclass A {

inta=10;

{

System.out.println(a);

a++;

a();

}

publicA(int a){

a();

System.out.println(a);

}

publicvoid a(){

this.a++;

System.out.println(a);

}

publicstatic void main(String[] args) {

Aa=new A(2);

a.a();

}

}

1:编译出错,private修饰类

2:私有属性不能在其他类中访问

3.11

name:null age:0 gread:88.5

name:mary age:11 gread:88.5

4.3.0

3.0

2

5.10

12

13

2

14

学习心得:

1.细节是魔鬼,经常都不看的代码段,可能就隐藏着错误

2.可变参数允许传递空值