第十三天 面向对象-final&static&匿名对象&内部类&包&代码块【悟空教程】
第13天 面向对象
第1章面向对象其他知识点
1.1final与static关键字
1.1.1final关键字
1.1.1.1final概念
继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。可是当子类继承了这些特殊类之后,就可以对其中的方法进行重写,那怎么解决呢?
要解决上述的这些问题,需要使用到一个关键字final,final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。
1.1.1.2final的特点
final修饰类不可以被继承,但是可以继承其他类。
classYy {}
finalclassFu extendsYy{} //可以继承Yy类
classZi extendsFu{} //不能继承Fu类
final修饰的方法不可以被覆盖,但父类中没有被final修饰方法,子类覆盖后可以加final。
classFu {
// final修饰的方法,不可以被覆盖,但可以继承使用
publicfinalvoidmethod1(){}
publicvoidmethod2(){}
}
classZi extendsFu {
//重写method2方法
publicfinalvoidmethod2(){}
}
final修饰的变量称为常量,这些变量只能赋值一次。
finalinti= 20;
i= 30; //赋值报错,final修饰的变量只能赋值一次
引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。
finalPerson p= newPerson();
Person p2= newPerson();
p= p2; //final修饰的变量p,所记录的地址值不能改变
p.name= "小明";//可以更改p对象中name属性值
p不能为别的对象,而p对象中的name或age属性值可更改。
修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
classDemo {
//直接赋值
finalintm= 100;
//final修饰的成员变量,需要在创建对象前赋值,否则报错。
finalintn;
publicDemo(){
//可以在创建对象时所调用的构造方法中,为变量n赋值
n= ;
}
}
1.1.1.3final注意事项
引用类型的变量值为对象地址值,地址值不能更改,但是地址内内容可以修改。
如:
final Person p = new Person();
p不能为别的对象,而p对象中的name或age可更改。
修饰成员变量,需要在创建对象前赋值,否则报错。(当没有显式赋值时,多个构造方法的均需要为其赋值。)
//final修饰类不能继承
public /*final*/ class Person {
//修饰成员变量,需要在创建对象前赋值,否则报错
private final String name;
//需要在创建对象前赋值
public Person(){
this.name = "";
}
//用带参构造方法为name赋值
public Person(String name){
this.name = name;
}
//final修饰的方法不能被重写
public /* final*/ void method(){
System.out.println("父类方法");
}
public String getName() {
return name;
}
//public void setName(String name) {
//final修饰的变量不能2次赋值
//this.name = name;
//}
}
public class Student extends Person{
@Override
public void method(){
System.out.println("子类方法");
}
}
/*
* final 最终修饰符
*
* 修饰类代表类不能被继承
* 修饰方法不能被重写
* 修饰变量 不能被二次赋值,是 常量
*/
public class Test {
public static void main(String[] args) {
//修饰变量 不能被二次赋值,是 常量
//final int a = 10;
final double PI = 3.141592653589;
System.out.println(PI*2);
final Person p = new Person();//0x1111
//p.setName("柳岩");
//p.setName("金莲");
System.out.println(p.getName());
//引用类型的变量值为对象地址值,地址值不能更改,但是地址内内容可以修改。
//p = new Person();//0x1234
}
}
1.1.2static关键字
1.1.2.1static概念与功能;
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法又调用不了,这时就会想,那么我们能不能不创建对象,就可以调用方法呢?
可以的,我们可以通过static关键字来实现。static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个这个类的某个对象。
被static修饰的成员可以并且建议通过类名直接访问。也可以通过某个对象访问到属于类的静态成员,多个对象共享使用同一个静态成员。
1.1.2.2static特点:
static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于单个这个类的某个对象。
static修饰的成员被多个对象共享。
static修饰的成员属于类,但是会影响每一个对象。
被static修饰的成员又叫类成员,不叫对象的成员。
如下例中国籍变量,所有中国人国籍均应该为中国,不应各自定义各自的国籍,所以可以将国籍定义为static,属于类,被多个对象共享。
1.1.2.3static注意事项
静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
同一个类中,静态成员只能访问静态成员
main方法为静态方法仅仅为程序入口,不属于任何一个对象,所以可以定义在任意类中。
1.1.2.4static修饰后成员的使用
被static修饰的成员可以并且建议通过类名直接访问。也可以通过某个对象访到属于类的静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员。
格式:
类名.静态成员变量名
类名.静态成员方法名(参数)
对象名.静态成员变量名 ------不建议,出现警告
对象名.静态成员方法名(参数) ------不建议,出现警告
代码演示:
classDemo {
//静态成员变量
publicstaticintnum= 100;
//静态方法
publicstaticvoidmethod(){
System.out.println("静态方法");
}
}
classTest {
publicstaticvoidmain(String[] args) {
System.out.println(Demo.num);
Demo.method();
}
}
1.1.3static与final连用定义静态常量
通常使用public static final来修饰某个类中的静态常量。此时标识符用全部大写,多个单词使用下划线连接。
格式: 类名.静态成员变量名
如:
定义包含静态成员的的类。
public class Company{
public static final String COMPANY_NAME = “顺风通不通快递公司”;
public static void method(){
System.out.println(“一个静态方法”);
}
}
使用类的静态成员不需要创建对象,直接使用类名即可。
System.out.println(Company. companyName); //打印顺风通不通快递公司
Company.method(); //调用一个静态方法
接口中的每个成员变量都默认使用public static final修饰,所有接口中的成员变量都是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
/*
* 被static修饰的成员属于类,不属于单个这个类的某个对象。
*/
public class Person {
static int age;
private String name;
//ctrl+shift+x,y大小写切换
public static final String ADDRESS ="中国";
// 静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
public static void method(){
//System.out.println(ADDRESS);
System.out.println("我是一个静态方法");
System.out.println(age);
//不能使用this/super
//System.out.println(this.age);
//静态只能访问静态 不能用已存在的去访问还没出现的 静态内容优于对象存在
//System.out.println(name);
}
//main方法为静态方法仅仅为程序入口,不属于任何一个对象,所以可以定义在任意类中。
public static void main(String[] args){
method();
}
}
/*
* static静态修饰符
*
* 格式:
* 类名.静态成员变量名
* 类名.静态成员方法名(参数)
* 对象名.静态成员变量名 ------不建议,出现警告
* 对象名.静态成员方法名(参数) ------不建议,出现警告
*/
public class Test {
public static void main(String[] args) {
// System.out.println(Person.age);
//
// Person.method();
Person p = new Person();
p.age = 18;
System.out.println(p.age);
Person p2 = new Person();
System.out.println(p2.age);
System.out.println(Person.ADDRESS);
}
}
1.2匿名对象
1.2.1匿名对象的概念
匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。
如:已经存在的类:
public class Person{
public void eat(){
System.out.println();
}
}
创建一个普通对象
Person p = new Person();
创建一个匿名对象
new Person();
1.2.2匿名对象的特点
创建匿名对象直接使用,没有变量名。
new Person().eat() //eat方法被一个没有名字的Person对象调用了。
匿名对象在没有指定其引用变量时,只能使用一次。
new Person().eat(); 创建一个匿名对象,调用eat方法
new Person().eat(); 想再次调用eat方法,重新创建了一个匿名对象
匿名对象可以作为方法接收的参数、方法返回值使用(使用可以在任意位置)
classDemo {
publicstaticPerson getPerson(){
//普通方式
//Person p = new Person();
//return p;
//匿名对象作为方法返回值
returnnewPerson();
}
publicstaticvoidmethod(Person p){}
}
classTest {
publicstaticvoidmain(String[] args) {
//调用getPerson方法,得到一个Person对象
Person person= Demo.getPerson();
//调用method方法
Demo.method(person);
//匿名对象作为方法接收的参数
Demo.method(newPerson());
}
}
1.3内部类
1.3.1内部类概念
什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。
什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。
class 汽车 { //外部类
class 发动机 { //内部类
}
}
内部类的分类
内部类分为成员内部类与局部内部类。
我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。
1.3.2成员内部类
成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
成员内部类代码演示
定义类
class Body {//外部类,身体
private boolean life= true; //生命状态
public class Heart { //内部类,心脏
public void jump() {
System.out.println("心脏噗通噗通的跳")
System.out.println("生命状态" + life); //访问外部类成员变量
}
}
}
访问内部类
public static void main(String[] args) {
//创建内部类对象
Body.Heart bh = new Body().new Heart();
//调用内部类中的方法
bh.jump();
}
1.3.3局部内部类
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
访问方式
在外部类方法中,创建内部类对象,进行访问
局部内部类代码演示
定义类
class Party {//外部类,聚会
public void puffBall(){// 吹气球方法
class Ball {// 内部类,气球
public void puff(){
System.out.println("气球膨胀了");
}
}
//创建内部类对象,调用puff方法
new Ball().puff();
}
}
访问内部类
public static void main(String[] args) {
//创建外部类对象
Party p = new Party();
//调用外部类中的puffBall方法
p.puffBall();
}
/*
* 内部类
* 内部类分成员内部类和局部内部类
*/
public class Outer {
private String name = "外部名字";
/*
* 成员内部类
*/
class Inner{
public void method(){
System.out.println(name);
}
}
public void outMethod(){
/*
* 局部内部类
*/
class Inner2{
public void method(){
System.out.println(name);
}
}
//创建局部内部类对象
Inner2 in = new Inner2();
in.method();
}
}
/*
* 测试成员内部类创建对象
*/
public class Test {
public static void main(String[] args) {
//创建成员内部类对象
Outer.Inner in = new Outer().new Inner();
//调用成员内部类方法
in.method();
System.out.println("-----------");
Outer out = new Outer();
out.outMethod();
}
}
1.3.4内部类的实际使用——匿名内部类
1.3.4.1匿名内部类概念
内部类是为了应对更为复杂的类间关系。我们在完成计算机语言相对底层的位置才会涉及,日常业务中很难遇到,这里不做赘述。
最常用到的内部类就是匿名内部类,是局部内部类的一种。
匿名内部类有两个步骤:
临时定义一个类型的子类
定义后即刻创建刚刚定义的这个类的对象
1.3.4.2匿名内部类作用与格式
作用:匿名内部类是创建某个类型子类对象的快捷方式。
格式:
new 父类或接口(){
//进行方法重写
};
代码演示
//已经存在的父类:
public abstract class Person{
public abstract void eat();
}
//定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
Person p = new Person(){
public void eat() {
System.out.println(“我吃了”);
}
};
//调用eat方法
p.eat();
使用匿名对象的方式,将定义子类与创建子类对象两个步骤由一个格式一次完成,。虽然是两个步骤,但是两个步骤是连在一起完成的。
匿名内部类如果不定义变量引用,则也是匿名对象。代码如下:
new Person(){
public void eat() {
System.out.println(“我吃了”);
}
}.eat();
/*
* 定义Fly接口
*/
public interface Fly {
public abstract void open();
public abstract void fly();
public abstract void close();
}
public class YanZi implements Fly{
@Override
public void open() {
System.out.println("张开小翅膀");
}
@Override
public void fly() {
System.out.println("能飞3000米高空");
}
@Override
public void close() {
System.out.println("关闭小翅膀,安全着陆");
}
//一个类中可以定义多个类,但只能有一个类public的
class Person(){
}
}
/*
* 匿名内部类
*
* new 父类/接口(){
* //重写需要重写的方法
* };
*/
public class Test {
public static void main(String[] args) {
Fly yz = new YanZi();
yz.open();
yz.fly();
yz.close();
new YanZi().open();
System.out.println("-------------------");
//实现类对象赋值给父接口
Fly fj = new Fly(){
@Override
public void open() {
System.out.println("不需要张开翅膀,一直都是张开状态");
}
@Override
public void fly() {
System.out.println("喷气式助力飞行!");
}
@Override
public void close() {
System.out.println("不需要关闭翅膀,得哪撞哪");
}
};
fj.open();
fj.fly();
fj.close();
System.out.println("-----------------------------");
//实现类对象直接以匿名对象的方式调用方法
new Fly() {
@Override
public void open() {
System.out.println("小翅膀");
}
@Override
public void fly() {
System.out.println("乱飞");
}
@Override
public void close() {
System.out.println("各种撞树");
}
}.fly();
}
}
1.4包
1.4.1包的概念
java的包,其实就是我们电脑系统中的文件夹,包里存放的是程序生成的.class文件。
当.class文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理,分包管理是组织软件项目结构的基本方式。
在项目中,我们将相同功能的类放到一个包中,方便管理。并且日常项目的分工也是以包作为边界。
类中声明的包必须与实际class文件所在的文件夹情况相一致,即类声明在a包下,则生成的.class文件必须在a文件夹下,否则,程序运行时会找不到类。
1.4.2包的定义格式
通常使用公司网址反写,可以有多层包,包名采用全部小写字母,多层包之间用”.”连接
类中包的声明格式:
package 包名.包名.包名…;
如:Java帮帮官网网址那么网址反写就为.javahelp
注意:声明包的语句,必须写在程序有效代码的第一行(注释不算)
代码演示:
.javahelp; //包的声明,必须在有效代码的第一行
import java.util.Scanner;
import java.util.Random;
public class Demo {}
1.4.3包的访问
在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)。
包名.包名….类名
如: java.util.Scanner
java.util.Random
.javahelp.Demo
带有包的类,创建对象格式:包名.类名 变量名 = new包名.类名();
.javahelp.Demo d = new .javahelp.Demo();
前提:包的访问与访问权限密切相关,这里以一般情况来说,即类用public修饰的情况。
类的简化访问
当我们要使用一个类时,这个类与当前程序在同一个包中(即同一个文件夹中),或者这个类是java.lang包中的类时通常可以省略掉包名,直接使用该类。
如:cn.itcast包中有两个类,PersonTest类,与Person类。我们在PersonTest类中,访问Person类时,由于是同一个包下,访问时可以省略包名,即直接通过类名访问 Person。
类名 变量名 = new类名();
Person p = new Person();
当我们要使用的类,与当前程序不在同一个包中(即不同文件夹中),要访问的类必须用public修饰才可访问。
package .javahelp02;
public class Person {}
/*
* 用public修饰的类 可以在其他包中访问 使用默认权限修饰的类 只能在本包下访问 其他包无法访问
*/
public class Tree {
public void chengLiang(){
System.out.println("可以乘凉");
}
}
import .javahelp.Person;
public class Test {
public static void main(String[] args) {
//在访问类时,为了能够找到该类,使用类时,应该使用 包含 包 的类全名。
// cn.itcast.Person p = new cn.itcast.Person();
// p.eat();
// cn.itcast6.Tree t = new cn.itcast6.Tree();
//当在同一个文件夹下不需要使用类全名
// Tree t = new Tree();
// t.chengLiang();
//因为String在java.lang包下 所以不需要使用类全名不需要导包
// String s = "";
//当被使用的类与使用的类不在同一个文件夹下时,
//被使用者必须用public修饰才可被其他包下的类访问,
//我们可以通过导包的方式使用该类,避免使用类全名
Person p = new Person();
//当多个文件夹下有相同的类名时,只能有一个导包使用,其他必须仍然书写全名。
cn.itcast2.Person p2 = new cn.itcast2.Person();
}
}
1.4.4import导包
我们每次使用类时,都需要写很长的包名。很麻烦,我们可以通过import导包的方式来简化。
可以通过导包的方式使用该类,可以避免使用全类名编写(即,包类.类名)。
导包的格式:
import 包名.类名;
当程序导入指定的包后,使用类时,就可以简化了。演示如下
//导入包前的方式
//创建对象
java.util.Random r1 = new java.util.Random();
java.util.Random r2 = new java.util.Random();
java.util.Scanner sc1 = new java.util.Scanner(System.in);
java.util.Scanner sc2 = new java.util.Scanner(System.in);
//导入包后的方式
import java.util.Random;
import java.util.Scanner;
//创建对象
Random r1 = new Random();
Random r2 = new Random();
Scanner sc1 = new Scanner(System.in);
Scanner sc2 = new Scanner(System.in);
import导包代码书写的位置:在声明包package后,定义所有类class前,使用导包import包名.包名.类名;
1.4.5访问权限
在Java中提供了四种访问权限,使用不同的访问权限时,被修饰的内容会有不同的访问权限,以下表来说明不同权限的访问能力:
public
protected受保护的
default默认
private私有的
同一类中
√
√
√
√
同一包中(子类与无关类)
√
√
√
不同包的子类
√
√
不同包中的无关类
√
所以,在日常开发过程中,如果允许其他包的类访问使用public,如果仅允许其他包的子类访问使用protected,仅本包内的类访问使用默认,仅能本类中访问使用private。
/*
* 访问权限修饰符
*/
public class Person {
public void method1(){
System.out.println("公共方法");
}
protected void method2(){
System.out.println("受保护的方法(为了给子类使用)");
}
void method3(){
System.out.println("默认权限方法");
}
private void method4(){
System.out.println("私有方法");
}
//同一个类中
public void test(){
method1();
method2();
method3();
method4();
}
}
/*
*四种方法都可以执行
*/
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.test();
}
}
/*
* 同一个包下 子类 或者无关类
*/
public class Student {
public void test(){
Person p = new Person();
p.method1();
p.method2();
p.method3();
// p.method4();
}
}
import cn.itcast7.Person;
/*
* 不同包下的子类
*/
public class Student extends Person{
public void test(){
method1();
method2();
// method3();
// method4();
}
}
import .javahelp.Person;
/*
* 不同包下的无关类
*/
public class Test {
public static void main(String[] args) {
Person p = new Person();
p.method1();
// p.method2();
// p.method3();
// p.method4();
}
}
归纳一下:在日常开发过程中,编写的类、方法、成员变量的访问
要想仅能在本类中访问使用private修饰;
要想本包中的类都可以访问不加修饰符即可;
要想本包中的类与其他包中的子类可以访问使用protected修饰
要想所有包中的所有类都可以访问使用public修饰。
注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。
1.4.6项目分层(分包)
一个项目随着功能的增加、继承树的扩展会出现众多的Java类。这时,不仅需要将一个类中的整体功能抽取出成为独立方法,还需要将功能边界即功能所有者界定,而这就是定义类与包的过程。在定义好不同的类之后,再将相似功能的类放到同一个包中进行统一管理。
1.5代码块
1.5.1局部代码块
普通代码块就是直接定义在方法或语句中,以”{}”划定的代码区域,此时只需要关注作用域的不同即可,方法和类都是以代码块的方式划定边界的,如:
class Demo{
public static void main(String[] args) {
{
int x = 1;
System.out.println("普通代码块" + x);
}
int x = 99;
System.out.println("代码块之外" + x);
}
}
结果:
普通代码块1
代码块之外99
1.5.2构造代码块
直接定义在类中成员位置的代码块,优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作,每创建一个对象均会执行一次构造代码块。
public class Person {
private String name;
private int age;
static{
System.out.println("静态代码块执行了");
}
{
System.out.println("构造代码块执行了");
}
Person(){
System.out.println("Person无参数的构造函数执行");
}
Person(int age){
this.age = age;
System.out.println("Person(age)参数的构造函数执行");
}
}
class PersonDemo{
public static void main(String[] args) {
Person p = new Person();
Person p1 = new Person(23);
}
}
1.5.3静态代码块
静态代码块是定义在成员位置,使用static修饰的代码块。
特点:
它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。
该类不管创建多少对象,静态代码块只执行一次。
可用于给静态变量赋值,用来给类进行初始化。
public class Person {
private String name;
private int age;
//静态代码块
static{
System.out.println("静态代码块执行了");
}
}
publicclassPerson {
privateString name;
//成员代码块 又叫构造代码块 对象级别的代码块,每次创建对象都会执行一次
{
System.out.println("我是构造代码块");
}
//静态代码块 类级别的代码块,只有第一次创建对象时才运行,之后创建对象就不执行了
static{
System.out.println("静态代码块");
}
publicPerson(String name) {
super();
this.name= name;
}
publicPerson() {
super();
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name= name;
}
}
publicclassTest {
publicstaticvoidmain(String[] args) {
inta= 10;
//局部代码块限定变量作用域范围
{
System.out.println(a);
intb= 20;
System.out.println(b);
}
// System.out.println(b);
Person p= newPerson();
Person p2= newPerson("刘备");
Person p3= newPerson("刘备");
Person p4= newPerson("刘备");
Person p5= newPerson("刘备");
}
}
第2章本日学习作业
2.1知识点相关题:
2.1.1定义Person对象,包含Stringname,int age ,String addr成员属性和满参构造方法,创建show方法展示该对象的名字,年龄和家庭住址
1)使用匿名方法创建对象传参并调用show方法,并在控制台打印
2.1.2匿名内部类 补全代码
interfaceInter{
voidshow();
}
classOuter{
//补全代码
}
classOuterDemo{
publicstaticvoidmain(String[] args) {
Outer.method().show();//HelloWorld
}
答案:publicstaticInter method(){
returnnewInter(){
@Override
publicvoidshow() {
System.out.println("HelloWorld");
}
};
}
2.1.3static方法与普通方法有什么区别?
static方法在内存中只有一份,普通方法在每个被调用中维持一份拷贝,static方法属于类方法随着类的加载而加载!普通方法属于对象随着对象的创建而存在随着对象的消失而消失。
2.1.4是否可以在static环境中访问非static变量?
答:static变量在java中是属于类的,它在所有实例中的值都是一样的。当java虚拟机载入的时候会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有和任何实例关联上。
2.1.5使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
2.1.6请说出作用域public,private,protected,以及不写时的区别?
这四个作用域的可见范围如下表所示。
说明:如果在修饰的元素上面没有写任何访问修饰符,则表示空的(default)。
2.2代码题:
2.2.1请使用面向对象思想描述Person类(姓名,年龄,住址)
要求包含成员变量和成员方法,构造方法(无参,满参)
主方法中匿名调用该成员方法并打印
答案:
publicclassPerson {
privateString name;
privateintage;
privateString addr;
Person(){
}
Person(String name,intage,String addr){
this.name= name;
this.age= age;
this.addr= addr;
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name= name;
}
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age= age;
}
publicString getAddr() {
returnaddr;
}
publicvoidsetAddr(String addr) {
this.addr= addr;
}
//成员show方法
publicvoidshow(){
System.out.println("该学生信息:\n"+"姓名:"+name+"\n年龄:"+age+"\n住址:"+addr);
}
}
publicclassTest_3 {
publicstaticvoidmain(String[] args) {
newPerson("张三",12,"昌平修正大厦六楼").show();
}
}
2.2.2请使用面向对象思想描述工人类(姓名,年龄,工资,月份)
要求包含成员变量和成员方法,构造方法(无参,满参)
主方法中要求调用method(工人1,工人2)方法使用匿名对象传参;
method方法内要求计算两位工人当前月份的工资和,并返参打印
答案:
publicclassWorker{
privateString name;
privateintage;
privatedoublewage;
privateString month;
publicWorker(String name, intage, doublewage, String month) {
super();
this.name= name;
this.age= age;
this.wage= wage;
this.month= month;
}
publicWorker() {
super();
}
publicString getName() {
returnname;
}
publicvoidsetName(String name) {
this.name= name;
}
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age= age;
}
publicdoublegetWage() {
returnwage;
}
publicvoidsetWage(doublewage) {
this.wage= wage;
}
publicString getMonth() {
returnmonth;
}
publicvoidsetMonth(String month) {
this.month= month;
}
}
publicstaticvoidmain(String[] args) {
doublemethod = method(newWorker("zhangsan",12,1000,"12"),newWorker("zhangsan",12,1000,"12"));
System.out.println(method);
}
publicstaticdoublemethod(Worker w1,Worker w2){
return w1.getWage()+w2.getWage();
}
2.2.3编写一个计算器工具类,提供如下几个功能,如:编写两个数的加法、减法、乘法、除法的功能,然后进行测试
答案:
public class Calculator {
public static double addition(double d1, double d2){//加法
return d1 + d2;
}
public static double subtraction(double d1, double d2){//减法
return d1 - d2;
}
public static double multiply(double d1, double d2){//乘法
return d1 * d2;
}
public static double division(double d1, double d2) {//除法
if (d2 == 0) {
System.out.println("对不起,除数不能为0");
return -0;
}
return d1 / d2;
}
}
2.2.4编写一个手机类,提供两个属性,一个品牌,一个颜色,再提供一个打电话的功能,和一个展示手机的功能 然后进行测试
比如: 手机
属性: 品牌,颜色 --定义成私有的
方法: 电话 功能 ---定义成静态的
展示 展示手机的品牌和颜色
答案:
class Phone{
private String brand;
private String color;
public Phone(){}
public Phone(String brand,String color){
this.brand = brand;
this.color = color;
}
public static void call(){
System.out.println("打电话");
}
public void show(){
System.out.println("手机的品牌是:"+brand+",的颜色是:"+color);
}
}
public class Test {
public static void main(String[] args) {
Phone.call();//静态方法可以直接通过类名调用
Phone p = new Phone("苹果","土豪粉");
p.show();//非静态方法只能对象调用
}
}
2.2.5编写java程序,创建一个类Hello;
在类中定义一个String类型的成员变量和一个String类型的静态变量;
然后在定义两个无返回值的方法,一个定义为成员方法,另一个定义为静态方法;
最后测试它们是否能使用成员变量和静态变量。
答案:
public class Hello {
public String s1 = "aaa";
public static String s2 = "bbb";
public void method(){
System.out.println(s1);
System.out.println(s2);
}
public static void function(){
System.out.println(s1);
System.out.println(s2);
}
public static void main(String[] args) {
new Hello().method();
function();
}
}
测试结果:在静态方法function() 中,无法访问非静态成员 s1。
第十三天 面向对象-final&static&匿名对象&内部类&包&代码块【悟空教程】