温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java中的类是什么?怎么使用类?

发布时间:2020-05-29 18:26:41 来源:亿速云 阅读:277 作者:鸽子 栏目:编程语言

 类的基本概念

  • 类是现实世界抽象为数据集合的一种表达工具,在程序中我们把类作为数据、及数据操作的容器,是一种自定义数据类型。
      
  • 类具有类型本身的属性,也具有实例属性。类变量和实例变量都叫成员变量
    ,类变量也叫静态成员变量(static修饰符标志);类方法和实例方法都叫成员方法,类方法也叫静态方法(static修饰符标志)。实例也是实际的例子,类似“int a”咱们就叫做变量a是类型int的实例化。
    静态变量和静态方法可以通过类直接访问,也可以通过对象访问。
     
  • 关于public class,这个public是为了方便能被外部的包导入引用。

  • 静态绑定在程序编译阶段决定,动态绑定在程序执行时绑定。实例变量、静态变量、静态方法、private方法、构造函数都是静态绑定,只有实例方法是动态绑定,因为Java不鼓励成员变量多态行为,实例方法都在运行时绑定,如重载:子类继承父类,相同的实例方法,参数不同,执行时候选择子类父类方法是通过参数匹配来动态选择绑定。
     
    +类加载过程如下:
    java中的类是什么?怎么使用类?

    实例变量/实例方法

  • 定一个类本身和定义一个函数类类似,类本身不会自动做什么事情,不会分配内存,也不会执行代码。方法要执行,需要被实例方法调用,首页需要初始化一个实例,这里的实例也就是对象。
       
  • 实例化一个对象后,系统会给这个实例化变量开辟两个内存空间:一个存放实际内容,一个存放实际内容的地址。如下声明后赋值,声明时会给变量确定一个存放地址的内存空间,该地址指向存储内容的首地址。因为这种变量本身不存储数据内容,只存储内容位置,我们也称为引用数据类型(上一节我们讲过)。

    Point p = new Poiont();

 

  • 如果在方法内部调用同一个类的另一个方法,就不必使用this。同样,在一个方法中如果没有局部变量和成员变量同名,那么在这个方法中使用成员变量也不必使用this。静态成员也无法使用this(因为没有实例化)。
     
    • 实例化后,如果没有给实例变量赋值,系统会自动给系统变量赋于该类型缺省值作为初始默认值(上一节基本类型提到过)。
       
       

      类的构造方法

    • 类型与构造函数名相同,没有返回值,也不能有返回值,构造函数返回值就是实例本身!
      构造函数不返回值不能加void ,构造函数必须使用public 类名(...)的形式
       
    • 一个类可以有多个构造方法,构造方法可以重载。一旦定义了构造方法,Java就不会再自动生成默认的构造方法了。构造方法有有参构造方法,还有无参构造方法。
       
    • 构造方法可以私有(private),可以用在无法实例化的类,例如:Math等工具类不需要实例化;还有一种场景是只能通过类静态方法创建类的实例,因为构造方法无法暴露在类外部,所以只能被静态类方法调用,如:单例模式只能创建一个实例。
       
    • 子类会默认继承父类的非私有成员变量和非私有成员方法,也包括构造方法(无参构造函数)。如果子类没有显示调用父类构造器,则自动调用父类的无参构造器;此时如果父类没有默认构造器,则编译器会报错。

 + 程序执行的以后父类构造方法会优先于子类执行
 

  • 最好能够为每一个类提供一个无参构造方法,以便于对该类进行扩展的时候避免错误。如下:

public class A extends B{
}

class B {
public B(String name){
System.out.println("this constructor is invoked");
}

其中A没有构造函数,实例化后编译时A会执行B的带参数构造函数,编译报错。

  • 关于super,super()。

  • super()可以用在子类调用父类的构造方法, 注意必须在构造方法内第一行代码,super ()访问无参构造函数,super (paras…)访问自定义构造函数**。
  • 也可用在子类的普通方法(相互是重载关系,不是重载也没意义,因为父类非私有成员都是可以直接被子类调用的(如果没有被覆盖))调用父类的普通方法与属性(子类与父类对应的是重写关系,没有重写关系的可以直接调用)。

子类与父类

  • 当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。
  • 当一个方法只在父类中定义时, 调用该方法时会使用父类中的属性
    如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找。
    example:

    package Temp;

    class A {
    int x = 6;
    private int y = 2;

    public A(int a) {
        x = a;
    }
    
    int getz() {
        int z;
        z = x / y;
        return z;
    }
    
    void show() {
        System.out.println("x=" + x);
        System.out.println("y=" + y);
        System.out.println("z=" + getz());
    }

    }

    class B extends A {
    int x = 3, y = 5, z;

