首页 > 编程语言 >Java拾贝第二天——面向对象

Java拾贝第二天——面向对象

时间:2023-10-15 22:35:58浏览次数:22  
标签:p1 Java 拾贝 Person age 面向对象 String public name

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

特性

封装性,继承性,多态性。

类的组成

public class 类名 {
//数据类型 属性名;
    int age;//成员变量

    public 返回值类型 方法名(传参) {
	String name;//局部变量
	//方法体
    }
}

其中定义在类中的属性名也就是变量名,也叫字段名,也叫成员变量 有本事名字再多一点
若定义在方法中的属性称之为局部变量。

简单的栗子

public class Person {
    String name;
    int age;
    public void tell() {
        System.out.println("嘟嘟嘟~"+name+","+age);
    }
}
//你知道Person类中包含哪些内容吗?

面向对象的概念

可以把对象当作待涂鸦的纯白雕塑,其模板是固定的。
更多的内容需要后续进行加工补充。

继续用上述Person类举例,现在创建对象并且使用它(也叫实例化)

//类名 变量名=new 类名();

public class test2 {
    public static void main(String[] args) {
        Person p =new Person();//实例化一个对象p
    }
}
class Person{
    String name;
    int age;
    public  void tell() {
        System.out.println("嘟嘟嘟~"+name+","+age);
    }
}

现在已经实例化成功了,执行一下tell方法

要使用对象访问其属性值或方法操作如下
对象名.属性名;
对象名.方法名();

public static void main(String[] args) {
        Person p =new Person();
        p.tell();
    }
//嘟嘟嘟~null,0

调用成功了,打印结果有null和0的原因是还没有给变量赋值,所以输出的是属性的默认值
现在需要修改其属性值使输出不再使用默认值。

public static void main(String[] args) {
        Person p =new Person();
        p.name="张三";
        p.age=18;
        p.tell();
    }
//嘟嘟嘟~张三,18

创建多个对象

public class test2 {
    public static void main(String[] args) {
        Person p1 =new Person();
        p1.name="张三";
        p1.age=18;
        p1.tell();

        Person p2 =new Person();
        p2.name="李四";
        p2.age=19;
        p2.tell();
    }
}
class Person{
    String name;
    int age;
    public  void tell() {
        System.out.println("嘟嘟嘟~"+name+","+age);
    }
}
/*
嘟嘟嘟~张三,18
嘟嘟嘟~李四,19
*/

p1和p2各拿了一个雕像进行涂鸦,所以不会影响到彼此的内容

现在把p1赋值给p2,让其操作的是一个雕像然后进行修改内容。

 public static void main(String[] args) {
        Person p1 =new Person();
        p1.name="张三";
        p1.age=18;
        p1.tell();

        Person p2 =p1;
        p2.age=19;
        p2.tell();
    }
/*
嘟嘟嘟~张三,18
嘟嘟嘟~张三,19
*/

从结果上看p2成功修改了p1的一部分涂鸦,让其沾上了自己的颜色!
上述栗子其实是所谓的引用传递

各拿一个雕像进行涂鸦的时候。其实就是堆内存中开辟了两个空间,然后栈内存中p1和p2各指向一个空间。
image

p2操作p1雕像的时候。其实就是堆内存中开辟了一个空间,然后栈内存中的p1指向唯一的空间,p2也指向唯一的空间。所以会导致p2成功涂鸦p1的雕像
image

//有时候也会有特殊情况
 Person p2 = new Person();
        p2.name = "李四";
        p2.age = 19;
        p2 = p1;

原本p2好好的结果突然指向了p1的雕像,这就会导致p2原来的空间形成垃圾空间。
垃圾空间会等待Java本身提供的垃圾回收机制(GC)来释放空间。

因为一个栈内存空间只能指向一个堆内存空间。

封装性

面向对象的第一大特性,封装即包装好。使得外部不可见
在上面的栗子中Person类的成员属性可以被任意的访问并修改。封装就可以保护好类中的属性。

要封装属性或方法操作如下
private 数据类型 属性名;
private 返回值类型 方法名(传参){};

是的没错只需要在属性或方法前加上私有的访问修饰符即可封装。试一试

public class test2 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.name = "张三";
        p1.age = 18;
        p1.tell();
    }
}

class Person {
    private String name;
    private int age;

    public void tell() {
        System.out.println("嘟嘟嘟~" + name + "," + age);
    }
}
//报错,甚至编译都无法通过,那么对象p1该怎么去访问属性呢?

在封装完毕的情况下,要怎么去访问属性或者方法呢?
为了解决属性必须封装又必须访问的矛盾,在Java开发中有明确的定义:
“只要是被封装的属性,必须通过getter和settter方法修改和访问”

加上getter和setter方法

public class test2 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("张三");//setter方法
        p1.setAge(18);
        p1.tell();

    }
}

//this关键字用于访问成员变量
class Person {
    private String name;//成员变量
    private int age;

    public void tell() {
        System.out.println("嘟嘟嘟~" + this.name + "," + this.age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {//this.name为成员变量 name为局部变量
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
/*
嘟嘟嘟~张三,18
*/

另外this还可以访问本类中的方法

this.方法名(传参);

public class test2 {
    public static void main(String[] args) {
        Person p1 = new Person();
        p1.setName("张三");//setter方法
        p1.setAge(18);
        p1.tell();
		 p1.say();
    }
}

//this关键字用于访问本类中的方法
class Person {
    private String name;//成员变量
    private int age;

    public void tell() {
        System.out.println("嘟嘟嘟~" + this.name + "," + this.age);
    }

    public void say() {
        this.tell();
    }
	//getter和setter
}
/*
嘟嘟嘟~张三,18
嘟嘟嘟~张三,18
*/

需要实例化的对象一多,不可能我每个都去setter一下吧?构造方法由此诞生!

构造方法

构造方法主要作用是初始化类中的属性。

  • 构造方法必须和类名相同
  • 构造方法不能有任何返回值类型(包括void)
  • 构造方法不能有return语句。
构造方法格式如下
访问修饰符 构造方法名(传参){
//方法体
};

举个栗子

public class test2 {
    public static void main(String[] args) {
        Person p1 = new Person("张三",18);//调用构造方法进行对象(实例)初始化
        p1.say();
    }
}
class Person {
    private String name;
    private int age;

    public Person() {//无参构造方法
    }

    public Person(String name, int age) {//有参构造方法
        this.name = name;
        this.age = age;
    }
    public Person(String name) {//构造方法的重载
        this.name = name;
    }

    public void tell() {
        System.out.println("嘟嘟嘟~" + this.name + "," + this.age);
    }
	//getter和setter
/*
嘟嘟嘟~张三,18
*/

一类个中通常包括一个默认生成的无参构造方法。
其中,如果定义了有参的构造方法必须显性定义无参构造方法

标签:p1,Java,拾贝,Person,age,面向对象,String,public,name
From: https://www.cnblogs.com/Ocraft/p/17766166.html

相关文章

  • Java继承的利弊和使用原则
    继承是一种提高程序代码的可重用性、以及提高系统的可扩展性的有效手段。但是,如果继承树非常复杂、或者随便扩展本来不是专门为继承而设计的类,反而会削弱系统的可扩展性和可维护性。1.继承树的层次不可太多继承树(不考虑最顶层的Object类)的层次应该尽量保持在两到三层。如果继承树......
  • JAVA - 记录
    有时,数据就是数据,而面向对象程序设计提供的数据隐藏有些碍事,考虑一个类,这个类描述平面上的一个点,有下x和y坐标packagecom.demo;publicclassPonint{privatefinaldoublex;privatefinaldoubley;publicPonint(doublex,doubley){this.x=x......
  • 单例模式--Java实现
    画类图具体代码实现//StudentNo.javapackageorg.example.design005;publicclassStudentNo{privatestaticStudentNoinstance=null;privateStudentNo(){}publicstaticStudentNogetInstance(){if(instance==null){System.ou......
  • Java 数组与List转换
    示例@Testvoidstr2arr(){Stringids="1,2,3,4,5,6";//字符串-->String数组String[]arrayStr=ids.split(",");System.out.println(arrayStr);}@Testvoidlist2Str(){List<......
  • java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest no
    完整的报错信息java.lang.TypeNotPresentException:Typejavax.servlet.http.HttpServletRequestnotpresent atjava.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117)~[na:na] atjava.base/sun.reflect.generics......
  • 用Java语言简单实现MQ消息队列服务
    大致的结构:一个消息队列大致的结构:消息处理中心Brokerpackagecom.tntxia;importjava.util.concurrent.ArrayBlockingQueue;/***消息处理中心*/publicclassBroker{//队列存储消息的最大数量privatefinalstaticintMAX_SIZE=3;//保存消息数据......
  • java线程
    Java虚拟机(JVM,是运行所有Java程序的抽象计算机,是Java语言的运行环境)允许应用程序并发地运行多个线程。在Java语言中,多线程的实现一般有以下三种方法:1、实现Runnable接口,并实现该接口的run()方法。①自定义类并实现Runnable接口,实现run()方法。②创建Thread对象,用实现Ru......
  • 《Head First JavaScript程序设计》高清高质量 原版电子书PDF+源码
    下载:https://pan.quark.cn/s/9b368a216582......
  • 原型模式--Java实现
    画类图浅克隆:深克隆:具体代码实现浅克隆具体代码://Vector.javapackageorg.example.design004;importjava.lang.reflect.Array;importjava.util.Arrays;publicclassVectorimplementsCloneable{publicint[]getArray(){returnarray;}......
  • 2023_10_15_DAY_01_JAVA_SE_Java基础知识_下_流程控制语句
    2023_10_15_DAY_01_JAVA_SE_Java基础知识_下_流程控制语句分支【选择】结构if语句if(表达式){ 执行语句块;}//if语句的代码执行过程为:如果条件表达式返回真值,则执行功能代码块中的语句;//如果条件表达式返回值为假,则不执行功能代码块。语法说明:if是该语句中的关键字,后......