Java学习笔记11_类与对象详解(一)_20200331

第11章 类与对象详解(一)

01 练习

  1. 1
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    tips:
    快捷键Alt + Shift + s -->Generate Constructor using Fields

    Generate Constructor using Fields
    直译:使用字段生成构造

1.2.

class Circle {
	double radius;
	//按住Alt + Shift + S
	public Circle(double aRadius) {
		super();
		radius = aRadius;
	}
	
	public double getArea() {
		return Math.PI  * radius * radius;
//		return radius;		
	}
}

public class Day091 {
	public static void main(String[] args) {
		Circle c = new Circle(3.0);
		System.out.println(c.getArea());
				
		Circle c2 = new Circle(2.0);
		System.out.println(c2.getArea());		
	}
}

在这里插入图片描述

02 this关键字

2.1

class Animal {
	String name;
	int age;
	//aName,aAge是显示参数
	//每个构造器都有一个隐式参数this
	public Animal(String aName,int aAge){
		name = aName;
		age = aAge;
		
	}
	
	public void say(){
		System.out.println("我叫"  + name);
		System.out.println("我今年" + age + "岁了");
		
	}
}
public class Da092 {
	public static void main(String[] args) {
		Animal a1 = new Animal("pet", 2);
		a1.say();
		
	}
}

在这里插入图片描述

2.2

class Animal {
	String name;
	int age;
	//aName,aAge是显示参数
//	public Animal(String aName,int aAge){
//		name = aName;
//		age = aAge;
//		
//	}
	
	//aName,aAge是显示参数
	//每个构造器都有一个隐式参数this
	//this代表当前被创建的对象
	public Animal(String aName,int aAge){
//		name = aName;
//		age = aAge;
		this.name = aName;
		this.age = aAge;
		System.out.println(this); //地址
		
		
		
	}
	
	public void say(){
		System.out.println("我叫"  + name);
		System.out.println("我今年" + age + "岁了");
		
	}
}
public class Da092 {
	public static void main(String[] args) {
		Animal a1 = new Animal("pet", 2);
		System.out.println(a1); //地址
		a1.say();
		
	}
}

在这里插入图片描述

2.3

例2.3.1

class Animal {
	String name;
	int age;
	//aName,aAge是显示参数
//	public Animal(String aName,int aAge){
//		name = aName;
//		age = aAge;
//		
//	}
	
	//aName,aAge是显示参数
	//每个构造器都有一个隐式参数this
	//this代表当前被创建的对象
	public Animal(String aName,int aAge){
//		name = aName;
//		age = aAge;
		this.name = aName;
		this.age = aAge;
		System.out.println(this); //地址		
	}
	
	public void say(){
		System.out.println("我叫"  + name);
		System.out.println("我今年" + age + "岁了");		
	}
}

public class Da092 {
	public static void main(String[] args) {
		Animal a1 = new Animal("pet", 2);
		System.out.println(a1); //地址
		a1.say();		
		
		Animal a2 = new Animal("kitty",3);
		System.out.println(a1); //地址
		a2.say();			
	}	
}

在这里插入图片描述

例2.3.2

class Animal {
	String name;
	int age;
	//aName,aAge是显示参数
//	public Animal(String aName,int aAge){
//		name = aName;
//		age = aAge;
//		
//	}
	
	//aName,aAge是显示参数
	//每个构造器都有一个隐式参数this
	//this代表当前被创建的对象
	public Animal(String name,int age){
//		name = aName;
//		age = aAge;
		this.name = name;
		this.age = age;
		System.out.println(this); //地址		
	}
	
		
	//在实例方法中, this代表调用此方法的对象
	public void say(){
		System.out.println("我叫"  + this.name);
		System.out.println("我今年" + this.age + "岁了");		
	}
}

public class Da092 {
	public static void main(String[] args) {
		Animal a1 = new Animal("pet", 2);
		System.out.println(a1); //地址
		a1.say();		
		
		Animal a2 = new Animal("kitty",3);
		System.out.println(a1); //地址
		a2.say();			
	}	
}

在这里插入图片描述

例2.3.3

class Animal {
	String name;
	int age;
	
	public Animal(){
		
	}
	
	public Animal(String name){
		this.name = name;
		
	}
	
	//使用this关键字,构造器可以调用其他构造器
	public Animal(String name,int age){
		this(name); //调用上面的构造器
		this.name = name;	
	}
	
		
	//在实例方法中, this代表调用此方法的对象
	public void say(){
		System.out.println("我叫"  + this.name);
		System.out.println("我今年" + this.age + "岁了");		
	}
}

public class Da092 {
	public static void main(String[] args) {
		Animal a1 = new Animal("pet", 2);
		System.out.println(a1); //地址
		a1.say();		
		
		Animal a2 = new Animal("kitty",3);
		System.out.println(a1); //地址
		a2.say();			
	}	
}

在这里插入图片描述

每个实例方法和构造器都有一个隐式参数this
在实例方法中this代表调用此方法的对象,在构造器中this代表当前被创建的对象。
使用this关键字,构造器可以调用其他构造器。
 

03 包和导入

java标准库中有很多类。这些类按照功能被划分为不同的包下。
java.lang包(java最基础的类)
java.util包(java工具类)
java.net包(网络相关的类)

Arrays类在java.util包下,那么Arrays类的全名就叫做java.util.Arrays。

3.1

import java.util.Arrays;
//快捷导入包ctrl+shift+o

public class Dday093 {
	public static void main(String[] args) {
		int[] arr = new int[10];
		Arrays.fill(arr, 1);
		for (int i : arr) {
			System.out.println(i);
		}
		
	}

}
 

在这里插入图片描述
tips:
//快捷导入包ctrl+shift+o


3.2

java中,每个一类都必须有唯一的名字,为类命名就很麻烦。
包类似于文件夹,将类放在不同的包下,就可以避免命名冲突。
例如:
创建一个包:com.abc ,(全名为: com.abc.Foo)
再创建一个包:com.bbc (全名为:com.bbc.Foo)
再这两个包下分别创建一个Foo.java的class
这是可行的。

包一般是域名的倒置。

在这里插入图片描述

***查看工作空间
1.包类,单右,点选最下一项:Properties
2.查看 工作空间 地址 Location
ep:
D:\develop\eclipse-jee-mars-2-win32\workspace
D:\develop\eclipse-jee-mars-2-win32\workspace\Day09\src
在这里插入图片描述
tips:

  1. 打开eclipse type

04 访问权限修饰符

类的访问权限

类可以使用public修饰,指示这个类是公有的,可以被其他类访问(包括同一个包下的类和不同包下的类)。
如果类没有写public,那么它是包访问权限,只能被同一外包下的类访问。

成员变量和成员方法的访问权限

成员变量和成员方法有四种访问权限:
默认的(包访问权限)
public(公有的)
private(私有的)
protected(受保护的)

在这里插入图片描述

在这里插入图片描述


例一:

  1. 创建一个类,名为:Foo.java;
    其所在包: com.abc
//包名com.abc.指示这个类位于com.abc包下
//注意必须和物理文件层次匹配
package com.abc; 


//包访问权限
public class Foo {
	int defaultV;
	public int publicV;
	private int privateV;
	protected int protectedV;

	void defaultF() {
	}

	public void publicF() {
	}

	private void privateF() {
	}

	protected void protectedF() {
	}
		
}
  1. 创建另一个类,名为: Day094.java
    其所在包: com.bbc
package com.bbc;

import com.abc.Foo;


public class Day094 {
	public static void main(String[] args){
		Foo f = new Foo();
		System.out.println(f.publicV);
		f.publicF();
		
		System.out.println(f.privateV);
		System.out.println(f.protectedV);
		System.out.println(f.defaultV);
				
	}

}

在这里插入图片描述
在这里插入图片描述
***可以看到
private
protected
default
都不能访问。


不适用访问权限修饰符,即为默认的访问权限,可以被同一个包下的其他类访问。

使用public修饰符,可以被任何类访问。

使用private修饰,只能在其声明的类中访问。

使用protected修饰,可以被其子类访问,包括同一包下的和不同包下的子类。还可以被同一个包下的无关类访问。

在这里插入图片描述


tips:
open type ctrl+shift+T

05 数据封装

对象包括状态和行为。对象将状态存储在实例变量中,并通过方法公开其行为,
方法对对象的内部状态进行操作,并作为对象到对象通信的主要机制。
隐藏内部状态并要求对象的方法执行所有交互称为数据封装,这是面向对象编程的基本原则。

在这里插入图片描述

tips:
Generate Constructor using Fields
直译:使用字段产生构造

例一:

1)创建Person类


public class Person {
	//对所有的实例变量使用private
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public void info() {
		System.out.println("我叫" + name);
		System.out.println("我今年" + age + "岁了");
		
	}

在这里插入图片描述
2) 创建主类


public class Day095 {
	public static void main(String[] args) {
		Person p = new Person("张三风", 20);
		p.info();	
	}
}


---------------  Console---------------------
我叫张三风
我今年20岁了

在这里插入图片描述

3.) 封装起来
Person类不改变;
主类:


public class Day095 {
	public static void main(String[] args) {
		Person p = new Person("张三风", 20);
		p.info();
		
		//p.name = "李四四";
		//封装起来
		p.setName("李四四");
		p.setAge(23);
		p.info();	
	}
}
 

在这里插入图片描述

封装的作用

例如,年龄,如果不进行数据封装,修改如下后,会发现年龄可为非法数据。
1)Person类中改为:去掉age前的privae

public class Person {
	//对所有的实例变量使用private
	private String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	public void info() {
		System.out.println("我叫" + name);
		System.out.println("我今年" + age + "岁了");
		
	}	
}

2 ) 主类
改: 添加 p.age = -1;
在这里插入图片描述
结果运行,发现年龄可为 -1 。

正确的封装例子

1 ) Person类

public class Person {
	//对所有的实例变量使用private,进行数据封装
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	//使用数据封装来限制年龄范围
//	public void setAge(int age) {
//		if (this.age <= 0 || this.age > 150) {
//			System.out.println("非法的年龄");
//		} else {
//			this.age = age;
//		}
//	}
		
	public void setAge(int age) {
		if (age <= 0 || age > 150) {
			System.out.println("非法的年龄");
		} else {
			this.age = age;
		}
	}
	
	public void info() {
//		System.out.println("我叫" + name); == System.out.println("我叫" + this.name); 一样
//		System.out.println("我今年" + age + "岁了"); == System.out.println("我今年" + this.age + "岁了");一样
		System.out.println("我叫" + this.name);
		System.out.println("我今年" + this.age + "岁了");		
	}	
}

在这里插入图片描述
2 ) 主类

public class Day095 {
	public static void main(String[] args) {
		Person p = new Person("张三风", 20);
		p.info();
		
//		p.name = "李四四";
		p.setName("李四四");
		p.setAge(23);
//		p.age = -1;
		p.setAge(-1);
		p.info();
		
	}
}
 

在这里插入图片描述

数据封装:对所有的实例变量使用private,并且提供getter和setter方法。避免外部直接访问和修改实例变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值