Java 面向对象 day3
Java 面向对象 day3
构造方法
一.定义
指定义在类中的一种特殊的方法,该方法没有返回值,方法名要与类名相同,可以使用参数,用于创建对象.
二.作用
完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
每一个类创建时,系统都会默认的提供一个无参构造方法.当定义带参构造方法后,系统会默认取消无参构造方法.所以需要显示定义无参构造方法
三.格式
访问修饰符 构造方法名(参数列表){
[初始化对象代码;]
}
默认构造方法
1.隐含的默认构造方法
public Car() {}
2.显示的默认构造方法
public Car() {
System.out.println("这是一个默认构造方法");
}
重载构造方法
比如原本的类里的构造方法是没有参数的,现在新建的对象是有四个参数,此时就要重载构造方法
public Car(String No,String name,String brand,double price) {
this.No = No;
this.name = name;
this.brand = brand;
this.price = price;
}
构造方法的调用
public void show() {
Car car = new Car("粤C.****", "X6", "BMW", 90);
}
方法的重载
一.定义
在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或参数类型不同,与方法的返回值无关。
二.重载的示例
public class Sum {
public static void main(String[] args) {
Sum s1 = new Sum();
System.out.println(calculate(10));
System.out.println(calculate(15,25.3));
System.out.println(calculate(23,36));
}
public static int calculate(int num1){
return num1;
}
public static int calculate(int num1,int num2){
return num1+num2;
}
public static double calculate(int num1,double num2){
return num1+num2;
}
}
方法的封装
一.定义
1.方法就是一种封装
2.关键字private也是一种封装
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。要访问该类的代码和数据,必须通过严格的接口控制。适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性,这个就是Java封装方法。
二.演示
问题描述:定义Person的年龄时候,无法阻止不合理的数值被设置进来。
解决方案:用private关键字将需要保护的成员变量进行修饰。
代码演示
Person.java
public class Person {
public int age;
public int getAge() {
return age;
}
//通过set方法保证了数据的安全
public void setAge(int age) {
if (age>0&&age<130){
this.age = age;
}else{
System.out.println("年龄输入错误,默认值为18");
this.age = 18;
}
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
'}';
}
}
PersonTest.java
import java.util.Scanner;
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
Scanner sc = new Scanner(System.in);
pc:
while (true) {
System.out.print("请输入年龄:");
//封装后,属性的赋值,只能通过set方法进行
p1.setAge(sc.nextInt());
System.out.println(p1.toString());
System.out.println("是否继续输入?");
String s1 = sc.next();
if (s1.equals("y")) {
continue;
} else {
break pc;
}
}
}
}
运行演示
请输入年龄:23
Person{age=23}
是否继续输入?
y
请输入年龄:89
Person{age=89}
是否继续输入?
y
请输入年龄:-10
年龄输入错误,默认值为18
Person{age=18}
是否继续输入?
n
三.在idea中快速定义封装方法
快捷键 Alt+Insert
选择Getter and Setter
选择需要定义的参数,点击OK,即可得到如下代码。
public class Person {
public int age;
//get方法是获取,从对象获取内容出去
public int getAge() {
return age;
}
//从外部设置一个数据到属性中
public void setAge(int age) {
this.age = age;
}
}
单例设计模式:饿汉式与懒汉式
一.单例模式的特点
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
二.饿汉式与懒汉式
1.懒汉式单例模式
public class LazyModule {
public static void main(String[] args) {
Cust cust1 = Cust.getCust();
Cust cust2 = Cust.getCust();
System.out.println(cust1 == cust2);//true
}
}
//懒汉式单例类.在第一次调用的时候实例化自己
class Cust {
static Cust cust = null;
private Cust() {
}
//静态工厂方法
public static Cust getCust() {
if (cust == null) {//判断对象是否为null值
cust = new Cust();
}
return cust;
}
}
2.饿汉式单例模式
public class HungarySingle {
//1.私有化构造器:不让外界创建实例化对象
private HungarySingle(){}
//2.在类的内部创建静态的类的对象
private static HungarySingle instance = new HungarySingle();
//提供公用的静态方法,返回类的对象
public static HungarySingle getInstance(){
return instance;
}
}
public class TestHungary {
public static void main(String[] args) {
HungarySingle h1 = HungarySingle.getInstance();
HungarySingle h2 = HungarySingle.getInstance();
//判断h1和h2是否是同一个对象
System.out.println(h1==h2);//true
}
}
static关键字
User.java
public class User {
//使用static修饰的属性,属于类属性,但是可以被对象所共享
//一般静态内容不会被设置为私有内容
private static int id;
private String name;
private String password;
public User() { }
public User(int id,String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public static int getId() {
return id;
}
public static void setId(int ids) {
id = ids;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
一.修饰成员变量/修饰成员方法
同C++是一样的概念。但是在JVM里面,JVM也会划分一个暂称静态存储区,用于存放方法的定义。实际上从更大的角度而言,它存放的是各种类的定义,当我们通过new来生成对象时,会根据这里定义的类的定义去创建对象。
TestStatic.java
public class TestStatic {
@Test
public void show() {
//以前设置的非static属性及方法都是属于对象的,必须创建对象后才可以使用
//类属性,可以直接被类使用,对数据进行共享
com.gec.project.statics.User.setId(100);
User user = new User();
user.setId(400);
user.setName("liWei");
User user1 = new User();
user1.setId(500);
user1.setName("pengpeng");
System.out.println("用户ID:"+user.getId()+" ,用户名为:"+user.getName());
System.out.println("用户1ID:"+user1.getId()+" ,用户名为:"+user1.getName());
}
}
运行结果
用户ID:500 ,用户名为:liWei
用户1ID:500 ,用户名为:pengpeng
结论:通过运行结果,可以看到 ID都为500,只保存了最后一次给ID赋的值。这是为什么呢,在内存里面发生了什么?
给ID属性加了static关键字之后,User对象就不再拥有ID属性了,ID属性会统一交给User类去管理,即多个User对象只会对应一个ID属性,一个对象如果对ID属性做了改变,其他的对象都会受到影响。
二.静态块(static{})
(1) static关键字还有一个比较关键的作用,用来形成静态代码块(static{}(即static块))以优化程序性能。
(2) static块可以置于类中的任何地方,类中可以有多个static块。
(3) 在类初次被加载的时候执行且仅会被执行一次(这是优化性能的原因!!!),会按照static块的顺序来执行每个static块,一般用来初始化静态变量和调用静态方法。
UserArray.java
public class UserArray {
public static User[] users = new User[10];
//静态代码块,在类被使用时会执行静态代码块中的内容
static {
User user = new User(1001,"zhangsan","569");
User user1 = new User(1001,"lisi","259");
User user2 = new User(1001,"wangwu","63");
User user3 = new User(1001,"zhaoliu","85");
users[0] = user;
users[1] = user1;
users[2] = user2;
users[3] = user3;
}
public void addUser(User user) {
for (int i = 0; i < users.length; i++) {
if(users[i]==null) {
users[i] = user;
break;
}
}
}
}
注意:强调一下static块是会按照顺序执行,与main入口函数无关。
TestUser.java
public class TestUser {
public static void main(String[] args) {
/*
* 对象加载的顺序,有限加载类中的内容,在进行实例化
* 类可以直接使用所有非私有的static属性及方法
*/
User[] users = UserArray.users;
for (User user : users) {
if(user!=null)
System.out.println("用户ID为:"+user.getId()+" ,用户名:"+user.getName()+" ,密码为:"+user.getPassword());
}
//不管是对象还是类,操作的是同一个元素(数组)
UserArray ua = new UserArray();
User user1 = new User(1569, "xiaoping", "123");
ua.addUser(user1);
UserArray ua1 = new UserArray();
User user2 = new User(1569, "wuhua", "123");
ua1.addUser(user2);
System.out.println("添加用户后:");
for (User user : users) {
if(user!=null)
System.out.println("用户ID为:"+user.getId()+" ,用户名:"+user.getName()+" ,密码为:"+user.getPassword());
}
}
}
运行结果
用户ID为:1001 ,用户名:zhangsan ,密码为:569
用户ID为:1001 ,用户名:lisi ,密码为:259
用户ID为:1001 ,用户名:wangwu ,密码为:63
用户ID为:1001 ,用户名:zhaoliu ,密码为:85
添加用户后:
用户ID为:1569 ,用户名:zhangsan ,密码为:569
用户ID为:1569 ,用户名:lisi ,密码为:259
用户ID为:1569 ,用户名:wangwu ,密码为:63
用户ID为:1569 ,用户名:zhaoliu ,密码为:85
用户ID为:1569 ,用户名:xiaoping ,密码为:123
用户ID为:1569 ,用户名:wuhua ,密码为:123
总结
以上就是今日要分享的内容,其中包括对构造方法的理解,方法的封装与重载的使用,简单介绍了单例模式,深入了解了static关键字。希望这些内容可以为你们学习Java提供一点帮助。