    public B(int a) {
        super(a);
    }
    
    int getz() {
        z = x + y;
        return z;
    }

    }

    public class Temp {
    public static void main(String[] args) {
    A num1 = new A(10);
    B num2 = new B(9);
    num1.show();
    num2.show();
    }
    }

重写与重载

重写是指子类重新重新覆盖父类相同参数签名的方法,重写代码的逻辑块。
重载是指方法名相同但参数类型、个数、顺序不同,与返回值无关;调用重载方法,我们通过重载方法参数但匹配来动态绑定方法。
java中的类是什么?怎么使用类?

修饰符public/private/protect/static/final

  • public外部和内部、子类可以访问,private只能内部访问、子类内部无法直接访问,protect外部无法访问、子类内部可以访问。
  • 加入final后就不能被继承访问,加了final的方法无法重写

最后上一个 Java画图的代码

主函数如下:

import javax.swing.JFrame;
import paint.MyCanvas;
public class HelloWorld {
JFrame jFrame;
public static void main(String[] args) {
// TODO 自动生成的方法存根
HelloWorld paintMain=new HelloWorld();
paintMain.initView();
}

public void initView()
{
    jFrame =new JFrame();
    jFrame.setBounds(100, 100, 500, 500);
    jFrame.setTitle("画图测试");
    jFrame.setLayout(null);

    MyCanvas myCanvas=new MyCanvas();//画布
    myCanvas.setBounds(0,0, 500, 500);
    jFrame.add(myCanvas);
    jFrame.setVisible(true);
}

}

MyCanvas类如下:

package paint;

import java.awt.Canvas;
import java.awt.Graphics;

public class MyCanvas  extends Canvas{
@ Override
public void paint(Graphics g) {
// TODO 自动生成的方法存根
super.paint(g);//直接输入paint提示出来函数;
char[] a= {'显','示','文','字'};
g.drawChars(a, 0, 4, 50, 150);// data数组,offset为数据初始偏移量,length为要绘制的字符数,x,y文本基线的xy坐标,
g.drawString("字符测试01", 20, 20);// 注意,字符串型的x,y在字符中,而不是左上顶点;

}

}

画图函数参考

画线段:drawLine

public abstract void drawLine(int x1,int y1,int x2,int y2)
在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线
参数:
x1 - 第一个点的 x 坐标。
y1 - 第一个点的 y 坐标。
x2 - 第二个点的 x 坐标。
y2 - 第二个点的 y 坐标。

画矩形:drawRect

public void drawRect(int x,int y, int width, int height)
绘制指定矩形的边框。矩形的左边缘和右边缘分别位于 x 和 x + width。上边缘和下边缘分别位于 y 和 y + height。使用图形上下文的当前颜色绘制该矩形。

参数:
x - 要绘制矩形的 x 坐标。
y - 要绘制矩形的 y 坐标。
width - 要绘制矩形的宽度。
height - 要绘制矩形的高度。

画椭圆形:drawOval

public abstract void drawOval(int x, int y,int width, int height)

绘制椭圆的边框。得到一个圆或椭圆,它刚好能放入由 x、y、width 和 height 参数指定的矩形中。
椭圆覆盖区域的宽度为 width + 1 像素,高度为 height + 1 像素。

参数:
x - 要绘制椭圆的左上角的 x 坐标。
y - 要绘制椭圆的左上角的 y 坐标。
width - 要绘制椭圆的宽度。
height - 要绘制椭圆的高度。

画带颜色的图形:setColor

public abstract void setColor(Color c)
将此图形上下文的当前颜色设置为指定颜色。使用此图形上下文的所有后续图形操作均使用这个指定的颜色。

参数:
c - 新的呈现颜色。

画圆:drawRoundRect

public abstract void drawRoundRect(int x, int y,int width,int height,int arcWidth,int arcHeight)
用此图形上下文的当前颜色绘制圆角矩形的边框。矩形的左边缘和右边缘分别位于 x 和 x + width。矩形的上边缘和下边缘分别位于 y 和 y + height。

参数:
x - 要绘制矩形的 x 坐标。
y - 要绘制矩形的 y 坐标。
width - 要绘制矩形的宽度。
height - 要绘制矩形的高度。
arcWidth - 4 个角弧度的水平直径。
arcHeight - 4 个角弧度的垂直直径。

填充椭圆:fillOval

看看它的参数:
fillOval(int x,int y ,int width ,int  height)
前两个X 和 Y是矩形框的左上角的坐标,width和height是宽和高。

画多边形
    int px[] = { 210, 220, 270, 250, 240 };
    int py[] = { 220, 250, 300, 270, 220 };
    g.drawPolygon(px, py, px.length);
显示文字

g.drawString(String str, int x,int  y)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI