java入门学习笔记(五)—— 简单的类和对象、类的定义、创建对象、构造方法、this关键字、对象成员属性的初始化、static修饰符、变量的作用域

一、序言

java中,有关类的知识比较多,这里只对基础的知识,做一个简短的说明。

二、类的定义与创建对象

父类——超类
指定了父类的子类——派生类

创造对象时,需要定义相应的构造方法

三、构造方法

构造方法没有返回值类型
(如果给出了返回值的类型,java会把这个所谓的构造方法当成一般方法来处理)

练习1——长方形类

package try_a_package;

public class Rectangle {
	private double a;
	private double b;
	private String name="矩形";
	
	public Rectangle()
	{
		a=1;
		b=2;
		name="矩形";
	}
	
	public Rectangle(double x,double y)
	{
		a=x;
		b=y;
		adjustName();
	}
	
	public Rectangle(double x)
	{
		a=x;
		b=x;
		adjustName();
	}
	
	public void Rectangle(double x,double y,String n)
	{
		a=x;
		b=y;
		name=n;
	}
	
	public boolean isRectangle()
	{
		if(a>0 && b>0)
		{
			return true;
		}
		return false;
	}
	
	public void adjustName()
	{
		if(isRectangle())
		{
			if(a==b)
			{
				name="正方形";
			}
			else
			{
				name="长方形";
			}
		}
		else
		{
			name="非长方形";
		}
	}
	
	public double getPerimeter()
	{
		return (a+b)*2;
	}
	
	public double getArea()
	{
		return a*b;
	}
	
	@Override
	public String toString()
	{
		String msg=name+":边长a="+a+",边长b="+b;
		if(isRectangle())
		{
			msg=msg+",周长"+getPerimeter()+",面积"+getArea();
		}
		return msg;
	}
	
	public static void main(String[] args)
	{
		Rectangle r[]=new Rectangle[5];
		r[0]=new Rectangle();
		r[1]=new Rectangle(3);
		r[2]=new Rectangle(-2);
		r[3]=new Rectangle(5,4);
		r[4]=new Rectangle(-1,2);
		int i;
		for(i=0;i<r.length;++i)
		{
			System.out.println(r[i]);
		}
		Rectangle r1=new Rectangle();
		r1.Rectangle(10,20,"长方形");
		System.out.println(r1);
	}
	
}

运行结果

在这里插入图片描述

四、this关键字

Java关键字this只能用于方法体内。

当创建了一个对象后,java虚拟机(JVM)给该对象分配了一个引用自己的指针——this

类中,非静态方法中可以使用this,而静态方法和静态的代码块中绝对不能使用this。
这是因为,this只能与特定的对象关联,而不会与类关联,同一个类的不同对象,有不同的this。

应用情形

  1. 通过this调用另一个构造方法——this(参数列表),这个仅仅在类的构造方法中使用,在别的地方不能这样使用。
  2. 方法参数或者方法中的局部变量与成员变量同名时,成员变量就会被屏蔽,此时可以通过this来访问成员变量。
  3. 在方法中,需要引用该方法所属类的当前对象时,就可以直接用this。

this练习——三角形类

package try_a_package;

public class Triangle1 {
	private double a,b,c;
	String name="三角形";
	
	public Triangle1()
	{
		this(10);
	}
	
	public Triangle1(double x)
	{
		this(x,x,x);
	}
	
	public Triangle1(double x,double y)
	{
		this(x,x,y);
	}
	
	public Triangle1(double a,double b,double c)
	{
		this.a=a;
		this.b=b;
		this.c=c;
		adjustName();
	}
	
	public void adjustName()
	{
		if(this.isTriangle())
		{
			double  t;
			if(a>b)
			{
				t=a;
				a=b;
				b=t;
			}
			if(a>c)
			{
				t=a;
				a=c;
				c=t;
			}
			if(b>c)
			{
				t=b;
				b=c;
				c=t;
			}
			name="三角形";
			if(c*c==a*a+b*b)
			{
				name="直角"+name;
			}
			else if(a==b&&b==c)
			{
				name="等边"+name;
			}
			else if(a==b||b==c)
			{
				name="等腰"+name;
			}
		}
		else
		{
			name="非三角形";
		}
	}
	
	public boolean isTriangle()
	{
		if(a+b>c && a+c>b && b+c>a)
		{
			return true;
		}
		return false;
	}
	
	public double    getPerimeter()
	{
		return a+b+c;
	}
	
	public double getArea()
	{
		double p,s;
		p=(a+b+c)/2;
		s=Math.sqrt(p*(p-a)*(p-b)*(p-c));
		return s;
	}
	
	@Override
	public String toString()
	{
		String msg=name+"\t"+a+"\t"+b+"\t"+c;
		if(isTriangle())
		{
			msg=msg+"\t"+this.getPerimeter()+"\t"+this.getArea();
		}
		return msg;
	}
	
	public static void printHeader()
	{
		System.out.println("图形名称\t\t边长a\t边长b\t边长c\t周长\t面积");
	}
	
	public static void main(String[] args)
	{
		Triangle1 t1,t2,t3,t4,t5;
		t1=new Triangle1();
		Triangle1.printHeader();
		System.out.println(t1);
		t2=new Triangle1(6);
		t3=new Triangle1(3,4);
		t4=new Triangle1(3,4,5);
		t5=new Triangle1(3,4,7);
		
		System.out.println(t2);
		System.out.println(t3);
		System.out.println(t4);
		System.out.println(t5);
	}
}

运行结果

在这里插入图片描述

五、对象成员属性的初始化

在对对象进行初始化时,可以使用非静态初始化块对对象进行初始化。
初始化块的花括号{}不能省略。

static 修饰符

static修饰的成员变量——静态变量、静态属性、类成员变量。

类成员方法不能访问非类成员变量。

对类成员变量,使用静态初始化块进行初始化。

注意:在静态初始化块中,不能对非类成员变量进行初始化。
但在非静态初始化块中,可以使用类成员变量和类成员方法。

初始化练习——Triangle2

package try_a_package;

public class Triangle2 {
	// 第一步,初始化
	private static int id=1;
	double a=1,b=1,c=1;
	String name="三角形";
	// 第二步,静态初始化块,仅执行一次
	static
	{
		System.out.println("静态初始化(只执行一次:id——"+id);
		id=100;
		f1();
	}
	// 第三步,执行动态初始化块
	{
		System.out.println("动态初始化:id——"+id);
		System.out.println("a="+a+",b="+b+",c="+c);
		id=id+1;
		a=10;
		b=10;
		c=10;
		f2();
	}
	
	public Triangle2()
	{
		System.out.println("构造方法:id——"+id);
		System.out.println("a="+a+",b="+b+",c="+c);
		a=100;
		b=100;
		c=100;
	}
	
	public static void f1()
	{
		System.out.println("我是类成员方法f1()!");
	}
	
	public static void f2()
	{
		System.out.println("我是类成员方法f2()!");
	}
	
	@Override
	public String toString()
	{
		return "Triangle{a="+a+",b="+b+",c="+c+",name="+name+"}";
	}
	
	public static void main(String[] args)
	{
		Triangle2 t1=new Triangle2();
		System.out.println(t1+"\n");
		Triangle2 t2=new Triangle2();
		System.out.println(t2);
	}
}

运行结果

在这里插入图片描述

变量的作用域

变量的作用域比较简单,与C++基本类似。

注意:异常处理参数变量的作用域,是catch后面的所有异常处理块。

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页